Ruby on rails 我是否需要在每个控制器操作中验证会话变量?(轨道)
从某种程度上说,这是我们的后续行动 在我的应用程序中,我有一个任务模型。多个页面可以链接到单个任务的“编辑”url。例如,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/编辑,同样的交易 在获取“编辑”操作中,我正在执行: @
/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或做一些疯狂的事情。只需在会话中设置状态,如果存在则重定向。您能提供一个示例吗?我不太清楚你的意思以及我应该在哪里做过滤器。