6

ユーザーが正規表現をテストできる Web サイトを作成したいと考えています (既に多数の表現が存在します...たとえば、http://www.pagecolumn.com/tool/pregtest.htm )。基本的に、ユーザーは正規表現といくつかのサンプル テキストを提供し、正規表現評価の結果が返されます。

PHP "preg_*" 関数を使用して、サーバー側で正規表現を評価したいと考えています。提供された正規表現をサニタイズする方法はありますか? 懸念すべきセキュリティの脆弱性は何ですか?

4

5 に答える 5

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() を使用しないでください。

さらに、単純な最小限のサニタイズを行うこともできますが、それはあなた次第です. ;)

于 2010-03-03T13:54:07.763 に答える
1

ユーザーが送信した値を許可する場合は、フラグを許可しないpreg_replace ようにしてください。そうしないと、悪意のあるユーザーがサイト全体を削除したり、さらに悪いことにしたりする可能性があります。e

そうしないと、起こりうる最悪の事態は、他の回答がすでに指摘していることです。スクリプトのタイムアウトを低く設定し、ページを 1 分間に X 回しか呼び出せないようにする必要があるかもしれません。

于 2010-03-03T13:53:00.120 に答える
0

正規表現がデータベースに保存されている場合は、プリペアドステートメントなど、データをエスケープするために通常使用する方法を使用する必要があります。

そうでなければ、私の唯一の懸念は、ユーザーが悪意のある正規表現を含む可能性があるという意味で悪意のある正規表現を提供する可能性があることです。それを確認する方法があるかどうかはわかりません。

JSで実行することで、正規表現エバリュエーターをすべてクライアント側にすることができると考えられますが、phpのpreg関数とJavaScriptの正規表現関数の間には矛盾があります。

于 2010-03-03T13:20:38.127 に答える
0

Afaikは、ユーザー提供の正規表現を評価しようとするときに「脆弱性」が発生するようになりました。発生する可能性のある最悪の事態は、erikが指摘しているように、スクリプト内のDOS攻撃または致命的なエラーです。

恐れ入りますが、(理論的にも)可能なすべての正規表現を「サニタイズ」することはできません。最善の方法は、字句エラーや構文エラーをチェックすることです。

于 2010-03-03T13:22:00.870 に答える
0

私が考えることができる唯一の問題は、誰かが悪い正規表現(O(2 ^ n)またはO(n!)など)を入力することであなたをDOSできることです。これを防ぐ最も簡単な方法は、ページタイムアウトが短い。

于 2010-03-03T13:18:02.190 に答える