2

在 Rails 3 中引入新的 Rails 路由 DSL 之前,大多数应用程序都采用简单但有效的默认路由规则,适合 99% 的场景,实际上可以在不考虑接触路由配置的情况下做很多事情:

# Install the default route as the lowest priority.
map.connect ':controller/:action/:id.:format'
map.connect ':controller/:action/:id'

如果我理解正确,自从在 Rails 3 中引入新的路由 DSL 以来,这种做法已被弃用。我知道可以使用动态段定义来模拟这种行为,但无论如何,不​​再生成“最低优先级的默认路由”。

为什么会这样?有什么道理吗?当前的文档RailsCasts详细解释了语法,但他们真的没有提供任何信息来说明为什么使用 catch-all 最低优先级默认路由规则被认为是一种糟糕的、过时的做法?

4

1 回答 1

3

你不应该在 Rails 2 中使用,map.connect就像你不应该在 Rails 3 中使用一样。Catch-all 路由容易受到CSRF 攻击。您可能会从研究中学到更多,而不是我试图向您解释它,但基本上:dynamic segmentsmatch

  1. POST 请求是唯一能够更改应用程序状态的请求类型。所以你通常通过 HTML 表单提交来改变状态。

  2. 使用包罗万象的路由,GET 和 POST 请求都被重定向到相同的操作。这意味着您可以使用 GET 请求更改状态!

  3. 这是非常危险的。假设某家银行使用包罗万象的路由。我可以伪造这样的网址:

    http://somebank.com/withdraw?amount=1000000&from=GreyCat&to=Ashitaka
    

    并把链接发给你。通过访问它,您无需通过 POST 请求提交 HTML 表单即可更改应用程序状态。

这就是为什么在 Rails 4 中,match它被固定为只能使用该via选项,如下所示:

match "/users/:id" => "users#show", :via => :get

人们在match不考虑使用它所产生的问题的情况下随意使用。所以现在match需要这样写。但是,您可以(并且应该)将其重写为:

get "/users/:id" => "users#show"

我总是喜欢链接到我们的俄罗斯铁路黑客安全研究员 Egor Homakov 的博客,因为他以极大的热情和热情解释了他发现的安全问题。他实际上为 Rails 做出了贡献,并试图提高它的安全性,所以他应该得到所有的认可。这是他的博客文章,解释了为什么 match is evil

于 2013-10-23T01:04:28.247 回答