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



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

例如

正则表达式注入

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

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

例如

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

你应该使用准备好的模式 - 有点像SQL中的预准备语句 - 它们保护你免受任何类型的模式/输入

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

然后只使用模式

$pattern->match($something);
这只是

读取字母,它忽略了特殊字符:

功能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']);

最新更新