Node.js+ExpressにおいてCSRF対策を行うための実装

Node.js+Expressの構成においてCSRF対策を行うための実装メモです。

CSRF対策用のミドルウェアを追加

ExpressではCSRF対策のためのミドルウェアを提供しています。
まずはこれをapp.useに追加します。

app.configure(function () {
  // 省略
  app.use(express.csrf()); // express.csrfを追加
  // 省略
});

tokenを生成しレスポンスに設定するための関数を作成

つづいて、tokenを生成しレスポンスに設定させてやるための関数を作成します。
この関数を呼び出すことによりビューにtokenを埋め込むことが可能となります。

function csrf(req, res, next) {
  res.locals.csrftoken = req.csrfToken();
  // ↓非推奨な実装。
  // res.locals.csrftoken = req.session._csrf; 
  next();
}

sessionより_csrfプロパティを取得する実装も可能ですが、この実装は現在では非推奨のようです。Expressがログにて警告をだします。

ルーティングの設定箇所にtoken生成関数の呼び出しを追加する

app.get('/entry'
    csrf, // token生成関数の呼び出しを追加
    entry.index);

ビューにtokenを埋め込む

最後にビューにtokenを埋め込んであげます(下記コード実装例はejs)。
このとき、nameは"_csrf"としてあげてください。

<form method="POST" action="/entry">
  <input type="hidden" name="_csrf" value="<%= csrftoken %>">
  <input type="submit" id="submit-button" value="投稿する">
</form>


以上により、CSRF対策の実装が可能となります。
対策がちゃんと効いていることを確認するため、tokenの値を書き換えてPOSTしてみるとエラーが発生するはずです。

エラー発生時のハンドリングについては以下の記事が詳しいです。
Future is now: [node.js, express]express で CSRF 対策

おすすめ参考文献

Node.js+Expressの構成の使い方を解説してくれます。初めてNode.jsやExpressに取り組む方にオススメです。