#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 正直頭が痛くなってきます。 $('#id').text(''); とすると二重エスケープになってしまいます。なので $('#id').text(''); としてしまいますと、""などの閉じタグが入り込んでしまうとブロックが閉じてしまいます。 結果、 $('#id').html(''); としないと安心できません(=安全、と断言できるレベルではまだ無い)。 しかしそうなってくると、そもそもjQueryのhtml()でHTMLブロックをごそっと突っ込む機能自体が要らないのではないか、という気もしてきます。 つまり入力に含まれるHTMLタグは、エスケープされて表示されるべきということを徹底し、HTML要素を組み立てる必要があれば、DOM要素を1つずつ組み立てていく方が安心できます。とはいえ、過剰エスケープを抑制するためにわざわざ「エスケープをしない」jQuery.html()を使う、というのも混乱を招きそうです。 hiddenタグに出力してそれを参照する、という形について後日検証してみます。 #navi_footer|JavaScript|