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