Node
タイプのDOMがText
ブラウザによってHTMLとして解釈されないことが保証されているかどうかを知っている人はいますか?
詳細は次のとおりです。
バックグラウンド
私は友人のために簡単な Web コメント システムを構築しており、XSS 攻撃について考えています。HTML タグのフィルタリングやエスケープは、非常に洗練された解決策ではないと思います。フィルターをすり抜けてしまう畳み込みを考え出すのは簡単すぎます。基本的な問題は、特定のコンテンツ (つまり、認証されていない Web ユーザーが無作為に POST するコンテンツ) について、ブラウザーがコンテンツを解釈または実行しようとしないことを保証したいということです。
プレーン(テキスト)の開始
頭に浮かんだ最初の考えは、単に を使用することContent-Type: text/plain
ですが、これはページ全体に適用する必要があります。ページの途中にプレーンテキストを配置することはできますがIFRAME
、見苦しく、ユーザーがフレームをクリックするとフォーカスの問題が発生します。
innerText/textContent/JQuery
innerText
ブラウザー固有 ( IE、textContent
FF、Safari など) の属性がいくつかあることが判明しました。これらの属性を設定すると、単一のText
ノードを作成する必要があります。
text(val)
JQuery は、ブラウザー固有の属性をスキップして に直接移動する単一の関数を実装することにより、ブラウザー固有の属性の違いを回避しようとします。document.createTextNode(text)
これは、ご想像のとおり、ノードを作成しText
ます。
Text
Node
W3 DOM
これは私が望むものに近いと思います。見た目は良いです。Text
ノードは子を持つことができず、HTML として解釈できないように見えます。しかし、公式ドキュメントからは 100% 確信が持てません。
- インターフェイス
Node
: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247 - インターフェイス
Text
: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1312295772 textContent
: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent
の部分textContent
は、「設定時に解析も実行されず、入力文字列は純粋なテキスト コンテンツとして取得される」と記載されているため、特に励みになります。しかし、これはすべてのノードの基本ですかText
、それとも設定したノードのみtextContent
ですか? これはおそらくばかげた言い訳のように思えますが、IE はサポートしていないためtextContent
(上記を参照)、これは重要なことかもしれません。
最初の質問に戻る
これが機能することを誰でも確認/拒否できますか? つまり、w3 DOM 準拠のブラウザーは、コンテンツが何であれ、ノードを HTML として解釈しないということですか? Text
この苦しむ小さな不確実性が解決されたことに、私は非常に感謝しています。
お時間をいただきありがとうございます!