如何保护Rails应用免受Firesheep攻击?

20

我没有找到一个简单的指南来保护Ruby on Rails应用程序免受Firesheep攻击。如果您不知道,如果您的应用程序没有强制使用SSL并在cookie中设置了安全标志,Firesheep会劫持会话cookie。我不得不搜索一些东西才找到这两个东西,所以我想在此发布我所发现的内容,看看是否还有其他需要注意的地方。

步骤1 强制使用SSL

我找到了两种方法可以实现这一点。一种是使用ssl_requirement插件,但这很麻烦,因为您必须在每个控制器中具体指定ssl_required :action1, :action2

较为可取的方式似乎是通过Rack Middleware来实现,具体请参考这篇帖子:在Rails 2应用程序中使用ssl_requirement强制使用SSL。效果很好。

步骤2 让cookies变得更加安全

对于此操作,我按照这些说明进行操作,该说明告诉您将以下内容放入config/environment/production.rb文件中:

config.action_controller.session = {
    :key     => 'name_of_session_goes_here',
    :secret          => 'you need to fill in a fairly long secret here and obviously do not copy paste this one',
    :expire_after    => 14 * 24 * 3600, #I keep folks logged in for two weeks
    :secure => true #The session will now not be sent or received on HTTP requests.
  }

在我的Rails 2.x应用程序中,这一切都非常简单明了。我有什么遗漏吗?Rails 3会有所不同吗?

2个回答

17

在我看来,这看起来相当不错。尽管在Rails 3中默认情况下会在config/initializers/session_store.rb文件中存储会话配置,但实际上很相似。我通常会调整我的配置,使其类似于...

MyApp::Application.config.session_store :cookie_store, :key => '_my_app_session',
                                                       :secure => Rails.env == 'production', # Only send cookie over SSL when in production mode
                                                       :httponly => true, # Don't allow Javascript to access the cookie (mitigates cookie-based XSS exploits)
                                                       :expire_after => 60.minutes

秘密保存在config/initializers/secret_token.rb文件中:

MyApp::Application.config.secret_token = 'secret secrets are no fun...'

如果您可以访问Apache(或其他)配置文件,您还可以在该级别强制使用SSL。我认为这是更合适的地方,但我想并非每个人都有这个选项。

谢谢回复。我正在部署到Heroku,所以中间件似乎是强制SSL的最佳位置。 - Max Masnick
3
请注意,使cookie对JavaScript不可访问的选项是:httponly而不是:http_only。后者在Rails 2.3(或更早版本)中已被弃用,并在Rails 3中删除。我认为这些变化是为了将Rails与Rack保持一致。 - Paul Annesley
2
不错的回答,但在测试中使用HTTP,在生产中使用HTTPS会很容易忽略混合内容问题和其他微妙的错误。 - Mike Samuel
2
我认为这种写法更易读::secure => Rails.env.production?,在我的情况下实际上是 :secure => (Rails.env.staging? || Rails.env.production?),或者也可以是 :secure => !(Rails.env.test? || Rails.env.development?)... 默认情况下是安全的。 - pupeno
秘密伤害别人。 - Tallboy

1

既然这篇stackoverflow的帖子在谷歌排名很高,我想我应该分享一下我用于保护应用程序的方法。

如果你想确保SSL并确保安全的cookie,那么可以使用Rack中间件:

https://github.com/tobmatth/rack-ssl-enforcer

我评估了许多不同的选项和配置设置来完成这个任务,但rack中间件感觉是最好的选择,配置最少 - 非常容易部署。它有一些很棒的配置选项,可以过滤特定规则、主机、路径等。
我测试了它确实正确地设置了安全cookie,而且只有在注销并重新登录时才会这样做 - 但那是使用Devise时的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接