express.jsとcoffeecup.jsを使うときは、@の前にhを使え。さもなきゃXSSる

読了まで:約2分


概要: coffeecup.js はデフォルトで HTML エスケープしない


自戒を込めてメモ。

僕は、最近、

俺の考えた最強の掲示板システム(てってれー)

なるものをこそっと作ってたのですが、今日の今日まで、 そのシステムに XSS 脆弱性をモロに埋め込んでました。

具体的にどういうことかというと、僕の作ってる掲示板システムは、

  • Express.js 3

coffeecup.js

  • その他色々

いう感じの構成で作ってたのですが、テンプレートエンジンの coffeecup.js が、

デフォルトでは全自動 HTML エスケープをしない 、

いうことに気がついていませんでした。

まあ今となってはおいおいって感じですが、よくよく考えてみれば、 Text::MicroTemplateとか、あるいはText::Xslateみたいに、 全自動エスケープを搭載している方が少数派っぽく、 普通のテンプレエンジンはエスケープは任意で、って感じですよね。

で、もしこれに気がつかないままだったとすると、たぶん、まちちゃんあたりにイタズラされて、

らめぇぇぇぇスクリプト埋め込まれちゃうのおおおぉぉぉおぉぉ

いう感じのコトを叫び、ひろみちゅ先生あたりからボロックソにののしられ、 最後の総仕上げにデッカいマーラネ申から実装面の問題を淡々と指摘される、いう恐怖のセキュリティみそ汁を味わうコトとなっていたような気がします。 ガクブル。あ、上記にには若干誇張が含まれています。

で、coffeecup.js でのエスケープ問題の解決方法としては、

  1. @varsみたいな変数参照をh @varsいう感じでエスケープする
  2. Template の Compile options でautoescape: true指定する

いう感じの二通りになります。ちなみに僕は後者を選びました。

ちなみに後者のautoescape: true指定すると、 基本すべてのテキスト出力がエスケープされるので、 生の html などを書きたい場合は、

p -> text '<em>hoge</em>'

いう感じでかき、またエスケープが必要な編集をプレーンテキストで表示したい場合、

p -> text h '<nyarla>'

いう感じで書くと OK です。ちなみになんでtext h '<nyarla>'になってるか、いうと、h '<nyarla>'だけだと、二重エスケープされちゃうからです。 まあ詳しく試してみると分かります。


ま、そんな感じで、今日は自分の作ってるモノの脆弱性に気がつけたのでよかったです。

さすがに僕もはまちちゃんの餌食にはなりたくないので、 今後はテンプレートエンジンの仕様とかには、気を使いたいと思います。

いうわけで、今日のメモおわり。まる。

#FIXME

アバターアイコン兼ロゴ

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。次に備えて待機中。

今は趣味でプログラミングをして生活しています。