以下是我的情况:我有一个使用CakePHP和MySQL构建的网站。我的网站有一个公共论坛,会员可以发布代码示例。其中一些代码示例将包含PHP和MySQL代码。
我知道这可能是一件危险的事情,但是对于一个人来说:只有我特别认可的会员才能批准"可能会发布,有两个:我相信CakePHP已经使用参数化查询......虽然我确定还有其他风险,但这不是我的问题所关注的。
问题:
在我的本地测试环境中,我可以使用PHP代码(如<?php phpinfo(); ?>
)提交包含SQL语句和字符串的帖子;但是,当我在生产服务器上运行完全相同的代码时,我无法做到。
我没有被重定向到/posts/index
(这是发布后通常会发生的事情),而是重定向回到我以前的同一页面(例如/posts/edit/25
)。当我尝试提交包含&#34;非法&#34;的表单数据时,似乎子串,提交默默地失败,CakePHP只是把我送回原来的地方。 (代表CakePHP没有闪存消息。)
到目前为止我的诊断:
在尝试发布此数据后,CakePHP&#39; s /www/app/tmp/logs/error.log
未显示任何错误迹象。我目前无法访问任何其他服务器日志文件。
我尝试从我的帖子中删除一些PHP代码。我 能够提交<?php echo 'Hello World'; ?>
之类的字符串,但如果像phpinfo()
这样的函数在表单数据中的任何位置,则帖子会被拒绝&#34;。用非破坏空格填充我的SQL示例也使我可以提交包含SQL语句的表单数据。
CakePHP使用的MySQL用户帐户有点受限制。我忘记了它允许执行哪些操作,但我认为它们只是select, insert, update, delete, create, drop
,也许还有其他一些。
但是,我也在本地使用phpMyAdmin来管理生产数据库,当我通过phpMyAdmin访问它时,我正在使用具有最大权限的管理员帐户。当我通过phpMyAdmin手动更改数据时,我的代码示例中的phpinfo();
字符串不会被拒绝!
即使这看起来像是一丝希望,我已经使用CakePHP设置测试我的网站以使用具有最大权限的MySQL管理员用户,但我仍然无法通过面向用户的表单提交我的不安全字符串
到目前为止我的不满意结论:
由于完全相同的PHP代码根据我的环境表现不同,我怀疑这与我的PHP版本,MySQL版本或我的系统管理员已经实施的一些安全措施有关。
我的系统管理员很难与之联系,所以我试图找出可能导致问题的原因。
我的问题可能是什么?是否有PHP设置禁止&#34;不安全&#34;字符串,或者我可以请求我的系统管理员更改的一些其他常见设置?或许这可能是MySQL设置? (很难说,鉴于我的phpMyAdmin奇怪的能力,做蛋糕无法做到的事情。)或者我怎么去诊断这个问题? (我自己;或者,我应该问我的系统管理员有什么问题?)
可能有用的更多数据:
所以,根据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中发现了一些可能有助于诊断问题的事情:
本地:
生产:
我怀疑这个&#34; Suhosin&#34;扩展可能与它有关,虽然我不太确定如何...
他们的网页(http://www.hardened-php.net/suhosin/a_feature_list.html)表明可能会有一些&#34;保护&#34;到位:
事实上,这听起来非常可疑!我可能要和我的系统管理员谈谈这件事;不幸的是,关于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
提前感谢任何可以帮我排除故障的人。恭喜阅读这篇文章!
答案 0 :(得分:0)
关于环境之间的PHP配置差异,您应该比较devel和生产环境中phpinfo()执行的结果。根据版本的不同,您可以激活magic_quotes(BAD IDEA!)或其他影响您代码的配置,只需逐一比较,您就会得到差异,几乎在所有情况下都应该消除这些差异(display_errors除外)在生产和发展方面需要有所不同。)
关于MySQL:您需要拥有两个不同的用户,您将根据查询使用这些用户: 1)一个用于阅读,只有SELECT权限 2)另一个用于写入,使用SELECT,UPDATE,DELETE,INSERT(通常,CREATE和DROP在网站中不是必需的,并且是可能的安全漏洞的焦点)
通常情况下,您将使用“阅读”用户,只需更改为“写入”以查找需要编写的特定查询。
我不认为你的问题是在PHP中(但是检查phpinfo)并且肯定不在MySQL中,我的赌注是Suhosin插件,也许,CakePHP中的配置会根据您的环境而改变,但是给定的信息,我不能再说了。
我从未听说过Suhosin,如果我是你,我的第一步就是停用它。使用PDO's binding funcions和php filters将是一个安全选项,无需额外的插件。