1

フォーラム スタイルのテキスト ボックスがあり、ユーザー入力をサニタイズして xss やコードの挿入を防止したいと考えています。私は htmlentities が使用されているのを見てきましたが、他の人は &,#,%,: 文字もエンコードする必要があると言っており、見れば見るほど潜在的に危険な文字がポップアップするようです. ^a-zA-z0-9 以外にも有効なテキスト オプションが多数あるため、ホワイトリスト登録には問題があります。私はこのコードを思いつきました。攻撃を阻止し、安全を確保するために機能しますか? それを使用しない理由、またはより良い方法はありますか?

function replaceHTML ($match) {
    return "&#" . ord ($match[0]) . ";";
}

$clean = preg_replace_callback ( "/[^ a-zA-Z0-9]/", "replaceHTML", $userInput );

編集: _ _ _ _ _ _ _ __ _ _ __ _ _ ____ _ _ _ もちろん間違っている可能性もありますが、htmlentities は & < > " (および ENT_QUOTES がオンになっている場合は ' のみ) を置き換えることを理解しています。これはおそらく、ほとんどの攻撃を阻止するのに十分です (率直に言って、トラフィックの少ないサイトにはおそらく十分すぎるでしょう)。 . しかし、細部への執拗な注意の中で、私はさらに掘り下げました. 私が持っている本は、「六角攻撃をシャットダウンする」ために # と % もエンコードするように警告しています.英数字以外のすべての文字を変換することを検討するようになりました. htmlentities がこれをすでに実行している場合は、素晴らしいことですが、そうではないようです. これは、Firefox で [ソースを表示] をクリックした後にコピーした、実行したコードの結果です.

オリジナル (テストするランダムな文字): 5: gjla#''*&$!jl:4

preg_replace_callback: <b>5:</b>gjla<hi>#''*&$!jl:4

htmlentities (w/ ENT_QUOTES): <b>5:</b>gjla<hi>#''*&$!jl:4

htmlentities は、次のような他の文字をエンコードしていないようです: テキストの壁で申し訳ありません。これは私が妄想しているだけですか?

編集#2:_ _ _ _ _ _ _ _

4

3 に答える 3

1

それはまさに htmlentities がすでに行っていることです:

http://codepad.viper-7.com/NDZMa3

変換されます (stackoverflow の二重エンコーディングを防ぐためにスペースを空けます):
"& # amp ;" 「&#amp;#amp;」

于 2011-10-22T21:35:36.000 に答える
1

XSS 攻撃を阻止するために必要なことは、 を使用することだけhtmlspecialchars()です。

于 2011-10-22T21:36:23.413 に答える
0

作成した正規表現の最後にスペースを追加することによっても、正規表現でスペース' 'を変更できます。文字をシーケンスに手動で変換する必要はありません。htmlentitiesのコールバックで実行できます。\s/icase insensitive

$clean = preg_replace_callback('/[^a-z0-9\s]/i', 'htmlentities', $userInput);
于 2011-10-22T21:34:43.833 に答える