gpt4 book ai didi

ruby-on-rails - Rails 3 及更高版本 : default implicit routing rule is considered a bad practice, 为什么?

转载 作者:行者123 更新时间:2023-12-04 04:37:19 25 4
gpt4 key购买 nike

在 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,这种做法已被弃用。我知道可以使用 dynamic segments definition 模拟这种行为。 ,但无论如何,不​​再生成“最低优先级的默认路由”。

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

最佳答案

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

  • POST 请求是唯一能够改变应用程序状态的请求类型。所以你通常通过 HTML 表单提交来改变状态。
  • 使用包罗万象的路由,GET 和 POST 请求都被重定向到相同的操作。这意味着您可以使用 GET 请求更改状态!
  • 这是非常危险的。让我们假设某家银行使用全面路由。我可以伪造这样的网址:
    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"

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

    关于ruby-on-rails - Rails 3 及更高版本 : default implicit routing rule is considered a bad practice, 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529301/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com