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を愛用