微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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秒)

原文地址:https://www.jb51.cc/php/140234.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐