2

这是我的情况:我有一个使用 CakePHP 和 MySQL 构建的网站。我的网站有一个公共论坛,成员可以在其中发布代码示例。其中一些代码示例将包含 PHP 和 MySQL 代码。

我知道这可能是一件危险的事情,但对于一个:只有我特别“批准”的成员可以发布,第二个:我相信 CakePHP 已经使用参数化查询......虽然我确信仍然有涉及的其他风险,这不是我的问题所关心的。

问题:

在我的本地测试环境中,我可以提交包含 SQL 语句和带有 php 代码的字符串的帖子,例如<?php phpinfo(); ?>;但是,在我的生产服务器上运行完全相同的代码时,我不能。

我没有被重定向到/posts/index(通常在发布后发生的情况),而是被重定向回我之前所在的同一页面(/posts/edit/25例如)。似乎当我尝试提交包含“非法”子字符串的表单数据时,提交静默失败,CakePHP 只是将我发送回原来的位置。(没有代表 CakePHP 的 flash 消息。)

到目前为止我的诊断:

/www/app/tmp/logs/error.log在我尝试发布此数据后,CakePHP没有显示任何错误迹象。我目前无权访问任何其他服务器日志文件。

我尝试从我的帖子中删除一些 php 代码。我能够提交类似 的字符串<?php echo 'Hello World'; ?>,但如果phpinfo()表单数据中的任何地方都有类似的函数,则帖子将被“拒绝”。用不间断空格填充我的 SQL 示例也使我能够提交包含 SQL 语句的表单数据。

CakePHP 使用的 MySQL 用户帐户有一点限制。我完全忘记了它允许执行哪些操作,但我认为它们只是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 引擎 v2.4.0

生产:

  • PHP 版本 5.3.26
  • Zend Engine v2.3.0,版权所有 (c) 1998-2013 Zend Technologies
    • ionCube PHP Loader v4.2.2,版权所有 (c) 2002-2012,由 ionCube Ltd. 和
    • Zend Guard Loader v3.3,版权所有 (c) 1998-2010,由 Zend Technologies 提供
    • 使用 Suhosin v0.9.33,版权所有 (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

提前感谢任何可以帮助我解决此问题的人。恭喜你读到这里!

4

1 回答 1

0

关于环境之间的 PHP 配置差异,您应该比较开发环境和生产环境中执行 phpinfo() 的结果。根据版本,您可以激活magic_quotes(坏主意!)或其他影响您的代码的配置,只需一一比较,您就会得到差异,您应该在几乎所有情况下消除差异(除了 display_errors 和更多这需要在生产和开发中有所不同)。

关于 MySQL:您需要有两个不同的用户,您将根据查询使用:1)一个用于读取,只有 SELECT 权限 2)另一个用于写入,具有 SELECT、UPDATE、DELETE、INSERT(通常是 CREATE 和DROP 在网站中不是必需的,并且是可能的安全漏洞的焦点)

通常,您将使用“阅读”用户,而您只需将需要写入的特定查询更改为“写入”。

我不认为您的问题出在 PHP 中(但检查 phpinfo)并且肯定不在 MySQL 中,我敢打赌 Suhosin 插件,也许是 CakePHP 中的一个配置,它会根据您的环境而变化,但使用给定的信息,我不能再说了。

我从未听说过 Suhosin,如果我是你,我的第一步就是停用它。使用PDO 的绑定函数php 过滤器将是一个安全的选择,无需额外的插件。

于 2013-11-06T22:42:41.680 回答