【发布时间】:2016-02-28 09:52:19
【问题描述】:
我正在尝试打开视图状态加密始终作为我在 IIS6 中托管的 ASP.NET 3.5 网站的安全措施。我们关闭了视图状态,但仍然在此字符串中看到一些“控制状态”。在测试环境中,我可以简单地在 web.config 中设置以下内容,并且我无法再将视图状态通过 base64 解码为半明文:
<pages enableViewState="false" enableViewStateMac="true" viewStateEncryptionMode="Always">
我什至在 machine.config 中添加了以下内容(由 machine key generater 生成),并且仍然在我的测试服务器上很好地加密了视图状态:
<machineKey validationKey="002..." decryptionKey="D90E..." validation="SHA1" decryption="AES" />
我的非测试环境似乎没有接受上述更改,因为我总是可以使用上述设置将 viewstate 解码为纯文本。做出任何更改后,我总是 iisreset。
关于我的非测试网络服务器的一些信息:
- Web Farm/负载平衡(但目前只有一台服务器可供测试)
- Sql 会话状态(最初需要 machine.config 中的 machinekey 来设置它)
- machine.config:部署零售=“真”
谁能建议在哪里寻找可能会干扰 asp.net viewstate 加密的其他设置?
编辑:现在在我的 iis 测试服务器上,我无法撤消 viewStateEncryptionMode 设置,因为它正在加密视图状态,即使我将其设置为“从不”并且我的其他网站似乎都没有使用此设置。我在哪里可以查看该属性被覆盖的位置?除了在 i iisreset/stop www service/touch machine.config 时执行的操作之外,是否还有需要清除此设置的缓存?
EDIT FINAL:在研究配置文件几天后,我放弃并通过代码实现了这个。我已经有一个附加到页面事件的安全模块,所以在 Page_Load 我添加了:Page.RegisterRequiresViewStateEncryption();
我真的很想知道是什么阻止了此设置在 IIS6 上立即被使用。当我在本地运行 cassini 时,如果我通过页面节点将 viewStateEncryptionMode 设置为“始终”,我会立即看到它对视图状态进行编码并使用 id="__VIEWSTATEENCRYPTED" 呈现附加隐藏字段。当我将其设置为“从不”时,我会立即看到加密关闭。如果我在我的 IIS6 托管网站上对网站进行完全相同的更改,它不会立即生效,但如果我允许设置保留在那里,它最终会生效。我会停止/启动 www 服务,重置 iis,清除 ASPNET 临时缓存,但我不知道还能尝试什么?希望这篇文章可以 ROT 一段时间,将来有人会看到我经历过的相同行为,我们可以进一步解决这个问题!
【问题讨论】:
-
事实证明 RegisterRequiresViewStateEncryption 也会打开 ViewstateMAC 验证,即使我在 web.config 中明确将其设置为 false。由于我的网站是位于 WebForms 之上的自定义“MVC”,因此我有时会在 POSTS 上重定向到不同的页面,因此我无法进行 MAC 验证。我认为 ViewStateMAC = false 和 ViewStateEncryption = true 的 web.config 设置不是一个好的组合。
标签: asp.net encryption viewstate base64 machinekey