4

私は Ruby on Rails 4.1.1 を使用しています。次のように、url_forメソッドに直接渡されるパラメーターを (URL クエリ文字列を介して) 受け入れることを考えています。

# URL in the browser
http://www.myapp.com?redirect_to[controller]=users&redirect_to[action]=show&redirect_to[id]=1

# Controller
...
redirect_to url_for(params[:redirect_to].merge(:only_path => true))

上記のアプローチを採用すると、アクションの実行後にユーザーをリダイレクトできます。paramsただし、セキュリティ上の問題につながる可能性のある恣意的な入力ができると思います...

メソッドに入力する URL パラメーターを受け入れても安全url_forですか? 落とし穴とは?最悪の場合、何が起こりますか?


アプリケーションへのリクエスト中にログを記録paramsすることで、Rails が常に パラメーター:controllerを追加していることに気付きました。内部で保護されており、Rails が意図しているように動作するため、action確認は上記の方法で使用できる可能性があります。url_for

4

3 に答える 3

2

Ruby On Rails はHTTP リダイレクト応答のみを発行するため、これは内部的に安全です。

これを使用していると、オープン リダイレクトの脆弱性only_pathから保護されます。これは、次の形式のリンクを含む電子メールが攻撃者によって送信される場所です (あなたのサイトが であるとします)。example.com

https://example.com?foo=bar&bar=foo&redirect=http://evil.com

ユーザーが URL を確認し、それがexample.comドメイン上にあることを確認すると、安全であると信じてリンクをクリックします。ただし、オープン リダイレクトがある場合、ユーザーは気付かないうちevil.comにパスワードを要求される可能性があります。example.com

サイトのみの相対パスにリダイレクトすると、脆弱性が修正されます。

あなたの場合、コントローラー、アクション、およびパラメーターをユーザーに制御させています。GET メソッドが安全である(副作用がない) 限り、攻撃者はユーザーが開く巧妙なリンクを作成してこれを使用することはできません。

要約すると、提供された情報から、アプリケーションへのフィッシング URL によるリスクは見られません。

于 2015-02-05T10:16:57.413 に答える
0

Railsredirect_toは HTTP ステータス コードを に設定し、で定義した新しいパスを302 Foundブラウザに伝えます。とは対照的に、安全な方法と見なされます。GETurl_forGET

... POST、PUT、DELETE、PATCH などのメソッドは、サーバーまたは外部の副作用のいずれかで副作用を引き起こす可能性のあるアクションを対象としています ...

唯一の問題create、誰かがやなどのメソッドにアクセスできた場合destroyです。GETこれらのメソッドは(それぞれPOSTおよび)以外の HTTP メソッドを使用するためDELETE、問題はないはずです。

ここでのもう 1 つの危険は、REST の CRUD メソッドを超えて、データベースの状態に応答しGET て変更するカスタム メソッドがある場合です。

ルート.rb

resources something do
  member do
    get :my_action
  end
end

何かコントローラー

def my_action
  # delte some records
end

将来の参考のために:

Rails には、あなたも興味を持つかもしれない多くのセキュリティ対策があります。

于 2015-02-04T15:55:50.650 に答える
0

それは正確な答えではありません。次のようなものを使用すべきではないことを指摘したかっただけです

url_for(params)

パラメータとして渡される可能性があるため、URLが別のサイトにつながる可能性があり、キャッシュされると悪化する可能性がありますhostport

それが何かを脅かすかどうかはわかりませんが、指摘する価値はあります

于 2015-05-09T09:02:09.263 に答える