5

Rails 4 アプリケーションがあり、Brakeman を実行すると、create アクションで保護されていないリダイレクトが (正しく) 識別されます。ただし、 only_path: true ( Brakeman Railscastのように) を追加しても、警告は解決されません。

  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

結果:

+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>>
+------------+-----------------------+---------+--------------+----------------------------------------------------------------------------------------------------------------------->>

これはなぜでしょうか?Brakeman はまだどのようなリスクを特定していますか?

4

1 に答える 1

9

残念ながら、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 は安全なリダイレクトのための簡単なオプションを提供していません。

于 2014-09-16T22:18:42.800 に答える