概要: coffeecup.js はデフォルトで HTML エスケープしない
自戒を込めてメモ。
僕は、最近、
俺の考えた最強の掲示板システム(てってれー)
なるものをこそっと作ってたのですが、今日の今日まで、 そのシステムに XSS 脆弱性をモロに埋め込んでました。
具体的にどういうことかというと、僕の作ってる掲示板システムは、
coffeecup.js
という感じの構成で作ってたのですが、テンプレートエンジンの coffeecup.js が、
デフォルトでは全自動 HTML エスケープをしない 、
ということに気がついていませんでした。
まあ今となってはおいおいって感じですが、よくよく考えてみれば、 Text::MicroTemplate
とか、あるいはText::Xslate
みたいに、 全自動エスケープを搭載している方が少数派っぽく、 普通のテンプレエンジンはエスケープは任意で、って感じですよね。
で、もしこれに気がつかないままだったとすると、たぶん、 はまちちゃんあたりにイタズラされて、
らめぇぇぇぇスクリプト埋め込まれちゃうのおおおぉぉぉおぉぉ
という感じのコトを叫び、ひろみちゅ先生あたりからボロックソにののしられ、 最後の総仕上げにデッカいマーラネ申から実装面の問題を淡々と指摘される、 という恐怖のセキュリティみそ汁を味わうコトとなっていたような気がします。 ガクブル。あ、上記にには若干誇張が含まれています。
で、coffeecup.js でのエスケープ問題の解決方法としては、
@vars
みたいな変数参照をh @vars
という感じでエスケープする- Template の Compile options で
autoescape: true
を指定する
という感じの二通りになります。ちなみに僕は後者を選びました。
ちなみに後者のautoescape: true
を指定すると、 基本すべてのテキスト出力がエスケープされるので、 生の html などを書きたい場合は、
p -> text '<em>hoge</em>'
という感じでかき、またエスケープが必要な編集をプレーンテキストで表示したい場合、
p -> text h '<nyarla>'
という感じで書くと OK です。ちなみになんでtext h '<nyarla>'
になってるか、 というと、h '<nyarla>'
だけだと、二重エスケープされちゃうからです。 まあ詳しく試してみると分かります。
ま、そんな感じで、今日は自分の作ってるモノの脆弱性に気がつけたのでよかったです。
さすがに僕もはまちちゃんの餌食にはなりたくないので、 今後はテンプレートエンジンの仕様とかには、気を使いたいと思います。
というわけで、今日のメモおわり。まる。
#FIXME