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 будет безопасным вариантом без дополнительных плагинов.

Другие вопросы по тегам