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

问题描述 投票:3回答:4

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

e.g

正则表达式注入

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

或者在这里:http://hauser-wenz.de/playground/papers/RegExInjection.pdf

一般来说,sql注射有很多指南和提示可以遵循,但不能找到很多关于正则表达注射

php regex code-injection
4个回答
0
投票

简单的回答:改用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;

0
投票

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

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

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

EG

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

0
投票

这只是读取字母,而忽略了特殊字符:

function sanitize_letter($ var){

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

        return $var;
     }

这只是读取数字,而忽略了特殊字符:

function sanitize_number($ var){

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

例如,如何使用上述功能,

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


0
投票

您应该使用Prepared Patterns - 类似于SQL中的预处理语句 - 它们可以保护您免受任何类型的模式/输入

$unsafe = $_GET['value'];
Pattern::prepare(["(start|begin)", [$unsafe], "(end|finish)+"]);
© www.soinside.com 2019 - 2024. All rights reserved.