Expressの5行でできるCSRF対策

特殊なウィルス怖いですね.今後CSRF対策してないフォームを公開したらウイルス作成罪で逮捕されるかもしれません. NodeのWEBフレームワークExpress(が使ってるミドルウェアフレームワークのConnect)では数行追加するだけで,セッション毎の固定トークン方式でCSRF対策ができるので紹介する.

ソース デモ

基本的にはapp.use(express.session());app.use(app.router);の間に2つミドルウェアを追加し,ビューのformに隠し項目でトークンを追加するだけである.

// app.js
...
  app.use(express.session());
  app.use(express.csrf()); // 追加
  app.use(function(req, res, next) { // 追加
    res.locals._csrf = req.session._csrf;
    next();
  });
  app.use(app.router);
...

app.use(express.csrf());の部分はconnectのmiddleware/csrf.js参照. req.session._csrfにトークンが追加され,POSTメソッド等でtokenが一致してるかチェックされるようになる. res.locals._csrf = req.session._csrf;で_csrfをビューから参照できるようにしている.

後はビューのフォームにトークンを追加する.

// index.jade
...
  form(method='post')
    legend= 'CSRF対策済みフォーム'
    input(type='text', name='text')
    input(type='hidden', name='_csrf', value=_csrf) // 追加
    input(type='submit')
...