【问题标题】:CSRF not working in Rails?CSRF 在 Rails 中不起作用?
【发布时间】:2011-09-28 14:19:37
【问题描述】:

如果我创建一个全新的 Rails 应用程序(使用 Rails 3.0.9)并快速搭建如下脚手架:

$ rails new testing
$ rails g scaffold thing name:string

那么 app/controllers/application_controller.rb 默认包含一个“protect_from_forgery”,所以它应该在 POST 创建期间检查authenticity_token。至少,这是我的理解。

那么,为什么在不提供令牌的情况下,这一行是否成功创建了新事物。

$ curl -F "thing[name]=abc123" http://localhost:3000/things

日志条目说:

Started POST "/things" for 127.0.0.1 at 2011-07-05 08:29:18 +0100
  Processing by ThingsController#create as 
  Parameters: {"thing"=>{"name"=>"abc123"}}
  AREL (0.3ms)  INSERT INTO "things" ("name", "created_at", "updated_at") VALUES  ('abc123', '2011-07-05 07:29:18.484457', '2011-07-05 07:29:18.484457')
Redirected to http://localhost:3000/things/18
Completed 302 Found in 89ms

我也可以这样做来删除记录:

$ curl -X DELETE http://localhost:3000/things/18

在生产模式中也会发生同样的事情。这不会让我的应用程序对 CSRF 开放吗?

【问题讨论】:

  • 您是否根据会话 ID 对用户进行身份验证?

标签: ruby-on-rails csrf


【解决方案1】:

如果你传递了无效的 CSRF 令牌或在没有它的情况下发送请求,Rails 将取消会话,因此如果每个人都可以访问你的应用程序,protect_form_forgery 将毫无用处。 但如果你有基于会话的身份验证系统,它将使你的应用免受 CSRF 攻击。

更多信息:How does Rails CSRF protection work?

【讨论】:

  • 那么如果我想使用http basic进行身份验证,那么protect_from_forgery就不能保护我了?我似乎记得在以前的版本中,对令牌的检查更加积极。
  • @SteveP:我已经测试过了,似乎protect_form_forgery 在您使用 HTTP 基本身份验证时不会保护您。因为它没有任何意义。
  • 如果我登录(使用 http basic)然后浏览一个包含如下表单的远程站点会怎样:
    mysite..."> .如果检查了令牌,则不会构成威胁。顺便说一句,我可以通过在控制器的创建、更新和删除方法中添加“verify_authenticity_token”来获得我想要的行为。只是惊讶这不是默认设置。
猜你喜欢
  • 2014-06-21
  • 2018-12-01
  • 2017-04-22
  • 2018-07-20
  • 2020-11-21
  • 1970-01-01
  • 2023-03-04
  • 2014-03-22
  • 2015-09-21
相关资源
最近更新 更多