php 如何禁用 eval 函数?disable_functions 使用范例
发布于 作者:苏南大叔 来源:程序如此灵动~
php作为世界上最好的语言,很容易写出相当牛x的功能,比如一句话木马,所有的php一句话木马都有个核心函数eval。正常情况下来说,一般的php代码,并不会使用到eval函数。所以,出于安全角度考虑,禁用掉php的eval函数,是非常有必要的。

本文测试环境:mac/php72。
php.ini的disable_functions
在php.ini中,有个disable_functions项目,可以用于设置要禁用的php函数。但是却不能禁用eval函数。据说,是因为eval并不是php的函数,而是zend的函数。这个结论听起来是比较玄乎。
错误的配置示意:
; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names.
; http://php.net/disable-functions
disable_functions = eval正常的配置示意(没有eval的原因是:写上也不生效):
disable_functions = passthru,exec,system,chroot,chgrp,chown,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,shell_execsuhosin扩展
迄今为止,这个韩国人出品的suhosin方案是最出名的了。但是,没有跟上时代的步伐,截至到发稿,仅仅支持到php7.1。而苏南大叔比较喜欢的php72和目前最新版本的php73,都是不支持的。所以,下面列出相关github源码地址,大家自行尝试吧。编译的方案是非常传统的php扩展编译方式,没有太特别的。
- 官方网站:https://suhosin.org/stories/download.html
- php5系列扩展:https://github.com/sektioneins/suhosin
- php7系列扩展:https://github.com/sektioneins/suhosin7

编译方式:
phpize
./configure
make && make install使用方式:
extension = suhosin.so
suhosin.executor.disable_eval = on更多的配置项目见这里:
更详细的编译过程,这里有介绍:
因为suhosin目前最高支持到php7.1。所以,目前来说,可能suhosin的用途也不是太大,拭目以待。suhosin在php72下面进行编译时会报错,截图如下:
./php_suhosin7.h:27:2: error: Suhosin7 works with PHP 7.0 and 7.1 only! Looking for Suhosin for PHP 5.x? Take a look at https://www.suhosin.org/
#error Suhosin7 works with PHP 7.0 and 7.1 only! Looking for Suhosin for PHP 5.x? Take a look at https://www.suhosin.org/
diseval扩展
在suhosin不支持最新的php72和php73的前提下,苏南大叔在github上面又找到了这个扩展diseval。实验了一下diseval,居然可以使用。但是,官方说明里面说,在php7下面是不稳定的。截至发稿,其最新版本号为0.1。diseval源码地址是:

diseval编译方式和普通的php的源码编译方式,稍稍有所不同。不同的地方就是:要先进source/目录再编译,而不是像其他扩展源码一样,在根目录下面直接编译。
cd source/
phpize
./configure
make && make install
php.ini是:
extension = diseval.so效果是:
当然,根据官方说明。这个diseval扩展,不光禁用了eval,还关联影响了下面几个函数:create_function/mb_ereg_replace/assert,请知晓。
苏南大叔看了一下diseval的扩展源码,发现这个禁用eval的方法,似乎非常简单。核心代码就这个,就仅仅只有88行代码而已,真心是出乎意料啊:
总结
虽然有禁用eval函数的需求,但是也不是非禁用不可。鉴于目前禁用eval的方法方案都不是太完美,所以,大家可以期待suhosin扩展的再次更新吧。