2012-08-24 4 views
0

후속의 종류 this question.모든 컨트롤러 작업에서 세션 변수의 유효성을 검사해야합니까? (레일)

내 응용 프로그램에는 Task 모델이 있습니다. 여러 페이지가 하나의 작업의 "편집"URL에 연결할 수 있습니다. 예를 들어, /tasks/1/edit/tasks/1user/1/ (사용자가 다른 모델 임)에 연결됩니다.

내 컨트롤러에서 "편집"이 "업데이트"작업을 통해 제출 된 후 참조 페이지 중 하나를 다시 리디렉션 할 수 있기를 원합니다. 예를 들어 에서 user/1/으로 이동 한 후 "업데이트"작업을 수행 한 후 user/1/으로 다시 리디렉션하려고합니다. 내가 /tasks/1/edit에 가면 같은 거래가 /tasks/1에서 나온다. 내 GET "편집"동작에서

내가 뭐하는 거지 :

@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 

이 작동하지만 클라이언트가 걱정 : 해당 PUT에서

@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 

"갱신"조치 내가 할 "업데이트"에서 session[:return_to]을 스푸핑/위조하여 원하는 페이지로 리디렉션 할 수 있습니다.

중요합니까? 이것이 유효한 관심사입니까? "업데이트"에서 session[:return_to]의 유효성을 검사해야합니까? 네, 한마디로

답변

0

...

request.referrer 저장 사이트에 사용자를 가져온 URL. 다음 한 경우

  1. 정적 HTML 페이지
  2. 삽입 업데이트의 끝에서/작업에 대한 링크/1/편집
  3. 만들기, 그것은 정적 웹 페이지로 다시 리디렉션 것 .

이 문제를 해결하기 위해 무엇을해야하는 위치를 나타냅니다 세션 변수를 저장할 수있다 (당신의 UsersController에서하는 before_filter 및 설정 세션을 수행 예를 들어 [: return_task_update_to] = 사용자)

그리고 다음을 , 업데이트가 끝나면 리디렉션하고 세션의 return_task_update_to 변수를 지 웁니다. 세션 변수가없는 경우에도 분명히 대소 문자를 처리하게됩니다 (이 경우 기본으로 설정된 의미로 리디렉션됩니다).

이렇게하면 URL의 유효성을 검사하거나 미친 짓을하지 않아도됩니다. 세션에서 상태를 설정하고 리디렉션 된 경우에만 리디렉션하십시오.

+0

예제를 제공해 주시겠습니까? 나는 당신이 무엇을 의미하는지 그리고 내가 필터를하기로되어 있는지를 잘 모릅니다. –

관련 문제