[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方法在那个文件中呢?
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.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
protect_from_forgery 的 secret 是为了 From 提交的安全;
session 的 secret 是为了 session 的安全;
他们应该没什么关系,
至于是否一定要一样:
如果一定要一样Rails何必好给两个地方设置? 不是多此一举吗?
其实, 他们就是一个安全的KEY,无论是session 还是from key就是通过他们来生成,就是让他复杂越安全,在用的时候我们给他一个随机生成的够长的码就好了,就像这样的 '6f8929a08f3dbc2029c96b29a3aa288b', 其他的Rails 已经帮我们做了。
不要给它太简单 如: '123', 'abc', 'session_secret', 'from_secret'
具体生成过程可以看:
rails\actionpack\lib\action_controller\session\cookie_store.rb
rails\railties\lib\rails_generator\secret_key_generator.rb