php – 有人可以解释/ e regex修饰符吗?

前端之家收集整理的这篇文章主要介绍了php – 有人可以解释/ e regex修饰符吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在提高我对 HTML,PHP,JavaScript等安全漏洞的了解.
几个小时前,我以正则表达式偶然碰到/ e修饰符,我仍然不知道它是如何工作的.我已经看了文档,但这并没有真正的帮助.

我所理解的是,该修饰符可以被操纵以给某人有机会执行PHP代码(例如,preg_replace()).我看到下面的例子描述一个安全漏洞,但没有解释,所以有人可以解释一下如何在下面的代码调用PHPinfo()?

$input = htmlentities("");
if (strpos($input,'bla'))
{
   echo preg_replace("/" .$input ."/",$input ."<img src='".$input.".png'>","bla");
}
PHP中的e Regex修饰符,具有漏洞和漏洞备择方案

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 e modifier(50,000次操作为0.32秒)

猜你在找的PHP相关文章