クライアント側のサニタイズを行うべきではないと誰もが私に言う前に (SSJS でも機能する可能性がありますが、実際にはクライアントで行うつもりです)、私が何をしようとしているのかを明確にさせてください。
Google CajaやHTMLPurifierに似たものですが、JavaScript の場合: HTML と CSS を処理するホワイトリスト ベースのセキュリティ アプローチ (もちろん、まだ DOM に挿入されていないため、安全ではありませんが、最初に文字列形式で取得されます)次に、安全でないタグまたは属性を選択的に除外し、それらを無視するか、オプションでエスケープされたテキストとして含めるか、理想的にはコンテキストで、さらに処理するためにそれらをアプリケーションに報告できるようにします。Google Caja のように、JavaScript を安全なサブセットに減らすことができれば素晴らしいと思いますが、それでは多くのことが求められることはわかっています。
私のユース ケースは、 JSONP経由で取得した信頼できない XML/XHTML データ(Wiki 処理前の Mediawiki ウィキからのデータ。これにより、未加工の信頼できない XML/HTML 入力を許可する) にアクセスし、ユーザーがそのデータ (XQuery、jQuery、 XSLT など)、HTML5 を利用してオフラインでの使用、IndexedDB ストレージなどを可能にし、ユーザーが入力ソースを表示してクエリを作成またはインポートした同じページで結果をプレビューできるようにします。
ユーザーは自分が望む出力を生成できるので、ユーザーが行っていることをサニタイズするつもりはありません。JavaScript をページに挿入したい場合は、すべての権限がユーザーに与えられます。しかし、安全でない入力をコピーすることを禁止しながら、信頼できない入力から対象の要素を安全にコピーするコードを追加できるという自信を持ちたいユーザーを保護したいと思います。
これは間違いなく実行できるはずですが、すでにこれを行っているライブラリがあるかどうか疑問に思っています。
innerHTML
そして、これを自分で実装するのに行き詰まっている場合 (どちらの場合も興味があります)、ドキュメントへの挿入前に DOM の作成/追加を使用することがあらゆる点で安全であるかどうかを証明したいと思います。たとえば、生の HTML を挿入されていない div に追加するためにDOMParser
使用して、ブラウザーの HTML 解析を最初に実行または依存した場合、イベントが誤ってトリガーされる可能性はありますか? innerHTML
私はそれが安全であるべきだと信じていますが、悪用される可能性のある挿入の前にDOM操作イベントが何らかの形で発生する可能性があるかどうかはわかりません.
もちろん、構築された DOM はその時点でサニタイズする必要がありますが、トラバーサルを容易にするために DOM オブジェクト自体を安全に構築できることを確認し、不要な要素、属性、および属性値を除外することについて心配したいだけです。
ありがとう!