web-dev-qa-db-ja.com

XSSを防ぐためにHTMLからJavaScriptを除外しますか?

大学のeクラスの古いバージョンの作品にパッチを当てる練習をしています。 PHPで記述されており、バージョン5.3.27が必要です。パッチを適用したいのは、XSSを防ぐことです。このサイトでは、検証なしでHTML入力をサポートする古いエディター(xinha)を使用しています。 XSSは非常に簡単です。

エディターを変更することは許可されていないため、ユーザー入力を使用/保存してからイベント関数(onerror、onmouseoverなど)とJavaScriptをブロックする前に、サーバー側の検証を変更するつもりです。かなりの調査の結果、HTMLからJavaScriptを除外する(簡単な)方法は見つかりませんでした。 HTMLの特殊文字をブロックすると、HTMLタグが壊れるため、機能しません。何か案は?

1
George Sp

特に許可されたタグと属性を小さなセット(またはできればなし)に制限できない場合は、HTMLからJavaScriptを除外するのは非常に複雑です。これを正しく行うことは驚くほど複雑であり、多くの落とし穴があります。 1つの間違いは、脆弱になるために必要なすべてです。

だから自分でこれに取り掛からないでください。既存の実証済みのライブラリを使用します。 PHP HTML Purifier は人気のあるものですが、他にも選択肢があると思います。

さらに、可能であれば、制限的な コンテンツセキュリティポリシー を使用する必要があります。ただし、これを唯一の防御手段として使用しないでください。

1
Anders

HTMLを許可する必要がある場合は、 Google Caja などのテスト済みのテストを使用して、HTMLをサニタイズしてからページに出力できるようにします。

すべてのサニタイザーには発見されていない脆弱性が存在する可能性が高いことに注意してください。例えばHTML Purifierにはこれらの 過去 とGoogle Caja もある があったため、これは確実な解決策ではなく、選択したライブラリを定期的に更新してこのリスクを軽減する必要があります。

独自のソリューションを展開することは、はるかに大きなリスクを伴います。また、強力な コンテンツセキュリティポリシー を導入して、unsafe-inlineそして、サイトを脆弱にする可能性のあるものを何も含まないソースのみをホワイトリストに登録します(Google CDNにも古い、脆弱なバージョンのJQueryが含まれています)。

https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js
1
SilverlightFox