ASP.NETのViewState値の文字列の暗号化を無効にする - ASP.NET

ASP.NETのViewState値の文字列の暗号化を無効にする手順を紹介します。

概要

ASP.NETのWebフォームではポストバック後にWebフォームのコントロールの状態を保持するためViewStateと呼ばれる値を用います。ViewStateの値はhiddenフィールドに格納されていますが、ASP.NET 2.0以降ではデフォルトでは暗号化されています。(ASP.NET 1.0ではデフォルトでは暗号化されていません。)
通常は暗号化された文字列を利用して問題はありませんが、ViewStateの文字列を解析したい場合には暗号化を解除する必要があります。この記事ではViewStateの値の文字列の暗号化を解除する手順を紹介します。

ViewStateの値

ViewStateはWebフォームのbodyセクション内のhiddenフィールドに設定されます。
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(ここにViewStateの値が入ります。)" />

暗号化を解除する方法

ページごとに指定する場合

ページごとに個別に暗号化を解除する場合はWebフォーム(aspxファイル)のPageディレクティブに以下の値を設定します。
  • EnableViewStateMac="False"
  • ViewStateEncryptionMode="Never"
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm_DisabledCrypt.aspx.cs"
  Inherits="ViewStateEncrypt.WebForm_DisabledCrypt"
  EnableViewStateMac="False" ViewStateEncryptionMode="Never"%>

プロジェクト全体に指定する場合

Web.Config
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <pages enableViewStateMac="false" viewStateEncryptionMode="Never" />
  </system.web>
</configuration>
参考
以下の記述でもOKです。
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <pages enableViewState="false" enableViewStateMac="false" viewStateEncryptionMode="Never" />
  </system.web>
</configuration>

サンプルプログラム

UI

以下のUIを作成します。
WebForm_EnableCrypt.aspx


aspxファイルのコードは以下です。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm_EnabledCrypt.aspx.cs"
  Inherits="ViewStateEncrypt.WebForm_EnableCrypt" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <div><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
      <div><asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /></div>
    </div>
    </form>
</body>
</html>
WebForm_DisabledCrypt.aspx


aspxファイルのコードは以下です。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm_DisabledCrypt.aspx.cs"
  Inherits="ViewStateEncrypt.WebForm_DisabledCrypt"
  EnableViewStateMac="False" ViewStateEncryptionMode="Never"%>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <div><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
      <div><asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /></div>
    </div>
    </form>
</body>
</html>

コード

以下のコードを記述します。
WebForm_EnableCrypt.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ViewStateEncrypt
{
  public partial class WebForm_EnableCrypt : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
      Label1.Text = "Penguin";
      Label1.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0C0FF");

    }
  }
}
WebForm_DisabledCrypt.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ViewStateEncrypt
{
  public partial class WebForm_DisabledCrypt : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
      Label1.Text = "Penguin";
      Label1.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFC0C0");
    }
  }
}

実行結果

プロジェクトを実行します。

暗号化あり (WebForm_EnabledCrypt.aspx)

続いてWebForm_EnabledCrypt.aspxページを表示します。下図の画面が表示されます。


[Button]をクリックします。Labelの文字列が"Penguin"になり背景色が水色に変わります。この状態でページをリロードしても(ViewStateが有効になっているため)Labelの状態は変化しません。


ページのソースコードを表示します。


ViewStateのvalue文字列は以下です。
T8Gy4OzAHuHE9HIsp9+FYm9pj6j31I+b4ZtXdiWGgcWkQtYGFSTHYOSC3a9vtRWzUANDMzkzOwClpeQTMA7JkqZ8HxIrrqHhseIQTkD3KpNcOkn0guyhArVlpzZP3CU/FaEWY//0NMEZgDRVxMhkOcEOROzerLorMjleFOwl+wA=

暗号化なし (WebForm_DisabledCrypt.aspx)

WebForm_DisabledCrypt.aspxページを表示します。下図の画面が表示されます。


[Button]をクリックします。Labelの文字列が"Penguin"になり背景色がピンク色に変わります。この状態でページをリロードしても(ViewStateが有効になっているため)Labelの状態は変化しません。


ページのソースコードを表示します。Labelの背景色のカラーのみが異なる動作ですが、暗号化なしのほうがViewStateの値の文字列サイズが小さいことがわかります。


ViewStateのvalue文字列は以下です。
/wEPDwUJODc2NjQ3MjU1D2QWAgIDD2QWAgIBDw8WBh4EVGV4dAUHUGVuZ3Vpbh4JQmFja0NvbG9yCf/AwP8eBF8hU0ICCGRkZA==

補足

暗号化する場合は、machinekeyをweb.configに記述します。
<machineKey 
  validationKey="AutoGenerate,IsolateApps" 
  decryptionKey="AutoGenerate,IsolateApps" 
  validation="SHA1"
  decryption="Auto"
/>
各要素の説明はMSDNのページを参照してください。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2014-03-24
iPentec all rights reserverd.