ユーザーからのエスケープされていないデータがあります。
したがって、次のように使用しても安全ですか?
var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
$('body').text(data);
このように使用できますか、エンコードや特定のシンボルなどの問題があり、注意してより厳密な検証を追加する必要がありますか?
text
メソッドを使用して要素のテキストを設定すると、jQueryはすべての特殊文字をエスケープするcreateTextNode
を内部的に使用します。
jQuery docs から:
このメソッドは、HTMLで正しくレンダリングされるように、必要に応じて提供された文字列をエスケープすることに注意する必要があります。そのために、DOMメソッド
.createTextNode()
を呼び出します。これは、特殊文字を対応するHTMLエンティティに置き換えます(<
の場合は<
など)
そう、それは安全なはずです。 jsfiddleの例 です。タグがリテラルテキストとして表示されることに注意してください。
XSS攻撃はDOMノード(_<img />
_、_<script />
_)などを挿入できることに依存しており、jQuery.fn.text()
はこれをサポートしていないため、完全にXSSセーフです。
この 基本的な例 で見ることができるように、すべてのHTMLタグはjQueryの結果としてcreateTextNode
を内部的に使用してエンコードされます。
_jQuery('div').text('<test>a&f"#</test>');
_
そのため、実際に挿入されるものはより同等になります。
_jQuery('div').html('<test>a&f"#</test>');
_
結果をDOMに挿入するときは、引き続き注意する必要があります- JavaScriptおよびJQueryを使用したクロスサイトスクリプティングの脆弱性 を参照してください。
ただし、要素のテキストを設定するには、テキストはXSSセーフである必要があります。
http://benv.ca/2012/10/02/you-are-probably-misusing-DOM-text-methods/ の著者は、createTextNode
またはjQueryの.text()
。
...値を注入するコンテキスト(属性ではない)がわかっている場合、このメソッドは安全です。私の主張は、開発者はこれらのコンテキストを十分に理解しておらず、遅かれ早かれ彼らはそれを誤解するだろうということです。
文字列置換を使用することをお勧めします(少なくとも<
)。
安全性の高いライブラリの例:
#1 OWASP提案 は次のとおりです。
ルール#1-信頼できないデータをHTML要素コンテンツに挿入する前のHTMLエスケープ
.html()メソッドとは異なり、.text()はXMLおよびHTMLドキュメントの両方で使用できます。 .text()メソッドの結果は、一致したすべての要素の結合テキストを含む文字列です。 (ブラウザによってHTMLパーサーが異なるため、返されるテキストは改行やその他の空白が異なる場合があります。)
.text(data)
は<test></test>
離れてa&f#