#navi_header|JavaScript| JavaScriptのエスケープを意識する箇所: a. document.write(...); b. jQuery : $('#id').text(...); c. jQuery : $('#id').html(...); d. JSON : { "key" : "..." } まだまとめきれてません: - ダブルクォート・シングルクォートの両方をエスケープすること。 - バッククォート(0x5C)もエスケープすること。(「\'」が「\\\'」or「\\'」) - 過剰エスケープに注意。 - 言語やライブラリがエスケープ処理を提供しているのであれば、それを正しく使う。エスケープ処理の自作はなるべく避ける。 参考: - HTMLのscriptタグ内に出力されるJavaScriptのエスケープ処理に起因するXSSがとても多い件について -- http://subtech.g.hatena.ne.jp/mala/20100222/1266843093 - PHPのイタい入門書を読んでAjaxのXSSについて検討した(1) - ockeghem(徳丸浩)の日記 -- http://d.hatena.ne.jp/ockeghem/20110905/p1 - PHPのイタい入門書を読んでAjaxのXSSについて検討した(2)~evalインジェクション~ - ockeghem(徳丸浩)の日記 -- http://d.hatena.ne.jp/ockeghem/20110906/p1 - PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)~JSON等の想定外読み出しによる攻撃~ - ockeghem(徳丸浩)の日記 -- http://d.hatena.ne.jp/ockeghem/20110907/p1 document.write()は最近見かけなくなったとはいえ、jQueryの場合だけでも、正直頭が痛くなってきます。 $('#id').text(''); とすると二重エスケープになってしまいます。なので $('#id').text(''); としてしまいますと、""などの閉じタグが入り込んでしまうとブロックが閉じてしまいます。 結果、 $('#id').html(''); としないと安心できません(=安全、と断言できるレベルではまだ無い)。 しかしそうなってくると、そもそもjQueryのhtml()でHTMLブロックをごそっと突っ込む機能自体が要らないのではないか、という気もしてきます。 つまり入力に含まれるHTMLタグは、エスケープされて表示されるべきということを徹底し、HTML要素を組み立てる必要があれば、DOM要素を1つずつ組み立てていく方が安心できます。とはいえ、過剰エスケープを抑制するためにわざわざ「エスケープをしない」jQuery.html()を使う、というのも混乱を招きそうです。 hiddenタグに出力してそれを参照すれば、少しわかりやすくなります。 #code|html|> jQuery Escape Test
dummy
||< これならばjQuery.text()で過剰エスケープはされませんでした。jQuery.html()ではちゃんとが効いて太字になってくれます。 ユーザ入力を(なんのチェックも無しに)jQuery.html()に渡すことは無いと思いますので("