私は常に、フォーラムやブログのような Web ソフトウェアを作成することに興味を持っていました。これは、限定的なマークアップを使用して HTML に書き直すものです。しかし最近、PHP について、「PHP BBCode parser -PEAR」をググってみて、いくつか試してみると、非効率的な混乱が生じるか、あちこちに XSS ホールのある貧弱なコードが得られることにますます気づきました。
前述の貧弱な BBCode パーサーの例を挙げると、どのように XSS を回避しますか? リンクを処理するための典型的な正規表現を取り上げます。リンクの脆弱性と回避方法について言及できます。
// Assume input has already been encoded by htmlspecialchars with ENT_QUOTES
$text = preg_replace('#\[url\](.*?)\[/url\]#i','<a href="\1">\1</a>', $text);
$text = preg_replace('#\[url=(.*?)\](.*?)\[/url\]#i','<a href="\1">\2</a>', $text);
画像タグの処理は、これほど安全ではありません。
そのため、主に PHP の実装に固有の質問がいくつかあります。
- この例では、uri/url 検証式を使用してのみ一致させることをお勧めしますか? または、コールバックを使用
(.*?)
してから、入力が有効なリンクかどうかを確認する方がよいでしょうか? 上記で明らかなようにjavascript:alert('XSS!')
、上記の URL タグでは機能しますが、URI マッチングが行われると失敗します。 - コールバック内のような関数はどう
urlencode()
ですか? (URI 標準に関する限り) 抑止力や問題になりますか? - フルスタック パーサーを作成する方が安全でしょうか? それとも、そのようなものを開発して使用するために必要な時間と処理能力は、ページごとに複数の異なるエントリを処理するものには重すぎますか?
私の例は多くの例の 1 つであり、いくつかの例よりも具体的であることはわかっています。ただし、独自のものを提供することをためらわないでください。 そこで、テキスト解析状況における XSS 保護の原則とベスト プラクティス、および一般的な推奨事項を探しています。