0

この質問の続きです。

私のアプリケーションには、Task モデルがあります。複数のページが 1 つのタスクの「編集」URL にリンクできます。たとえば、 fromと(ユーザーが別のモデルである) に/tasks/1/editリンクされています。/tasks/1user/1/

私のコントローラーでは、「編集」が「更新」アクションを介して送信された後、参照ページのいずれかにリダイレクトできるようにしたいと考えています。たとえば、/tasks/1/editfromに移動した場合user/1/、「更新」アクションの後、 にリダイレクトしuser/1/ます。/tasks/1/editからに行っても同じ/tasks/1です。

私のGET「編集」アクションでは、次のことを行っています。

@task = Task.find(params[:id])

if request.referer and (request.referer == task_url(@task) or request.referer == user_url(@task.user))
  session[:return_to] = request.referer
else
  session.delete(:return_to)
end

対応する PUT の「更新」アクションで、次のことを行います。

@task = Task.find(params[:id])

respond_to do |format|
  if @task.update_attributes(params[:task])
    format.html { redirect_to session.has_key?(:return_to) ? session[:return_to] : @task #return to task if no return_to specified
  else
    ...
  end
end

session[:return_to]これは機能しますが、クライアントが「更新」でなりすまし/偽造して、必要なページにリダイレクトできるようになるのではないかと心配しています。

それは問題ですか?これは正当な懸念事項ですか?session[:return_to]「更新」で検証する必要がありますか?

4

1 に答える 1

0

要するに、はい...

request.referrer には、ユーザーをサイトに誘導した URL が保存されます。次の操作を行った場合:

  1. 静的 HTML ページを作成する
  2. /task/1/edit へのリンクを埋め込む
  3. 更新の最後に、静的 Web ページにリダイレクトされます。

この問題を解決するには、場所を示すセッション変数を保存する必要があります (たとえば、UsersController で before_filter を実行し、session[:return_task_update_to] = :users を設定します)。

そして、更新の最後にリダイレクトして、セッションの :return_task_update_to 変数をクリアします。セッション変数がない場合も、明らかにケースを処理します (その場合、デフォルトとして意味のあるものにリダイレクトします)。

この方法では、URL を検証したり、おかしなことをしたりする必要はありません。セッションで状態を設定し、存在する場合はリダイレクトするだけです。

于 2012-08-24T06:32:47.457 に答える