« Backbone.js入門 | トップページ | JavaScriptをminifyしてgzipしてS3へのアクセスにする »

2013年1月12日 (土)

Backbone.jsを使ったNode.jsアプリのCSRF対策

Ajaxはsame origin policyのため、AjaxのリクエストだったらCSRF対策いらないのでは?

残念。

FlashやJava appletを利用した場合にcsrfが起こる可能性があるそうです。
(参考: Rails 3.0.4と2.3.11からXHRリクエストの際もCSRFトークンの検証が必須になったので注意)

Backbone.jsを使っているとAjax部分は勝手に行われるので、CSRF対策のために拡張する必要がありそうです。

Stack Overflowを調べても、tokenを渡せばいいんじゃない?のそっけない返答しかなかったので、実装してみました。

概要

  • node.js側は、connect(ということはExpressも)にcsrf用のmiddlewareがあるのでそれを使用します。(app.js)
  • 初期ページ読み込み時にtokenをBackboneのメンバにセットします。(index.html)
  • Backbone.jsのAjaxの呼び出しを_csrfにBackboneのメンバに退避していたtokenをセットするようにラップします。(backbone-csrf.js)

実装

app.js

1 2 3 4 5 6
app.use(express.session());
app.use(express.csrf());
app.get('/', index);
index = function(req,res,next){
  res.render('index',{token: req.session._csrf});
}
view raw app.js This Gist brought to you by GitHub.
index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
<!DOCTYPE html>
<html>
  <head>
  <link rel='stylesheet' href='/stylesheets/style.css' />
  <script type="text/javascript" src="/javascript/jquery.min.js"></script>
  <script type="text/javascript" src="/javascript/underscore-min.js"></script>
  <script type="text/javascript" src="/javascript/backbone-min.js"></script>
  <script type="text/javascript" src="/javascript/backbone-csrf.js"></script>
  <script type="text/javascript">
  jQuery(function() {
  window.Backbone.CSRFToken = "<%- token %>";
  window.router = new MyRouter();
  Backbone.history.start();
  });
  </script>
  </head>
  <body>
  <div id="main">
  </div>
  </body>
</html>
view raw index.html This Gist brought to you by GitHub.
backbone-csrf.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Backbone.ajax = function() {
  var data = {};
  if (arguments[0].type && arguments[0].type !== "GET") {
    arguments[0].contentType = "application/json";
    if (arguments[0].data) {
      if (typeof arguments[0].data === "string") {
        data = JSON.parse(arguments[0].data);
      } else {
        data = arguments[0].data;
      }
    }
    data["_csrf"] = Backbone.CSRFToken;
    arguments[0].data = JSON.stringify(data);
  }
  return Backbone.$.ajax.apply(Backbone.$, arguments);
}

|

« Backbone.js入門 | トップページ | JavaScriptをminifyしてgzipしてS3へのアクセスにする »

backbone.js」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/68673/56524181

この記事へのトラックバック一覧です: Backbone.jsを使ったNode.jsアプリのCSRF対策:

« Backbone.js入門 | トップページ | JavaScriptをminifyしてgzipしてS3へのアクセスにする »