MySQL:允许通过表单提交PHP代码和SQL语句

时间:2013-10-30 06:23:40

标签: php mysql sql cakephp suhosin

以下是我的情况:我有一个使用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中发现了一些可能有助于诊断问题的事情:

本地:

  • PHP版本5.4.9-4ubuntu2.3
  • Zend Engine v2.4.0

生产:

  • PHP Version 5.3.26
  • Zend Engine v2.3.0,版权所有(c)1998-2013 Zend Technologies
    • 使用ionCube PHP Loader v4.2.2,版权所有(c)2002-2012,by ionCube Ltd.,和
    • 使用Zend Technologies
    • 的Zend Guard Loader v3.3,版权所有(c)1998-2010
    • 与Suhosin v0.9.33,版权所有(c)2007-2012,由SektionEins GmbH提供
  • 此服务器受Suhosin Extension 0.9.33
  • 保护

我怀疑这个&#34; Suhosin&#34;扩展可能与它有关,虽然我不太确定如何...

他们的网页(http://www.hardened-php.net/suhosin/a_feature_list.html)表明可能会有一些&#34;保护&#34;到位:

  • 透明保护开放的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 个答案:

答案 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 funcionsphp filters将是一个安全选项,无需额外的插件。