MySQL: разрешить отправку кода PHP и операторов SQL в форме
Вот моя ситуация: у меня есть сайт, созданный с использованием CakePHP и MySQL. На моем сайте есть публичный форум, где участники могут публиковать примеры кода. Некоторые из этих примеров кода будут включать код PHP и MySQL.
Я понимаю, что это, вероятно, опасная вещь, чтобы разрешить, но для одного: только участники, которых я специально "одобрил", могут публиковать, и два: я считаю, что CakePHP уже использует параметризованные запросы... и хотя я уверен, что есть еще другие связанные риски, это не то, что касается моего вопроса.
Эта проблема:
В моей локальной тестовой среде я могу отправлять сообщения, содержащие операторы SQL и строки с php-кодом, например <?php phpinfo(); ?>
; но при запуске точно такого же кода на моем рабочем сервере я не могу.
Вместо того, чтобы быть перенаправленным на /posts/index
(что обычно происходит после публикации), я перенаправлен обратно на ту же страницу, на которой был раньше (/posts/edit/25
, например). Кажется, что когда я пытаюсь отправить данные формы, которые содержат "незаконные" подстроки, отправка молча завершается неудачей, и CakePHP просто отправляет меня туда, где я был раньше. (Нет быстрых сообщений от имени CakePHP.)
Мой диагноз до сих пор:
CakePHP- /www/app/tmp/logs/error.log
не показывает никаких признаков ошибки после того, как я пытаюсь опубликовать эти данные. У меня нет доступа к другим файлам журнала сервера в данный момент.
Я попытался удалить часть кода PHP из моих сообщений. Я был в состоянии представить строки как <?php echo 'Hello World'; ?>
, но если функция как phpinfo()
где-нибудь в данных формы, сообщение будет "отклонено". Наполнение моих примеров SQL неразрывными пробелами также позволило мне представить данные формы, которые содержали операторы SQL.
Учетная запись пользователя MySQL, которую использует CakePHP, немного ограничена. Я забыл, какие именно действия разрешено выполнять, но я думаю, что они просто select, insert, update, delete, create, drop
и, возможно, несколько других.
Однако я также использую phpMyAdmin локально для управления производственной базой данных, и когда я обращаюсь к ней через phpMyAdmin, я использую учетную запись администратора с максимальными привилегиями. И когда я вручную изменяю данные через phpMyAdmin, строки вроде phpinfo();
в моих примерах кода не получайте отказ!
Хотя это казалось небольшим проблеском надежды, я протестировал свой сайт с настройкой CakePHP, чтобы использовать администратора MySQL с максимальными привилегиями, но я все еще не могу отправить свои небезопасные строки через форму, обращенную к пользователю.
Мой неудовлетворительный вывод до сих пор:
Поскольку один и тот же код php ведет себя по-разному в зависимости от моей среды, я подозреваю, что это как-то связано с моей версией PHP, версией MySQL или некоторыми мерами безопасности, введенными моим системным администратором.
С моим системным администратором довольно сложно связаться, поэтому я пытаюсь понять, что может быть причиной проблемы самостоятельно.
Мой вопрос:
В чем может быть моя проблема? Есть ли параметр PHP, запрещающий "небезопасные" строки, или какой-либо другой общеизвестный параметр, который я мог бы попросить изменить моего системного администратора? Или, может быть, это настройка MySQL? (Трудно сказать, учитывая странную способность моего phpMyAdmin делать то, чего не может Cake.) Или как я могу диагностировать эту проблему? (Самостоятельно; или какой вопрос я должен задать своему сисадмину?)
Дополнительные данные, которые могут быть полезны:
Итак, это моя локальная среда тестирования в соответствии с phpMyAdmin:
Database server
---------------
Server: Local codeTech Server (Localhost via UNIX socket)
Server type: MySQL
Server version: 5.5.34-0ubuntu0.13.04.1 - (Ubuntu)
Protocol version: 10
User: root@localhost
Server charset: UTF-8 Unicode (utf8)
Web server
----------
Apache/2.2.22 (Ubuntu)
Database client version: libmysql - 5.5.34
PHP extension: mysqli
А вот среда моего производственного сервера:
Database server
---------------
Server: Sam's Remote Server (XXX.XXX.XXX.XXX via TCP/IP)
Server type: MySQL
Server version: 5.1.70-cll - MySQL Community Server (GPL)
Protocol version: 10
User: XXX@XXX.com
Server charset: UTF-8 Unicode (utf8)
Web server
----------
Apache/2.2.22 (Ubuntu)
Database client version: libmysql - 5.5.34
PHP extension: mysqli
Я также хотел бы опубликовать некоторые части phpinfo для обоих серверов, если это поможет.
Несколько вещей, которые я нашел в phpinfo, которые могут помочь в диагностике проблемы:
Местный:
- Версия PHP 5.4.9-4ubuntu2.3
- Zend Engine v2.4.0
Производство:
- Версия PHP 5.3.26
- Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
- с загрузчиком PHP ionCube v4.2.2, Copyright (c) 2002-2012, авторством ionCube Ltd., и
- с Zend Guard Loader v3.3, Copyright (c) 1998-2010, Zend Technologies
- с Suhosin v0.9.33, Copyright (c) 2007-2012, SektionEins GmbH
- Этот сервер защищен с помощью Suhosin Extension 0.9.33
Я подозреваю, что это расширение "Suhosin" может иметь к этому отношение, хотя я не совсем уверен, как...
Их страница ( http://www.hardened-php.net/suhosin/a_feature_list.html) предполагает, что может быть несколько "защит":
- Прозрачная защита открытых страниц phpinfo()
- ЭКСПЕРИМЕНТАЛЬНАЯ защита пользователей базы данных SQL
- Особенности фильтрации
- Настраиваемое действие при нарушении
- просто заблокировать нарушающие переменные
- отправить код ответа HTTP
- перенаправить браузер
На самом деле, это звучит очень подозрительно! Мне, вероятно, придется поговорить с моим сисадмином об этом; к сожалению, документация по Suhosin слишком скудна, чтобы я знал, действительно ли это виновник, поэтому я пока не хочу исключать все остальное.
Тем не менее, это может быть важно. Это настройки для Suhosin; они не имеют особого смысла для меня, но, возможно, некоторые мастера PHP могут выделить некоторые важные ключевые слова:
Directive Local Value Master Value
suhosin.apc_bug_workaround Off Off
suhosin.cookie.checkraddr 0 0
suhosin.cookie.cryptdocroot On On
suhosin.cookie.cryptkey [ protected ] [ protected ]
suhosin.cookie.cryptlist no value no value
suhosin.cookie.cryptraddr 0 0
suhosin.cookie.cryptua On On
suhosin.cookie.disallow_nul 1 1
suhosin.cookie.disallow_ws 1 1
suhosin.cookie.encrypt Off Off
suhosin.cookie.max_array_depth 50 50
suhosin.cookie.max_array_index_length 64 64
suhosin.cookie.max_name_length 64 64
suhosin.cookie.max_totalname_length 256 256
suhosin.cookie.max_value_length 10000 10000
suhosin.cookie.max_vars 100 100
suhosin.cookie.plainlist no value no value
suhosin.coredump Off Off
suhosin.disable.display_errors Off Off
suhosin.executor.allow_symlink Off Off
suhosin.executor.disable_emodifier Off Off
suhosin.executor.disable_eval Off Off
suhosin.executor.eval.blacklist no value no value
suhosin.executor.eval.whitelist no value no value
suhosin.executor.func.blacklist no value no value
suhosin.executor.func.whitelist no value no value
suhosin.executor.include.allow_writable_files On On
suhosin.executor.include.blacklist no value no value
suhosin.executor.include.max_traversal 0 0
suhosin.executor.include.whitelist no value no value
suhosin.executor.max_depth 0 0
suhosin.filter.action no value no value
suhosin.get.disallow_nul 1 1
suhosin.get.disallow_ws 0 0
suhosin.get.max_array_depth 50 50
suhosin.get.max_array_index_length 64 64
suhosin.get.max_name_length 64 64
suhosin.get.max_totalname_length 256 256
suhosin.get.max_value_length 512 512
suhosin.get.max_vars 100 100
suhosin.log.file 0 0
suhosin.log.file.name no value no value
suhosin.log.phpscript 0 0
suhosin.log.phpscript.is_safe Off Off
suhosin.log.phpscript.name no value no value
suhosin.log.sapi 0 0
suhosin.log.script 0 0
suhosin.log.script.name no value no value
suhosin.log.syslog no value no value
suhosin.log.syslog.facility no value no value
suhosin.log.syslog.priority no value no value
suhosin.log.use-x-forwarded-for Off Off
suhosin.mail.protect 0 0
suhosin.memory_limit 0 0
suhosin.mt_srand.ignore On On
suhosin.multiheader Off Off
suhosin.perdir 0 0
suhosin.post.disallow_nul 1 1
suhosin.post.disallow_ws 0 0
suhosin.post.max_array_depth 50 50
suhosin.post.max_array_index_length 64 64
suhosin.post.max_name_length 64 64
suhosin.post.max_totalname_length 256 256
suhosin.post.max_value_length 1000000 1000000
suhosin.post.max_vars 1000 1000
suhosin.protectkey On On
suhosin.request.disallow_nul 1 1
suhosin.request.disallow_ws 0 0
suhosin.request.max_array_depth 50 50
suhosin.request.max_array_index_length 64 64
suhosin.request.max_totalname_length 256 256
suhosin.request.max_value_length 1000000 1000000
suhosin.request.max_varname_length 64 64
suhosin.request.max_vars 1000 1000
suhosin.server.encode On On
suhosin.server.strip On On
suhosin.session.checkraddr 0 0
suhosin.session.cryptdocroot On On
suhosin.session.cryptkey [ protected ] [ protected ]
suhosin.session.cryptraddr 0 0
suhosin.session.cryptua Off Off
suhosin.session.encrypt On On
suhosin.session.max_id_length 128 128
suhosin.simulation Off Off
suhosin.sql.bailout_on_error Off Off
suhosin.sql.comment 0 0
suhosin.sql.multiselect 0 0
suhosin.sql.opencomment 0 0
suhosin.sql.union 0 0
suhosin.sql.user_postfix no value no value
suhosin.sql.user_prefix no value no value
suhosin.srand.ignore On On
suhosin.stealth On On
suhosin.upload.disallow_binary 0 0
suhosin.upload.disallow_elf 1 1
suhosin.upload.max_uploads 25 25
suhosin.upload.remove_binary 0 0
suhosin.upload.verification_script no value no value
Заранее спасибо всем, кто может помочь мне решить эту проблему. И поздравляю с чтением этого далеко!
1 ответ
Что касается различий в конфигурации PHP между средами, вам следует сравнить результаты выполнения phpinfo() в средах разработки и разработки. В зависимости от версии, вы можете активировать magic_quotes (BAD IDEA!) Или другие конфигурации, влияющие на ваш код, просто сравните одну за другой, и вы получите различия, которые вы должны устранить почти во всех случаях (кроме display_errors и еще нескольких). что должно быть разным в производстве и разработке).
О MySQL: вам нужно иметь двух разных пользователей, которых вы будете использовать в зависимости от запроса: 1) Один для чтения, только с правами SELECT. 2) Другой для записи, с SELECT, UPDATE, DELETE, INSERT (обычно CREATE и DROP НЕ нужны на веб-сайте и находятся в центре возможных угроз безопасности)
Обычно вы будете использовать пользователя "чтение" и просто переключитесь на "запись" для конкретных запросов, которые нужно написать.
Я не думаю, что ваша проблема в PHP (но проверьте phpinfo) и положительно не в MySQL, моя ставка была бы на плагин Suhosin и, возможно, конфигурацию в CakePHP, которая меняется в зависимости от вашей среды, но с учетом данной информации Я не могу сказать больше.
Я никогда не слышал о Сухосине, и если бы я был тобой, моим первым шагом было бы отключить его. Использование функций связывания PDO и фильтров php будет безопасным вариантом без дополнительных плагинов.