今日讨论 Rails 安全性的话题 越来越热,因此 Rails 将 CsrfKiller 插件 加入了 核心部分
CsrfKiller 插件为所有的非GET1请求 中的form 添加了一个独特的session token 一栏。这一栏内容确保了接收到的请求必须是来自于 授权用户的 session2
现在轮到 默认功能 了。如果您只想应用默认的行为则不必设置任何东西。然而您仍然可以通过以下示例针对自己的设定来进行调整:
1 2 3 4 5 |
class PostsController < ApplicationController protect_from_forgery :secret => '2kdjnaLI8', :only => [:update, :delete, :create] ... end |
如果您已经使用 edge Rails 的默认 cookie 的 session存贮 ,那么您则不必设置 :secret 密钥。
protect_from_forgery :only => [:update, :delete, :create] |
如果您没有使用 cookie 的 session 存贮,则可以改变用来建立独特蜜月的 digest method (默认method是 ‘SHA1’)。
protect_from_forgery :secret => '2kaienna9ea90djnaLI8', :digest => 'MD5' |
当系统接收到外部请求的时候,如果请求无法满足当前session的签名保护标签,系统将会输出一个来自 ActionController::InvalidAuthenticityToken 的 exception。也许这段代码在将来会有新的错误输出语法?
注意:鉴别请求的签名保护功能只在一下情况中可以被应用:- 非-GET 请求,所以请确定改变状态的请求属于 PUT/POST/DELETE 请求之一。
- 对于html以及Ajax请求。如果您想扩展 verifiable_request_format? 则需要先覆盖它。
skip_before_filter :verify_authenticity_token |
如果您想在全网站范围中取消这项功能,只要将下列添加到 application.rb:
self.allow_forgery_protection = false |
注释
1 HTTP 动词包括: GET/PUT/POST/DELETE
2 更多使用方法请去 CSRF



