CSRF Protection for Rails and Backbone.js
( backbonejs )欲求不満では内部でBackbone.jsを利用しているのですが、セキュリティ強化のためにCSRF対策を施しました。 Railsを利用しているときはCSRF用のtokenを発行しているのでそれをBackbone.jsで通信するさいに情報を負荷 して送信させるようにしました。
ちなみに以前はModelにtoJSON
メソッドでtokenを付加させていたのですがPOST,PUTのみの対応だったので
DELETE用にも対応できるよう実装してみた。(Model.destroy
時にはtoJSON()
を仲介しない)
#-------------------------------------------
# Sync
#-------------------------------------------
Backbone._sync = Backbone.sync
Backbone.sync = (method, model, options) ->
if method == 'create' || method == 'update' || method == 'delete'
options_csrf =
headers:
'X-CSRF-Token': BackboneFrustration.Model.csrf_token()
_.extend(
options,
options_csrf
)
return Backbone._sync(method, model, options)
メソッドをオーバーライドしてHEADERにX−CSRF-Token
を付加して親処理に渡す。BackboneFrustration.Model.csrf_token()
は
単純にフォームからCSRF用のtokenを取得しているだけです。これでajax通信のときはtokenを無視して処理をするようなその場しのぎな実装をせずになりました。
以下のような処理撲滅です。
protect_from_forgery except: :craete
この修正で問題なく動作しているので適用させました。
ところでRails用のgemでbackbone-rails
なんてものがありましてそこのコードを
見ていたらだいたい同じことをしていたのであらかじめこれを参考にして勉強すれば良かったと思いました。とほほ。。
とりあえず、これで一安心。
実際の修正箇所
https://github.com/nakajijapan/frustrationme_app/pull/25/files