PHP中用户提供的正则表达式的清理

时间:2010-03-03 13:11:44

标签: php regex sanitization

我想创建一个网站,用户可以在其中测试正则表达式(已经存在很多...例如这个:http://www.pagecolumn.com/tool/pregtest.htm)。基本上,用户提供正则表达式和一些示例文本,正则表达式评估的结果将被吐回。

我想用PHP“preg_ *”函数评估服务器端的正则表达式。有没有办法消毒提供的正则表达式?我应该关注哪些安全漏洞?

5 个答案:

答案 0 :(得分:3)

我认为PHP本身会检查正则表达式。 这是我制作的示例脚本:

// check for input, and set max size of input
if(@!empty($_POST['regex'])
    && @!empty($_POST['text'])
    && strlen($_POST['regex'])<1000
    && strlen($_POST['text'])<2000
    ){
    // set script timeout in case something goes wrong (SAFE MODE must be OFF)
    $old_time=ini_get('max_execution_time');
    if(!set_time_limit(1)) die('SAFE MODE MUST BE OFF'); // 1 sec is more then enough

    // trim input, it's up to you to do more checks
    $regex=trim($_POST['regex']);
    // don't trim the text, it can be needed
    $input=$_POST['text'];
    // escape slashes
    $regex=preg_replace('/([\\/]+)?//', '\/', $regex);

    // go for the regex
    if(false===$matched=@preg_match('/'.$regex.'/', $input, $matches)){
            // regex was tested, show results
            echo 'Matches: '.$matched.'<br />';
            if($matched>0){
                    echo 'matches: <br />';
                    foreach($matches as $i =>  $match){
                            echo $i.' = '.$match.'<br />';
                }
            }
    }
    // set back original execution time
    set_time_limit($old_time);
}

无论如何,永远不要在用户提交的字符串中使用eval()

此外,您可以进行一些简单的简约消毒,但这取决于您。 ;)

答案 1 :(得分:1)

如果您允许用户提交的preg_replace 值确保,则不允许使用e flag!不这样做可能会让恶意用户删除整个网站,或者更糟。

否则,可能发生的最糟糕的事情是其他答案已经指出的。设置一个低脚本超时,也许您甚至应该确保该页面每分钟只能调用X次。

答案 2 :(得分:0)

我能想到的唯一问题是有人可以输入一个糟糕的正则表达式(一个是O(2 ^ n)或O(n!)或其他)来管理你,并且防止这种情况的最简单方法可能是将页面超时设置得很短。

答案 3 :(得分:0)

如果正则表达式存储在数据库中,则应使用通常用于转义数据的任何方法,例如预准备语句。

否则,我唯一担心的是用户可能会提供恶意正则表达式,因为它可能包含错误复杂的正则表达式,而且我不确定是否有办法检查它。

一个想法是你可以通过在JS中完成你的正则表达式评估器所有客户端,但是php的preg函数和JavaScript正则表达式函数之间存在不一致。

答案 4 :(得分:0)

Afaik在尝试评估用户提供的regexp时现在存在“漏洞”。可能发生的最糟糕的事情是 - 像erik指出的那样 - 在你的脚本中发生DOS攻击或致命错误。

我害怕告诉你,你不会(甚至理论上)能够“清理”每一个可能的正则表达式。你能做的最好的就是检查词法和/或句法错误。