Rails 3及以上:默认的隐式路由规则被认为是一种不好的做法,为什么?

时间:2013-10-22 22:09:35

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 rails-routing

在Rails 3中引入新的Rails路由DSL之前,大多数应用程序都采用简单但有效的默认路由规则,适合99%的场景,实际上可以在不考虑触及路由配置的情况下完成大量工作:< / p>

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

如果我理解正确,自从在Rails 3中引入新的路由DSL以来,这种做法已被弃用。我知道这种行为可以使用dynamic segments definition进行模拟,但无论如何,没有&#34;默认路由的优先级最低&#34;已经生成了。

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

1 个答案:

答案 0 :(得分:3)

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

  1. POST请求是应该能够更改应用程序状态的唯一类型的请求。因此,您通常会通过HTML表单提交来更改状态。

  2. 使用catch-all路由,GET和POST请求都会重定向到相同的操作。这意味着您可以使用GET请求更改状态!

  3. 这非常危险。让我们假设一些银行使用全能路由。我可以伪造这样的网址:

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

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

  4. 这就是为什么在Rails 4中,match被修复为仅使用via选项,如下所示:

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

    人们在不考虑他们使用它们创建的问题的情况下不假思索地使用match。所以现在match需要这样写。但是,您可以(并且应该)将其重写为:

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

    我总是喜欢链接到我们的俄罗斯Rails 黑客安全研究员Egor Homakov的博客,因为他解释了他发现的安全问题,充满了激情和热情。他实际上为Rails做出了贡献,并试图提高其安全性,因此他应得到所有人的认可。这是他的blog post explaining why match is evil