寻找关于我应该在正则表达式中逃避哪些字符的提示,以防止漏洞利用。
e.g
正则表达式注入
PHP中的PCRE函数preg_replace()函数允许使用“e”(PREG_REPLACE_EVAL)修饰符,这意味着替换字符串将在替换后被评估为PHP。因此,替换字符串中使用的不受信任的输入可以注入要执行的PHP代码。
或者在这里:http://hauser-wenz.de/playground/papers/RegExInjection.pdf
一般来说,sql注射有很多指南和提示可以遵循,但不能找到很多关于正则表达注射
简单的回答:改用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;
使用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");
这只是读取字母,而忽略了特殊字符:
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']);
您应该使用Prepared Patterns - 类似于SQL中的预处理语句 - 它们可以保护您免受任何类型的模式/输入
$unsafe = $_GET['value'];
Pattern::prepare(["(start|begin)", [$unsafe], "(end|finish)+"]);