金利0無利息キャッシング – キャッシングできます

 | 

2013-11-08

テンプレートエンジンでJavaScriptを動的生成する際のアンチパターン

14:10 | テンプレートエンジンでJavaScriptを動的生成する際のアンチパターン - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - テンプレートエンジンでJavaScriptを動的生成する際のアンチパターン - 金利0無利息キャッシング – キャッシングできます

素のJSONscriptタグ内に埋め込む

任意文字列を突っ込める場合には {"key": "</script>"} でscriptタグを強制終了できてしまうからです。

JSONとしては正しいですがHTMLに埋め込む際には、それだけではダメなのです。文字列中に U+2028, U+2029が出現する場合もエラーになります。

U+2028, U+2029対策漏れでXSSが起きるケース

js側でコメントアウトしてデバッグ用の出力入れてるようなやつですね。

// [% debug_info %]

想像できると思いますが、改行入れてダメなやつですね。そして改行除去するように対策したところ、U+2028, U+2029が漏れてるというやつですね。こんなケースはめったにないので試験に出ません。

HTMLエスケープしたつもりが不十分なケース

ダブルクオートもシングルクオートもエスケープしてるのであれば、js変数に埋め込むだけでXSSが起きる状況というのはまず無いわけです。

なのでjs変数に埋め込む際にもHTMLエスケープを流用する、あるいはテンプレートエンジンの設定で自動でHTMLエスケープをするようにして、js変数に「HTMLエスケープ済みの文字列」が入ることを想定したコードが書かれる。

HTMLエスケープされてるので安全かと思いきや、\x3c \x3eを使ってタグを作ることが出来ます。

document.write("検索語句: " + "[% search_keyword %]")

あるいはこういうものです(jQueryバージョンアップすれば防げる)

var selected_class = "[% mode %]";
jQuery("div[class=" + selected_class + "]").append(...)

onclick等を自動生成するようなケース

 <button onclick="alert('[% value %]')">こんにちは</button>
  • HTMLエスケープの場合 → valueに ' を含めることでシングルクオートを閉じることが出来ます。HTMLエスケープされていても、HTML entitiesがデコードされた上でonclickが実行されるので、'として認識されます。
  • 過剰でないjsエスケープ → &apos; を入れることで 'を閉じることが出来ます。

これらの問題に対する対策

あとで書くと思ったら大間違いだ

トラックバック - http://subtech.g.hatena.ne.jp/mala/20131108
 |