这是我的情况:我有一个使用 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
提前感谢任何可以帮助我解决此问题的人。恭喜你读到这里!