让隐藏域更加
安全
在ASP.NET应用中,几乎所有HTML页面的__VIEWSTATE隐藏域中都可以找到有关应用的信息。由于__VIEWSTATE是BASE 64编码的,所以常常被忽略,但黑客可以方便地解码BASE 64数据,用不着花什么力气就可以得到__VIEWSTATE提供的详细资料。
■ 风险分析
默认情况下,__VIEWSTATE数据将包含:
⑴ 来自页面控件的动态数据。
⑵ 开发者在ViewState中显式保存的数据。
⑶ 上述数据的密码签字。
■ 解决方案
设置EnableViewStatMAC="true",启用__VIEWSTATE数据加密功能。然后,将machineKey验证类型设置成3DES,要求ASP.NET用Triple DES对称加密算法加密ViewState数据。
上面这段文字是摘自网络,我介绍一下关于上文中提到的设置方式:
1.启用_VIEWSTATE数据加密功能:
在网站项目的根目录下的webconfig文件中,找到<system.web>节点下的<pages>节点,设置其属性EnableViewStateMAC为true:<pages enableViewStateMac="true">
2.用Triple DES对称加密算法加密ViewState数据:
在web项目根目录下的webconfig文件中,找到<system.web>节点,添加子节点如下:
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES"/>
validationKey和decryptionKey中的AutoGenerate代表让系统自动产生密钥,如果用户需要自己指定密钥,可以改成如下:
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8,IsolateApps" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77,IsolateApps" validation="3DES"/>
关于<machineKey>元素的说明如下: <machineKey> 元素 配置用于加密和解密 Forms 身份验证 Cookie 数据和视图状态数据的密钥,以及配置用于验证进程外会话状态标识的密钥。此节可以在计算机、站点或应用程序级别进行声明,但不能在子目录级别声明。 配置结构的示例: <configuration> <system.web> <machineKey> <machineKey validationKey="AutoGenerate|value[,IsolateApps]" decryptionKey="AutoGenerate|value[,IsolateApps] validation="SHA1|MD5|3DES"/> 必需的属性
属性 | 选项 | 描述 |
---|
validationKey | | 指定用于验证加密数据的密钥。当 enableViewStateMAC 为 true 时,可以使用 validationKey 创建一个消息验证代码 (MAC) 以确保视图状态不被篡改。validationKey 还用于生成进程外、应用程序特有的会话 ID 以确保在会话之间隔离会话状态变量。 | | AutoGenerate | 指定 ASP.NET 生成一个随机的密钥并将其存储在本地安全机构 (LSA) 中。AutoGenerate 选项是默认值。如果将IsolateApps 修饰符添加到 validationKey 值中,ASP.NET 会使用每个应用程序的应用程序 ID 为每个应用程序生成一个唯一的加密密钥。 | | value | 指定一个手动分配的验证密钥。必须手动设置该值以确保整个 Web 服务器网络(Web 场)具有一致的配置。此密钥长度最少为 40 个字符(20 个字节),最多为 128 个字符(64 个字节)。如果使用的密钥比最大长度短,则采用真正随机的方法来创建这些密钥,例如使用RNGCryptoServiceProvider。建议的密钥长度为 128 个十六进制字符。如果将 IsolateApps 修饰符添加到validationKey 值中,ASP.NET 会使用每个应用程序的应用程序 ID 为每个应用程序生成一个唯一的加密密钥。 | decryptionKey | | 指定用于加密数据的密钥。decryptionKey 用于 Forms 身份验证加密和解密;当 validation 为 3DES 时,它还用于视图状态加密。 | | AutoGenerate | 指定 ASP.NET 生成一个随机的密钥并将其存储在 LSA 中。AutoGenerate 选项是默认值。如果将 IsolateApps 修饰符添加到 decryptionKey 值中,ASP.NET 会使用每个应用程序的应用程序 ID 为每个应用程序生成一个唯一的加密密钥。 | | value | 指定一个手动分配的密钥。必须手动将该值设置为十六进制字符串,以确保整个 Web 场具有一致的配置。在使用 DES 加密时,此密钥长度应该为 16 个字符;在使用三重 DES 加密时,此密钥长度应该为 48 个字符。如果使用的密钥比最大长度短,则应该采用真正随机的方法来创建这些密钥。ASP.NET 只能在可使用 128 位加密的计算机上使用三重 DES。如果将IsolateApps 修饰符添加到 decryptionKey 值中,ASP.NET 会使用每个应用程序的应用程序 ID 为每个应用程序生成一个唯一的加密密钥。 | validation | | 指定用于数据验证的加密类型。 | | SHA1 | 指定 ASP.NET 使用 SHA1 加密。 | | MD5 | 指定 ASP.NET 使用 MD5 加密。 | | 3DES | 指定 ASP.NET 使用三重 DES (3DES) 加密。在指定 3DES 时,Forms 身份验证默认为 SHA1。在将 validation 属性设置为 3DES 时,视图状态验证技术使用3DES 加密。 | 示例 以下示例将 validationKey 和 decryptionKey 均设置为 AutoGenerate。指定 isolateApps 选项以便给服务器上的每个应用程序生成唯一的密钥。 <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1"/> 要求
- 包含在:<system.web> 中
- Web 平台:IIS 5.0、IIS 5.1、IIS 6.0
- 配置文件:Machine.config、Web.config
- 配置节处理程序:System.Web.Configuration.MachineKeyConfigHandler
|
参考文献:http://msdn.microsoft.com/zh-cn/library/ms998288(en-us).aspx
http://blog.youkuaiyun.com/huwei2003/archive/2009/10/09/4647008.aspx
http://www.easewe.com/Article/Document/297.htm
http://www.yesky.com/447/1865447_1.shtml