2014-09-16 2 views
4

레일 4 애플리케이션이 있고 Brakeman을 실행할 때 작성 액션에서 보호되지 않은 리디렉션을 식별합니다 (올바르게). only_path에 의해 보호되지 않는 리디렉션이 치료되지 않음

+SECURITY WARNINGS+ 

+------------+-----------------------+---------+--------------+----------------------------------------------------------------------------------------------------------------------->> 
| Confidence | Class     | Method | Warning Type | Message                            >> 
+------------+-----------------------+---------+--------------+----------------------------------------------------------------------------------------------------------------------->> 
| High  | PortfoliosController | create | Redirect  | Possible unprotected redirect near line 14: redirect_to(+params[:referrer]+, :notice => "Portfolio was successfully cr>> 
+------------+-----------------------+---------+--------------+----------------------------------------------------------------------------------------------------------------------->> 

왜이 될 수 있습니다에

def create 
    refer_url = params[:referrer] 
    @portfolio = current_user.portfolios.build(portfolio_params) 
    if @portfolio.save 
     redirect_to refer_url, notice: "Portfolio was successfully created.", only_path: true 
    else 
     render :new 
    end 
    end 

결과 : 경고를 치료하지 않는합니다 (Brakeman Railscast 같이) 사실 : 그러나, only_path 추가? 브레 커먼은 아직도 어떤 위험을 느끼고 있습니까?

답변

6

RailsCast가 올바르지 않습니다. :only_path => true첫 번째 인수의 일부 여야합니다.

응용 프로그램의 경로가 params[:referrer]입니까?

그렇다면, 이건 내 추천 것 :

begin 
    refer_url = URI.parse(params[:referrer]).path 
rescue URI::InvalidURIError 
    refer_url = "some_default" 
end 

아니면 params[:referrer] 항상 경로인지 확인 그것을 다른 방법의 유효성을 검사하거나 임의 심지어 응용 프로그램 내에서 리디렉션을 허용하지 않습니다 수 있습니다. 안타깝게도 Rails는 안전한 리디렉션 옵션을 제공하지 않습니다.

+0

이것은 실제로 Brakeman을 만족시키고 매우 합리적인 것입니다. 고맙습니다! '''경우 PARAMS [: 참조 자] = ~ URI :: 정규 표현식 refer_url = URI.parse (PARAMS [: 리퍼러). 다른 경로 – thusson

+0

나는 그것을 제어 흐름에 대한 예외를 사용하는 것이 더없는 것 같아요 refer_url = "some_default" end''' – haslo

관련 문제