JavaScriptのエスケープを意識する箇所:
a. document.write(...); b. jQuery : $('#id').text(...); c. jQuery : $('#id').html(...); d. JSON : { "key" : "..." }
まだまとめきれてません:
参考:
正直頭が痛くなってきます。
$('#id').text('<?php echo htmlspecialchars($_GET['data'], ENT_QUOTES); ?>');
とすると二重エスケープになってしまいます。なので
$('#id').text('<?php echo $_GET['data']; ?>');
としてしまいますと、"</script>"などの閉じタグが入り込んでしまうとブロックが閉じてしまいます。
結果、
$('#id').html('<?php echo htmlspecialchars($_GET['data'], ENT_QUOTES); ?>');
としないと安心できません(=安全、と断言できるレベルではまだ無い)。
しかしそうなってくると、そもそもjQueryのhtml()でHTMLブロックをごそっと突っ込む機能自体が要らないのではないか、という気もしてきます。
つまり入力に含まれるHTMLタグは、エスケープされて表示されるべきということを徹底し、HTML要素を組み立てる必要があれば、DOM要素を1つずつ組み立てていく方が安心できます。とはいえ、過剰エスケープを抑制するためにわざわざ「エスケープをしない」jQuery.html()を使う、というのも混乱を招きそうです。
hiddenタグに出力してそれを参照する、という形について後日検証してみます。