脚本宝典收集整理的这篇文章主要介绍了php – 有人可以解释/ e regex修饰符吗?,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我所理解的是,该修饰符可以被操纵以给某人有机会执行PHP代码(例如,PReg_replace()).我看到下面的例子描述一个安全漏洞,但没有解释,所以有人可以解释一下如何在下面的代码中调用PHPinfo()?
$input = htMLentITies(""); if (strpos($input,'bla')) { echo preg_replace("/" .$input ."/",$input ."<img src='".$input.".png'>","bla"); }
e做了什么,以一个例子…
e修饰符是一种不推荐的regex修饰符,它允许您在正则表达式中使用PHP代码.这意味着无论你解析什么都将被评估为程序的一部分.
例如,我们可以使用这样的东西:
$input = "Bet you want a BMW."; echo preg_replace("/([a-z]*)/e","strtoupPEr('\\1')",$input);
这将输出BET你想要宝马.
没有e修饰符,我们得到这个非常不同的输出:
strtoupper('')Bstrtoupper('et')strtoupper('') strtoupper('you')strtoupper('') strtoupper('want')strtoupper('') strtoupper('a')strtoupper('') strtoupper('')Bstrtoupper('')Mstrtoupper('')Wstrtoupper('').strtoupper('')
潜在的安全问题
e修饰符是deprecated for security reasons.这是一个可以很容易地用e执行的问题的例子:
$password = 'secret'; ... $input = $_GET['input']; echo preg_replace('|^(.*)$|e','"\1"',$input);
如果我将输入提交为“$password”,则此函数的输出将为(demo).因此,我很容易访问会话变量,所有变量都在后端使用,甚至通过这个简单的部分,对应用程序(eval(‘cat / etc / passwd’);?)进行更深层次的控制编写代码不好
像同样不推荐的MysqL库一样,这并不意味着你不能编写不使用e的漏洞的代码,只是这样做更困难.
你应该用什么…
您应该在几乎所有考虑使用e修饰符的地方使用preg_replace_callback.在这种情况下,代码绝对不简单,但不要让愚弄你 – 它的速度是两倍:
$input = "Bet you want a BMW."; echo preg_replace_callback( "/([a-z]*)/",function($matches){ foreach($matches as $match){ return strtoupper($match); } },$input );
在表演方面,没有理由使用e …
与MysqL库不同(为了安全起见,这些库也被弃用),e并不比大多数操作的替代方案快.对于给出的示例,速度是两倍:preg_replace_callback(50,000次操作为0.14秒)vs @L_304_28@(50,000次操作为0.32秒)
以上是脚本宝典为你收集整理的php – 有人可以解释/ e regex修饰符吗?全部内容,希望文章能够帮你解决php – 有人可以解释/ e regex修饰符吗?所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。