Edge Rails 的更新:网站签名防护的改进

Posted by yudi
on Monday, December 31


今日讨论 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

原文作者是 Ryan Daigle, 请访问他的博客
本片译文的原文地址:Track

Comments

Leave a response