Suhosin 禁用 eval 导致 phpMyadmin 冲突一例
作者:郑凯
[url=http://www.hardened-php.net/suhosin]Suhosin[/url] 是个很强的 PHP 安全模块,但一直没怎么实际操练过,今天就露怯了。
现象很古怪,新下的 phpMyAdmin 默认能看,一配 [incode]config.inc.php[/incode] 就报错,哪怕只是 touch 个空文件,最费解的是除了 nginx 报 500 错误外,在 [incode]error_log[/incode] 里没有任何显示。
折腾了半天,突然想到能出这种报错的也许是个特殊模块而不是 PHP 自身,最终定位到是因为在配置里打开了 [incode]suhosin.executor.disable_eval = on[/incode],而 phpMyAdmin 里有 n 多 [incode]eval[/incode]
这个问题浪费时间的地方在于,Suhosin 的日志是不输出到 PHP 的 [incode]error_log[/incode] 的(很好理解,如果被攻击,[incode]error_log[/incode] 也自身难保),而是 syslog,在 Ubuntu 上如果所有软件都是从 apt 装的话,错误信息会留在 [incode]/var/log/syslog[/incode]。但搜到的文章里看到还可能在 [incode]/var/log/messages[/incode]。不知道在 Ubuntu 上装了 syslog-ng 后会怎样,不过肯定就这两个地方跑不掉了。
总之以后多了个经验,如果出了 500 后 PHP [incode]error_log[/incode] 看不到问题,那就去看看 syslog
对于 phpMyAdmin,[url=http://www.php.net/manual/en/ini.sections.php]如果是 PHP 5.3+ 且 CGI/FastCGI 方式运行,可以这么改 php.ini[/url],让 phpMyAdmin 可以破例使用 [incode]eval[/incode]
[code]
[PATH=/var/www/phpmyadmin/]
suhosin.executor.disable_eval = off
[/code]
其实 Suhosin 的那么多选项,哪怕不用,只是看一遍说明也会大有收获,推荐没用过的都看一下