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

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扩展的再次更新吧。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接作者。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

 【加群】加入QQ群【175454274】和大家一起讨论这个问题

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

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

本站的忠实读者小伙伴,正在阅读下面这些文章: