web-dev-qa-db-ja.com

BBCodeをサポートするテキストエリアでhtmlentities()を使用してXSSを停止する

BBCodeを使用してデータベースにデータを投稿するためのテキスト領域が必要です。それで、JavaScriptコードをダウンロードしました(画像がクリックされたときに特定のBBCodeに書き込むため)が、テキストは変換されませんでした。

B、I、Uなどのテキスト領域の上に文字の画像があります。そのうちの1つ、おそらくBをクリックすると、JavaScriptがテキスト領域に_[b][/b]_を挿入します。しかし、太字のBBコードで他のテキストとともにテキストを送信すると、テキストが太字になりません。

だから、これはうまくいくと思いました:

_str_replace('[', '<', $_POST['text']);    
str_replace(']', '>', $_POST['text']);
_

機能しましたが、XSSを防ぐために使用していたhtmlentities()を追加することはできません。では、XSSを停止するには、他にどのようなオプションが必要ですか?

1
Slim Shady

XSSの地獄への扉を開かない安全な方法でBBCodeを解析するのは難しい作業であり、多くの失敗した試みがありました。ご存知のように、現在の方法はXSSに対して脆弱です。必要なことは、_[script src="evil.js"]_をポストすることだけです。 htmlentities()を使用するだけではこれは解決されず、はるかに複雑になります。これは blog が問題をきちんと説明しています。

そのため、独自のBBCodeインタープリターを実装することはお勧めしません。代わりに、PHPまたはJavaScriptのクライアント側のいずれかで、既存のライブラリを見て、それらのセキュリティレコードを評価します。開始するいくつかの場所:

セキュリティの層を追加するには、HTMLを「サンドボックス化」するように設計されたHTMLサニタイザーを通じて生成されたHTMLを実行し、不要なタグや属性(scriptonerrorなど)を除外しますBBCodeライブラリは失敗するはずです。いくつかの例:

これらのライブラリのセキュリティを評価していないことに注意してください。おそらくより良い代替案があります-これらは例としてここに提供されています。どのライブラリを選ぶにしても、その実績を見て、信頼できるかどうか自分で決める必要があります。そしていつものように、ライブラリを常に最新の状態に保ちます。

SilverlightFox がコメントで述べているように、防御の3番目の層(それをサポートするブラウザーの場合)として、インラインスクリプトを許可しない コンテンツセキュリティポリシー を設定できます。

4
Anders