我正在提高我对
HTML,PHP,JavaScript等安全漏洞的了解.
几个小时前,我以正则表达式偶然碰到/ e修饰符,我仍然不知道它是如何工作的.我已经看了文档,但这并没有真正的帮助.
几个小时前,我以正则表达式偶然碰到/ 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秒)