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

$rails新测试$rails g脚手架物品名称:string

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

那么,为什么这行在没有提供令牌的情况下成功地创建了一个新的Thing呢。

$curl-F“事物[name]=abc123”http://localhost:3000/things

日志条目显示:

于2011-07-05 08:29:18+0100开始发布127.0.0.1的“/things”由ThingsController#create作为处理参数:{“thing”=>{“name”=>“abc123”}}AREL(0.3ms)插入“事物”(“name”,“created_at”,“updated_at“)值('abc123','2011-07-05 07:29:18.484457','2011年07月05日07:29:18.484457')已重定向至http://localhost:3000/things/18在89ms内找到完成的302

我还可以删除记录:

$curl-X删除http://localhost:3000/things/18

在生产模式中也会发生同样的情况。这不是让我的申请对CSRF开放吗?

1
  • 您是否根据会话ID对用户进行身份验证?
    – 北极熊
    评论 2011年7月5日10:53

1答案1

重置为默认值
2

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

更多信息:Rails CSRF保护如何工作?

  • 所以,如果我想使用http basic进行身份验证,那么protect_from_forgery不会保护我吗?我似乎记得,在以前的版本中,对令牌的检查更为严格。 评论 2011年7月5日14:57
  • @史蒂芬:我已经测试过了,好像保护格式伪造使用HTTP Basic Auth时不会保护您。因为这没有任何意义。 评论 2011年7月5日15:16
  • 1
    如果我登录(使用http basic),然后浏览包含以下表单的远程站点,该怎么办:<form method=“post”action=“mysite公司…“>。如果检查了令牌,那么这不会构成威胁。顺便说一句,我可以通过向控制器的创建、更新和删除方法中添加“verify_authenticity_token”来获得我想要的行为。只是奇怪的是,这不是默认值。 评论 2011年7月5日15:42

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.