我正在尝试打开视图状态加密Always作为我在 IIS6 中托管的 ASP.NET 3.5 网站的安全措施。我们已关闭视图状态,但仍在此字符串中看到一些“控制状态”。在测试环境中,我可以简单地在 web.config 中设置以下内容,并且我无法再以 Base64 将视图状态解码为半明文:
<pages enableViewState="false" enableViewStateMac="true" viewStateEncryptionMode="Always">
我什至添加了以下内容(由机器密钥生成器 http://aspnetresources.com/tools/machineKey)到 machine.config 并仍然对我的测试服务器上的视图状态进行加密:
<machineKey validationKey="002..." decryptionKey="D90E..." validation="SHA1" decryption="AES" />
我的非测试环境似乎没有接受上述更改,因为我始终可以使用上述设置将视图状态进行 Base64 解码为纯文本。我总是在进行任何更改后重置。
有关我的非测试网络服务器的一些信息:
- Web Farm/负载平衡(但目前只有一台服务器用于测试)
- Sql 会话状态(最初需要 machine.config 中的 machinekey 来设置)
- machine.config:部署零售=“true”
任何人都可以建议在哪里寻找可能干扰 ASP.NET 视图状态加密的其他设置吗?
编辑:现在在我的 iis 测试服务器上,我无法撤消 viewStateEncryptionMode 设置,因为它正在加密视图状态,即使我将其设置为“从不”,而且我的其他网站似乎都没有保留此设置。我可以在哪里查看该属性被覆盖的位置?除了 iisreset/stop www service/touch machine.config 时执行的操作之外,是否还有存储此设置的缓存需要清除?
编辑最终:经过几天的研究配置文件后,我放弃并通过代码实现了这一点。我已经有一个附加到页面事件的安全模块,因此在 Page_Load 中我添加了: Page.RegisterRequiresViewStateEncryption();
我真的很想知道是什么阻止了 IIS6 立即采用此设置。当我在本地运行 cassini 时,如果我通过页面节点将 viewStateEncryptionMode 设置为“Always”,我会立即看到它对视图状态进行编码并使用 id="__VIEWSTATEENCRYPTED" 渲染附加隐藏字段。当我将其设置为“从不”时,我会立即看到加密关闭。如果我对 IIS6 托管网站上的网站进行同样的更改,它不会立即生效,但如果我允许设置保留在那里,它最终会生效。我会停止/启动 www 服务、重置 iis、清除 ASPNET 临时缓存,但我不知道还能尝试什么?希望这篇文章可以烂掉一段时间,将来有人会看到我经历过的相同行为,我们可以进一步弄清楚这一点!