2017-06-12 10 views
1

私が始めたアプリケーションには、クロスサイト偽造要求(CSFR)の予防措置がありますしかし、要求を得るためではありません。java - クロスサイト偽造要求を防ぐにはどうすればいいですか

私は、起源の起源と起源の目標を取得し、それぞれのホストを比較し、それらが一致するかどうかによって何かを行うことができるということも知らされました。現時点では、私は現在、いくつかの調査を行った後、以下を持っていますが、私はまだそこにいませんし、いくつかの追加の助けを使うことができます。私は職業には非常に慣れているので、私が正しい道にいるかどうかは分かりません。

String refererHost = ((HttpServletRequest) request).getHeader("referer"); 

    String targetHost = request.getServerName(); 

    try {  
     refererHost = new URI(refererHost).getHost(); 

     if(!refererHost.equals(targetHost)) 
     { 
      ((HttpServletResponse) response).sendRedirect(((HttpServletRequest)request).getContextPath()+ADMIN_LOGOFF_URL); 
     } 
    } catch (MalformedURIException | NullPointerException e) { 
     request.getRequestDispatcher(ADMIN_LOGOFF_URL).forward(request, response); 
    } 
+2

GETリクエストは、HTTP仕様に従って状態に影響を与えるべきではありません。 CSRFからのリクエストを得るための最善の方法は、それを守ることです。あなたのコードに関しては、あなたが期待するように動作しないものを記述する必要があります。 – Taylor

答えて

1

OWASPが推奨します。投稿されたコード(フィルタであることを前提としています)は推奨事項の1つで、適切なトラックに収められています。トークンを使用することもお勧めします。あまりあまり再モデリングすることなく、POSTのためにすでに行われていたことを再利用できることを願っています。

また、フレームワーク(もしあれば)がCSRFをサポートしているかどうかをチェックして、独自のコードを書く必要はありません。

+0

ありがとうアンドリューとはいそれはフィルタです。トークンはポストリクエストとともに使用されます。今のところ、私は、ソース/ターゲットホストが正しく比較していると信じています。そうでなければ、ユーザーセッションを終了するか、ログオフ画面にそれらを指示します。 – gsnurr3

0

まず名前付けの問題があります。その名前はCSRFです。 ここで私は、参照サイトを引用:

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

クロスサイトリクエストフォージェリ(CSRF)は、それらが だしたWebアプリケーション上の不要なアクションを実行するために、エンドユーザー を強制的攻撃であります現在認証されています。 CSRF攻撃は具体的には の状態変更要求をターゲットとし、データの盗難ではありません。攻撃者は偽造要求への応答を確認する方法がないためです。

状態変更要求は、対象サイトの状態を変更できる要求です。アプリケーションがうまく書かれていれば、POST、DELETE、またはUPDATEの状態を変更するためにGETメソッドが読み込まれるだけです(POSTメソッドを保護するだけでなく、それだけでなく)。

明確にする例を作ってみましょう。銀行口座にログインしているとします。あなたが攻撃を受けている場合、PC上のアプリケーションは正当なアプリケーションのボタンをクリックするのと同じ方法で電信送金を実行するPOSTを呼び出すことがあります。

この攻撃によってあなた自身を守るには合理的な方法はありますか? 私はそのうちの2つを知っています。

最初のものは、危険なものの前のページが呼び出されたときにランダムなトークンを作成することです(GETメソッドで取得したページを宛先とするページを表示すると思います)。このランダムなトークンは、ユーザーのセッションに保存する必要があります。また、隠しフィールドとしてページに表示する必要があります。 POSTメソッドがサーバー側で実行されるとき、隠しフィールドから来るランダムトークンは、ユーザーのセッションに格納されているものと比較されなければなりません。一致しない場合は、取引を拒否する必要があります。

第2のものは確認を求めることから成っているかもしれませんが、おそらくユーザにはキャプチャを使用してください。 enter link description here セキュリティは、すべてのアプリケーションが持つことが期待される品質であるため、すべての開発者のための非常に良い出発点である:私はこのサイトから開始するようにあなたをお勧めするより詳細な情報については

関連する問題