EN JP CN

SV.CSRF.TOKEN

SV.CSRF.TOKEN

このエラーは、保存されている CSRF トークンに対する着信要求を検証しない状態変更要求ハンドラを示します。

脆弱性とリスク

クロスサイトリクエストフォージェリ (CSRF) は、悪意のある Web サイト、電子メール、ブログ、インスタントメッセージ、またはプログラムによって、ユーザーが現在認証されている信頼済みサイトでユーザーの Web ブラウザが不正なアクションを実行した場合に発生する攻撃の一種です。

CSRF の脆弱性を軽減するための標準的なアプローチは、シンクロナイザトークンを使用することです。暗号的に安全なランダムトークンは、ユーザーセッションに一意的に関連付けられ、状態変更操作をもたらす任意のフォームへの隠しフィールドとして追加されます。CSRF トークンが検証に失敗した場合、サーバーは要求されたアクションを拒否します。

コード例

脆弱コード例 1

6    void doPost(HttpServletRequest req, HttpServletResponse resp) {
7        String action = req.getParameter("action");
8        String id = req.getParameter("id");
9    
10       if("update".equals(action)){
11           updateUser(id, req);
12       }
13       //...
14   }
15
16   void updateUser(String userid, HttpServletRequest req) {
17       //...
18   }

SV.CSRF.TOKEN が 6 行目に対して報告されています。「req」は、可能性のあるクロスサイトリクエストフォージェリ攻撃に対してチェックされません。ハンドラは、アプリケーションの状態を変更する前に、有効な CSRF トークンが要求に含まれていることを確認する必要があります。

修正コード例 1

6    void doPost(HttpServletRequest req, HttpServletResponse resp) {
7        if
8    (req.getParameter("_csrf_token").equals(req.getSession().getAttribute("_csrf_token"))) {
9            String action = req.getParameter("action");
10           String id = req.getParameter("id");
11 
12           if ("update".equals(action)) {
13               updateUser(id, req);
14           }
15           //...
16       }
17   }
18
19   void updateUser(String id, HttpServletRequest req) {
20       //...
21   }

更新されたコードは、アプリケーションの状態を変更する前に要求を検証します。要求とともに発行されたトークンがユーザーのセッションに保存されたトークンと一致しない場合、その要求は拒否されます。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。