0

ユーザー (スパマーではないことを願っています) がメールを送信できるように、安全な php 連絡フォームを作成しようとしています。

ユーザーがメールアドレスを送信する from: フィールドと subject: フィールドで新しい行を検出する方法を検討しています。

新しい行を検出する同じ機能の 2 つの選択肢があります。どちらが最も信頼性が高いか (ほとんどの場合に機能することを意味します) についてご意見をお聞かせください。

function containingnewlines1($stringtotest) {
    if (preg_match("/(%0A|%0D|\\n+|\\r+)/i", $stringtotest) != 0) {
        echo "Newline found. Suspected injection attempt";
        exit;
    }
}

function containingnewlines2($stringtotest) {
    if (preg_match("/^\R$/", $stringtotest) != 0) {
        echo "Newline found. Suspected injection attempt";
        exit;
    }
}

ご意見ありがとうございます!

乾杯

4

3 に答える 3

1

はるかに適切な質問は、「どちらがより信頼できるか?」です。どちらのアプローチも実行に数ミリ秒以上かかるべきではないため、どちらのアプローチの効率も重要ではありません。ミリ秒単位で 2 つのどちらかを決定しようとするのが、です。

また、効率とはどういう意味ですか?どちらが速いということですか?メモリ消費量が最も少ないのはどれですか? 効率は定義が曖昧な用語です。より具体的に説明する必要があります。

パフォーマンス/効率の要件に基づいて決定を下さなければならない場合は、ベンチマークを作成し、要件に最も近いものを自分で見つけることをお勧めします。結局のところ、その質問に答えることができるのはあなただけだからです。

于 2012-06-27T10:30:11.350 に答える
0

実際、最初の関数を使用することにしました。これは、さらに2つのケース(%OAと%OD)をカバーし、さまざまなOS(\ n、\ n \ rなど)で使用されるすべての新しい行の文字バリエーションも含まれているためです。

于 2012-06-27T13:09:08.350 に答える
0

100000私はさらに2つの機能を追加し、ループのベンチマークを行いました:

function containingnewlines3($stringtotest) {
   return (strpbrk($stringtotest,"\r\n") !== FALSE);
}

function containingnewlines4($stringtotest) {
   return (strpos($stringtotest,"\n") !== FALSE && strpos($stringtotest,"\r\n") !== FALSE);
}

$start = microtime(TRUE);
for($x=0;$x<100000;$x++) {
   containingnewlines1($html);   // 0.272623 ms
   containingnewlines2($html);   // 0.244299 ms
   containingnewlines3($html);   // 0.377767 ms
   containingnewlines4($html);   // 0.142282 ms
}
echo (microtime(TRUE) - $start);
于 2012-06-27T10:50:55.010 に答える