我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

php作为世界上最好的语言,很容易写出相当牛x的功能,比如一句话木马,所有的php一句话木马都有个核心函数eval。正常情况下来说,一般的php代码,并不会使用到eval函数。所以,出于安全角度考虑,禁用掉phpeval函数,是非常有必要的。

苏南大叔:php 如何禁用 eval 函数?disable_functions 使用范例 - php-disable
php 如何禁用 eval 函数?disable_functions 使用范例(图6-1)

本文测试环境:mac/php72

php.inidisable_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_exec

suhosin扩展

迄今为止,这个韩国人出品的suhosin方案是最出名的了。但是,没有跟上时代的步伐,截至到发稿,仅仅支持到php7.1。而苏南大叔比较喜欢的php72和目前最新版本的php73,都是不支持的。所以,下面列出相关github源码地址,大家自行尝试吧。编译的方案是非常传统的php扩展编译方式,没有太特别的。

苏南大叔:php 如何禁用 eval 函数?disable_functions 使用范例 - 01-suhosin-www
php 如何禁用 eval 函数?disable_functions 使用范例(图6-2)

编译方式:

phpize
./configure
make && make install

使用方式:

extension = suhosin.so
suhosin.executor.disable_eval = on

更多的配置项目见这里:

更详细的编译过程,这里有介绍:

因为suhosin目前最高支持到php7.1。所以,目前来说,可能suhosin的用途也不是太大,拭目以待。suhosinphp72下面进行编译时会报错,截图如下:

./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/

苏南大叔:php 如何禁用 eval 函数?disable_functions 使用范例 - 02-suhosin-fail
php 如何禁用 eval 函数?disable_functions 使用范例(图6-3)

diseval扩展

suhosin不支持最新的php72php73的前提下,苏南大叔在github上面又找到了这个扩展diseval。实验了一下diseval,居然可以使用。但是,官方说明里面说,在php7下面是不稳定的。截至发稿,其最新版本号为0.1diseval源码地址是:

苏南大叔:php 如何禁用 eval 函数?disable_functions 使用范例 - 01-diseval-github
php 如何禁用 eval 函数?disable_functions 使用范例(图6-4)

diseval编译方式和普通的php的源码编译方式,稍稍有所不同。不同的地方就是:要先进source/目录再编译,而不是像其他扩展源码一样,在根目录下面直接编译。

cd source/
phpize
./configure
make && make install

苏南大叔:php 如何禁用 eval 函数?disable_functions 使用范例 - 02-make
php 如何禁用 eval 函数?disable_functions 使用范例(图6-5)

php.ini是:

extension = diseval.so

效果是:

苏南大叔:php 如何禁用 eval 函数?disable_functions 使用范例 - 03-效果图
php 如何禁用 eval 函数?disable_functions 使用范例(图6-6)

当然,根据官方说明。这个diseval扩展,不光禁用了eval,还关联影响了下面几个函数:create_function/mb_ereg_replace/assert,请知晓。

苏南大叔看了一下diseval的扩展源码,发现这个禁用eval的方法,似乎非常简单。核心代码就这个,就仅仅只有88行代码而已,真心是出乎意料啊:

总结

虽然有禁用eval函数的需求,但是也不是非禁用不可。鉴于目前禁用eval的方法方案都不是太完美,所以,大家可以期待suhosin扩展的再次更新吧。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    php扩展