Rails Tips: CSRF and authenciticy_token

从Rails 2开始,默认使用cookie来保存session,于是很多关于安全上的置疑被频繁提及。尤其是cross-site request forgery(CSRF)攻击。

在Rails2中预防CSRF其实很容易,首先确保在application.rb中包含protect_from_forgery调用
class ApplicationController < ActionController::Base
  protect_from_forgery
end

至此,所有用form_for或者form_tag等生成的表单均被隐藏注入一个特别的基于用户session生成的token,在表单被提交时一并将token提交至服务器并接受服务器端的检查。

如果你象我一样喜欢自己手写Ajax Post请求代码,但是没有包含这个token的话,服务器端会报'verify_authenticity_token'错误,如何得到这个token呢?我的做法是在页面头部先得到这个token,赋值给一个JS的全局变量,在之后的Ajax代码中就可以直接引用啦,主意,一定要在Ajax调用代码之前作这一步,最保险的位置是在页面第一行。
<%= javascript_tag "var authenticity_token = '#{form_authenticity_token}';" %>

Ajax代码大概可以这样写
new Ajax.Request(
  request_path,
  {method:'post',
   parameters:'authenticity_token=' + encodeURIComponent(authenticity_token)});

你可能感兴趣的:(JavaScript,Ajax,Ruby,Rails)