Ruby on rails 我是否需要在每个控制器操作中验证会话变量?(轨道)

Ruby on rails 我是否需要在每个控制器操作中验证会话变量?(轨道),ruby-on-rails,rest,redirect,controller,Ruby On Rails,Rest,Redirect,Controller,从某种程度上说,这是我们的后续行动 在我的应用程序中,我有一个任务模型。多个页面可以链接到单个任务的“编辑”url。例如,/tasks/1/edit链接到来自/tasks/1和用户/1/(用户是另一个模型) 在我的控制器中,我希望能够在通过“更新”操作提交“编辑”后重定向回任何一个引用页面。例如,如果我从user/1/转到/tasks/1/编辑,在执行“更新”操作后,我想重定向回user/1/。如果我从/tasks/1转到/tasks/1/编辑,同样的交易 在获取“编辑”操作中,我正在执行: @

从某种程度上说,这是我们的后续行动

在我的应用程序中,我有一个任务模型。多个页面可以链接到单个任务的“编辑”url。例如,
/tasks/1/edit
链接到来自
/tasks/1
用户/1/
(用户是另一个模型)

在我的控制器中,我希望能够在通过“更新”操作提交“编辑”后重定向回任何一个引用页面。例如,如果我从
user/1/
转到
/tasks/1/编辑
,在执行“更新”操作后,我想重定向回
user/1/
。如果我从
/tasks/1
转到
/tasks/1/编辑
,同样的交易

在获取“编辑”操作中,我正在执行:

@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
这是可行的,但我担心客户端可能在“更新”中欺骗/伪造他们的
会话[:return\u to]
,从而允许他们重定向到他们想要的任何页面

那有关系吗?这是一个合理的担忧吗?我是否需要在“更新”中验证
会话[:return\u to]

简言之,是

request.referer存储将用户带到站点的URL。如果您执行了以下操作:

  • 创建一个静态HTML页面
  • 嵌入指向/task/1/edit的链接
  • 在更新结束时,它将重定向回静态网页
  • 要解决此问题,您应该存储一个表示位置的会话变量(例如,在UsersController中,执行before_筛选器并设置会话[:return_task_update_To]=:users)

    然后,在更新结束时,重定向回会话,并清除:return_task_update_to变量。如果没有会话变量(在这种情况下,您将重定向到任何有意义的默认值),您显然也会处理这种情况


    这样,您就不需要验证URL或做一些疯狂的事情。只需在会话中设置状态,如果存在则重定向。

    您能提供一个示例吗?我不太清楚你的意思以及我应该在哪里做过滤器。