如何防范PHP中的正则表达式注入?为PHP的所有正则表达式函数清理输入的一般规则是什么?

时间:2014-01-14 13:08:24

标签: php regex code-injection

寻找关于我应该在正则表达式中逃避哪些字符的提示,以防止漏洞利用。

e.g

  

正则表达式注入

     

PHP中的PCRE函数preg_replace()函数允许“e”   (PREG_REPLACE_EVAL)修饰符,表示替换字符串   在替换后被评估为PHP。中使用的不受信任的输入   因此,替换字符串可以注入要执行的PHP代码。

或此处:http://hauser-wenz.de/playground/papers/RegExInjection.pdf

一般情况下,对于sql注射,有很多指南和提示可以遵循,但无法找到有关正则表达式注射的更多信息

4 个答案:

答案 0 :(得分:1)

简单回答:改为使用preg_replace_callback()(不依赖于eval用户代码)。这就是PHP 5.5建议您在使用/e时所做的事情。

$str = 'CAPS';
$str = preg_replace_callback('/[A-Z]/', function($match) { return strtolower($match[0]); }, $str);
echo $str;

答案 1 :(得分:1)

使用preg_quote引用正则表达式字符:

http://php.net/manual/en/function.preg-quote.php

您通常希望将分隔符添加为第二个参数。

e.g。

$q = $_GET['q'];
$q = preg_quote($q, "/");
$replaced = preg_replace("/" . $q . "/", "42", "The quick brown fox jumps over the lazy dog");

答案 2 :(得分:0)

这仅读取字母,并且忽略特殊字符:

函数sanitize_letter($ var)          {

        $var= preg_replace("/[-[\]{}()*+?.,\\^<>&!@#$%^&\/':\";*()_+=$|#]/","",$var);

        return $var;
     }

这仅读取数字,并且忽略特殊字符:

函数sanitize_number($ var)          {

        $var= preg_replace("/[^0-9]/","",$var);
        return $var;
     }

例如,如何使用以上功能

$ pure_id = sanitize_number($ _ GET ['id']);

答案 3 :(得分:0)

您应该使用Prepared Patterns-SQL中类似准备好的语句-它们可以保护您免受任何模式/输入的侵害

$unsafe = $_GET['value'];
Pattern::prepare(["(start|begin)", [$unsafe], "(end|finish)+"]);