SV.CSRF.ORIGIN

このエラーは、要求を検証しない状態変更要求ハンドラが同一生成元であることを示します。

脆弱性とリスク

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

要求が同一生成元ポリシーに準拠していることを確認するために、標準の HTTP ヘッダー (Origin、Referer) をチェックして比較する必要があります。Origin または Referer ヘッダーによって示されるソース生成元が期待される生成元と一致しない場合は、クロスオリジン (生成元) 要求が存在します。

コード例

脆弱コード例 1

コピー
    void doPost(HttpServletRequest req, HttpServletResponse resp) {
        String action = req.getParameter("action");
        String id = req.getParameter("id");
    
       if("update".equals(action)){
           updateUser(id, req);
       }
       //...
   }

   void updateUser(String userid, HttpServletRequest req) {
       //...
   }

SV.CSRF.ORIGIN が 6 行目に対して報告されています。「req」は、同一生成元要求であることが検証されません。攻撃者は、ユーザーに代わってユーザーのブラウザが悪意のあるサイトから要求を行うように仕掛ける可能性があります。

修正コード例 1

コピー
    void doPost(HttpServletRequest req, HttpServletResponse resp) { 
        String origin = req.getHeader("Origin")
        if(isSameOriginRequest(origin)) {
            String action = req.getParameter("action");
           String id = req.getParameter("id");

           if ("update".equals(action)) {
               updateUser(id, req);
           }
       }
       //...
   }

   void updateUser(String userid, HttpServletRequest req) {
       //...
   }

この例では、標準ヘッダーで要求元をチェックし (Origin ヘッダーを調べて) 、期待値と比較します。値が一致する場合、要求は同一生成元です。

拡張機能

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