web-dev-qa-db-ja.com

ユーザーがHTMLの安全なサブセットを入力できるようにする

私は最近 この質問 をコードレビューに投稿しました。それについて皆さんに質問することをお勧めしました。

基本的に、これはユーザーがフォーマットされたコンテンツを生成できるようにするために使用されます。これはHTMLタグの内部に配置されるため、攻撃者が属性から抜け出すことを心配する必要はありません。それが明確でない場合は、次の例をご覧ください。

<div>
Generated content
</div>

編集:私は属性にコンテンツを挿入しないので、引用符のエスケープは問題ではありません。ユーザー生成コンテンツ内の不正な属性をまだチェックする必要があることはわかっています。これがスクリプトの大部分の目的です。

私は攻撃者が悪意のあるリンクを投稿したり、追跡画像を投稿したりすることに対して脆弱であることを確認しましたが、これは受け入れるつもりです。ユーザーが持つ自由度を劇的に減らすことになるURLのホワイトリストがなければ、それを防ぐことはできないと思います。この脆弱性を修正するための実行可能な方法がある場合は、それについてお聞かせください。

私は OWASP XSSチートシート を読みましたが、これらのすべての基礎をカバーしていると思います。

そのチートシートの外側で何を心配する必要がありますか?私はそれに何かを見逃しましたか?私のコードは将来性がありますか?私は頭上にいますか? BBCodeまたはMarkupに切り替えるだけですか?

現在のコード

10
Meredith

ホワイトリストを作成するときは正しい方向に進んでいますが、弾丸の証拠を実装するのは難しいです。

つまり次のように書くだけで、リンクをだましてJSを実行できます。

<a href="JAVASCRIPT:xxx">xss</a>

また、特に古いブラウザはimg srcなどでJSを実行する場合があります。

HTMLPurifier を使用することをお勧めします。これは、XSSのほかに、壊れたHTML(タグのネストなど)の処理にも役立ちます。

13
timoh

概要:HTMLサニタイザーを使用しますが、フィルターをバイパスするための常に新しい方法があるため、コンテンツセキュリティポリシーと組み合わせてのみ使用します。

ホワイトリストに記載されたHTMLタグのサブセットを許可する独自の処理の後、HTMLサニタイザーを通じてコン​​テンツを渡す必要があります。

何らかのHTMLサニタイザーを使用するだけでなく、ユーザーHTMLコンテンツを含むページにも コンテンツセキュリティポリシー を実装することをお勧めします。これは、ユーザーが悪意のあるスクリプトを挿入した場合にインラインJavaScriptが実行されないようにするブラウザー実装メカニズムです。外部の_.js_コンテンツのみを許可するようにCSPを設定できます(ドメインまたはホワイトリストに登録されている他のドメイン-Google Hosted Librariesなど)。

これらの手順により、ユーザーがjavascript:alert('foo');またはリンクとして何でも入力した場合、実行されないことが保証されます。 imgタグとaタグを許可している場合、これらはおそらく任意のWebアドレスを指す可能性があります。追跡することはできますが、CSPのため、セッション情報を一緒に送信することはできません(例:_document.cookie_)。

古いバージョンのHTML Purifier(<= v4.1.0)の this one のように、ブラウザとWebの言語が発展するにつれて、HTMLサニタイザーには常に穴が見つかります。これが、私が両方のアプローチを組み合わせて、1つの方法のギャップが脆弱にならないようにすることをお勧めする理由です。

10
SilverlightFox