[DOM Based XSS] jQueryで HTMLテキスト をエスケープする

Tips

Webアプリ開発ではおなじみのクロスサイト・スクリプティング(XSS)の脆弱性に関するおはなし。仕事で一度調べることがあったので、備忘録。

DOM Based XSS

DOM Based XSSの脆弱性とは、JavaScriptから動的にHTMLを操作しているアプリ全般に注意が必要な脆弱性です。

IPA(独立行政法人情報処理推進機構)でもレポートが作成され、注意を呼びかけています。

404 Not Found(お探しのページ・ファイルが見つかりませんでした。) | IPA 独立行政法人 情報処理推進機構
情報処理推進機構(IPA)の「404NotFound(お探しのページ・ファイルが見つかりませんでした。)」に関する情報です。

かなり昔のレポートではありますが、このレポートに書かれていることは有効であり、とてもわかりやすく解説しています。

jQueryで HTMLテキスト をエスケープする

保守開発で、どうしても他がいじれなくて……。以下の方法が有用だったので、メモ。

// inputタグの指定したname属性のvalue属性を返す。
var txt = jQuery('input[name="xxxx"]').val();
// エスケープした文字列をHTML文字列で返す
txt = jQuery('<span/>').text(txt).html();

上で紹介したIPAのレポートのうち「文脈に応じてエスケープ処理を施す方法」で対策しています。
ポイントは.text()です。
ここでエスケープするのですが、.text()はForm要素には使用できません。だから、一度.val()で取得してからエスケープするんですね。

以下のブログ記事を参考にさせていただきました。ありがとうございます。

参考資料

安全なウェブサイトの作り方 | 情報セキュリティ | IPA 独立行政法人 情報処理推進機構
情報処理推進機構(IPA)の「安全なウェブサイトの作り方」に関する情報です。

XSSの脆弱性の解説で参考になったページのリンクを貼っておきます。復習がてら、一読しておくといいと思う。