3

CppCMS用に C++ でシンプルで効率的な XSS フィルターを実装する必要があります。PHP は C++ を使用した高性能なフレームワークであるため、既存の PHP で作成された高品質なフィルターは使用できません。

基本的な考え方は、HTML タグの while リストとこれらのタグのオプションのホワイト リストを持つフィルタを提供することです。例えば。典型的な HTML 入力は、、、 <b>タグ<i>、および を<a>含むタグで構成できますhref。しかし、許可された単純なリンクにも XSS が含まれている可能性があるため、単純な実装では十分ではありません。

<a href="javascript:alert('XSS')">Click On Me</a>

そこには他にも多くの例があります。そのため、href/src などのタグのプレフィックスのホワイト リストを作成する可能性についても検討しました。(https?|ftp)://

質問:

  • これらの仮定は、ほとんどの目的に対して十分に適切ですか? タグのオプションを指定せずstyle、プレフィックスのホワイトリストを使用して src/href をチェックすると、XSS の問題が解決するということですか? この方法で修正できない問題はありますか?
  • HTML/XHTML の正式な文法に関する適切なリファレンスはありますか?<script>
4

3 に答える 3

4

同じことを成し遂げようとしているAntiSamyプロジェクトを見ることができます。ただし、Javaと.NETです。

編集1、少し余分:

非常に厳密なホワイトリストを作成できる可能性があります。それはうまく構造化されるべきであり、かなりタイトで柔軟性があまりないはずです。柔軟性を組み合わせると、非常に多くのタグ、属性、およびさまざまなブラウザが一般的にXSSの脆弱性になります。

要件はわかりませんが、厳密で単純なタグサポート(b li h1のみなど)を使用してから、タグに基づく厳密な属性サポート(たとえば、srcはhrefタグでのみ有効)を使用します。次に、http | https|ftpまたはstyle="color | background-color"などで指定したように、属性値をホワイトリストに登録する必要があります。

これを考えてみましょう:

<x style="express/**/ion:(alert(/bah!/))">

また、エンコーディングが異なると厄介な問題が発生する可能性があるため、文字のホワイトリストまたはUTF-8の正規化についても考慮する必要があります。属性の新しい行、無効なUTF-8シーケンスなど。

于 2009-02-15T20:18:52.443 に答える
1

あなたが言及したように、これにはさまざまな PHP 実装がありますが、Web 開発に通常適用される言語ではないため、C++ での実装については知りません。全体として、どの程度複雑な実装を考え出すかによって異なります。

非常に制限的なホワイトリストはおそらく「最も簡単な」方法ですが、本当に包括的になりたい場合は、独自のバージョンをゼロから作成するのではなく、確立されたバージョンの 1 つを C++ に変換することを検討します。心配しなければならないトリックがたくさんあるので、それらすべてをすでに経験した他の人の肩の上に立ったほうがよいと思います。

Web開発にC++を使用することについては何も知りませんが、PHPをそれに変換することは特に難しい作業ではないようです。PHPには、C++が複製できない魔法のような機能は実際にはありません. いくつかの小さなヒッチがあると確信していますが、全体として、より複雑なルートに進みたい場合は、ゼロから完全なデザインを作成するよりも変換を行う方が確実に高速です.

HTML Purifierは強力な PHP 実装であり、現在も積極的にメンテナンスされているようです。著者が自分のアプローチと他のアプローチとの違いについて論じている比較ドキュメントがあり、おそらく読む価値があります。

思いついたものは何でも、リンクするすべての例で確実にテストし、それらすべてに合格することを確認してください。幸運を!

于 2009-04-09T14:33:13.220 に答える
1

HTML 解析のすべての詳細は、HTML 5 で指定されています。しかし、それを実装するのは大変な作業であり、すべてのコーナー ケースで HTML を正確に解析するかどうかは問題ではありません。最悪の場合、別の DOM になってしまいますが、とにかく DOM をサニタイズする必要があります。

于 2009-04-09T14:30:56.953 に答える