fredshaw 2009-10-17 00:46
浏览 187
已采纳

有关rails2.x防止CSRF攻击从而为form等生成的security token问题

[code="ruby"]
class ApplicationController < ActionController::Base
protect_from_forgery # :secret => '6f8929a08f3dbc2029c96b29a3aa288b'
end
[/code]
[size=medium]
第一个问题是session以cookiestore的存储方式为什么要注释掉:scret的内容呢?看了好多blog所说form等生成的security token是由session与这个scret的内容计算得到的。如果不是,那么form等生成的security token与protect_from_forgery设置的secret的值、与config/environement里session的secret值有什么关系呢?
第二个问题是如果以:active_record_store有如下代码
[/size]
[code="ruby"]
class ApplicationController < ActionController::Base
protect_from_forgery :secret => 'some_key'
end

#in environement.rb
config.action_controller.session = {
:session_key => '_myapp_session',
:secret => 'some_key'
}
config.action_controller.session_store = :active_record_store
[/code]
[size=medium]
上述代码中environement.rb中的secret为什么要与ApplicationController中的secret一样,因为我看老多blog也是这么描述的,可是我在rails2.x中建了一个myapp的项目,发现在cookiestore模式下ApplicationController里的secret与environement中的secret的值完全不一样,按照英文说明如果改为:active_record_store,只需要打开ApplicationController与environement中的两个注释就OK,并不需要把这两个secret值改为一样的。
其实问题的关键还是不明白security token的生成到底跟这两个secret有什么关系?如果没关系跟什么有关系?
[/size]
[b]问题补充:[/b]
[size=medium]
谢谢jim.jin,可是如果是为了安全为什么cookiestore要把:secret注释掉呢?
[/size]
[b]问题补充:[/b]
另外protect_from_forgery方法在那个文件中呢?

  • 写回答

2条回答 默认 最新

  • JimJin 2009-10-17 09:51
    关注

    protect_from_forgery 要不要加 secret
    不同rails版本不同

    protect_from_forgery rails 2.0 才有的
    2.0.0 - 2.2.1 都还有 secret

    2.3.2 去掉了 secret 参数

    详细可以看:
    2.3.2
    [url]http://apidock.com/rails/v2.3.2/ActionController/RequestForgeryProtection/ClassMethods/protect_from_forgery[/url]

    2.3.3 原代码
    [code="ruby"] def protect_from_forgery(options = {})
    self.request_forgery_protection_token ||= :authenticity_token
    before_filter :verify_authenticity_token, :only => options.delete(:only), :except => options.delete(:except)
    [color=red] if options[:secret] || options[:digest]
    ActiveSupport::Deprecation.warn("protect_from_forgery only takes :only and :except options now. :digest and :secret have no effect", caller)
    end[/color]
    end[/code]

    2.0.0
    [url]http://apidock.com/rails/v2.0.0/ActionController/RequestForgeryProtection/ClassMethods/protect_from_forgery[/url]

    2.2.3 原代码
    [code="ruby"] def protect_from_forgery(options = {})
    self.request_forgery_protection_token ||= :authenticity_token
    before_filter :verify_authenticity_token, :only => options.delete(:only), :except => options.delete(:except)
    request_forgery_protection_options.update(options)
    end[/code]

    [quote]另外protect_from_forgery方法在那个文件中呢? [/quote]

    rails/actionpack/lib/action_controller/request_forgery_protection.rb

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)