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

rryofs0p  于 2023-04-04  发布在  PHP
关注(0)|答案(4)|浏览(125)

寻找关于在正则表达式中应该转义哪些字符以防止漏洞利用的提示。
例如
正则表达式注入
PHP中的PCRE函数preg_replace()函数允许使用“e”(PREG_REPLACE_EVAL)修饰符,这意味着替换字符串在替换后将被评估为PHP。因此,替换字符串中使用的不可信输入可能会插入要执行的PHP代码。
或者在这里:http://hauser-wenz.de/playground/papers/RegExInjection.pdf
一般来说,对于sql注入,有很多指南和技巧可以遵循,但找不到太多关于regex注入的信息

wwtsj6pe

wwtsj6pe1#

答案很简单:使用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;
6ojccjat

6ojccjat2#

使用preg_quote引用正则表达式字符:
http://php.net/manual/en/function.preg-quote.php
您通常希望添加分隔符作为第二个参数。
例如

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

quhf5bfb3#

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

<?php
$unsafe = $_GET['value'];
$pattern = Pattern::inject("(start|begin)@(end|finish)+", [$unsafe]]);

然后用这个模式

$pattern->match($something);
fkvaft9z

fkvaft9z4#

只读取字母,忽略特殊字符:

public void run($var){

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

        return $var;
     }

这只读取数字,忽略特殊字符:
public void run($var){

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

例如如何使用上述功能,
$pure_id=sanitize_number($_GET['id']);

相关问题