CS.CSRF.VSUK.CONSTASSIGN

プロパティ 'ViewStateUserKey' に const 文字列が割り当てられます。

クロスサイトリクエストフォージェリ (CSRF) の防止は、普遍的な解決策がない複雑な問題です。CSRF の脆弱性が発生する可能性を減らす 1 つの方法は、要求ごとにトークンを返すようにブラウザに要求する、偽造防止トークンを使用することです。ASP.NET WebForm アプリケーションでは、"System.Web.UI.Page" クラスの 'ViewStateUserKey' を設定することで、これを実行することができます。CS.CSRF.VSUK ファミリは、ページの初期化中に、プロパティ 'ViewStateUserKey' が正しく設定されているかどうかを(つまり、'Page_Init' または 'OnInit' または 'OnPreInit' のいずれかのメソッドで) 検証します。

有効にするには、このプロパティの値は定数であってはなりません。CS.CSRF.VSUK.CONSTASSIGN チェッカーは、初期化中に、定数が割り当てられている 'ViewStateUserKey' への割り当てにフラグを立てます。

脆弱性とリスク

クロスサイトリクエストフォージェリ (XSRF または CSRF とも呼ばれる) は、Web でホストされているアプリに対する攻撃であり、悪意のある Web アプリが、クライアントブラウザとそのブラウザを信頼する Web アプリとの間の相互作用に影響を与える可能性があります。Web サーバーが、意図的に送信されたことを確認するメカニズムなしに、クライアントからの要求を受信するように設計されている場合、攻撃者はクライアントをだまして Web サーバーに意図しない要求を行わせ、信頼できる要求として処理させてしまう可能性があります。これは、URL、画像のロード、XMLHttpRequest などを通じて実行することができ、データの公開や意図しないコードの実行を引き起こす可能性があります。この攻撃はユーザーの以前に認証されたセッションを利用するため、こうした悪用の形式は、ワンクリック攻撃またはセッションライディングとも呼ばれます。

脆弱コード例

コピー
   using System;
   using System.Web.UI;
    
   namespace Example
   {
       public partial class About : Page
       {
           protected void Page_Init(object sender, EventArgs e)
           {
              //Page Initialization
              ViewStateUserKey = "test"; //@ CS.CSRF.VSUK.CONSTASSIGN
          }
      }
  }

この例では、タイプが 'System.Web.UI.Page' (つまり .aspx ページの背後にあるコード) であるクラス 'About' は、'ViewStateUserKey' に定数値を割り当てます。これにより、Web サイトのユーザーは CSRF 攻撃に脆弱な状態になります。Klocwork は、11 行目でこの脆弱性を CS.CSRF.VSUK.CONSTASSIGN の欠陥として報告します。

修正コード例

コピー
   using System;
   using System.Web.UI;
    
   namespace Example
   {
       public partial class About : Page
       {
           protected void Page_Init(object sender, EventArgs e)
           {
              //Page Initialization
              ViewStateUserKey = Session.SessionID; //@no CS.CSRF.VSUK.CONSTASSIGN
          }
      }
  }

この修正されたコード例では、ページの初期化中に、'ViewStateUserKey' に非 const 値が割り当てられます。これは、ASP.NET WebForms アプリケーションで CSRF 攻撃を回避するために、Microsoft が推奨する方法です。