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は構文を詳細に説明していますが、キャッチオールの最低優先度のデフォルトルーティングルールを使用することが悪い、時代遅れの慣行と見なされる理由について、実際には何の情報も提供していませんか?

4

1 に答える 1

3

map.connectRails 2では使用しないdynamic segmentsでくださいmatch。Rails 3 では使用しないでください。Catch-all ルーティングは、CSRF 攻撃に対して脆弱です。おそらく、私が説明しようとするよりも、これを調査することで多くのことを学ぶことができるでしょうが、基本的には次のとおりです。

  1. POST リクエストは、アプリケーションの状態を変更できる唯一のタイプのリクエストです。そのため、通常は HTML フォームの送信によって状態を変更します。

  2. キャッチオール ルーティングを使用すると、GET 要求と POST 要求の両方が同じアクションにリダイレクトされます。これは、GET リクエストを使用して状態を変更できることを意味します。

  3. これは非常に危険です。一部の銀行がキャッチオール ルーティングを使用しているとします。次のような URL を偽造できます。

    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 に貢献し、Rails のセキュリティを改善しようとしているので、彼が得ることができるすべての評価に値します。なぜマッチが悪なのかを説明している彼のブログ記事はこちらです。

于 2013-10-23T01:04:28.247 に答える