【问题标题】:asp.net viewstate encryption issueasp.net viewstate 加密问题
【发布时间】: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


【解决方案1】:

我知道您发布此内容已经有一段时间了,但是您是否考虑过自己实现 PageStatePersister? PageStatePersister 是负责格式化嵌入在页面中的 ViewState 和 ControlState 数据的组件。如果安全是您最关心的问题,您可以使用任何您想要的加密算法来确保您的数据保持私密。根据您的配置,听起来您处于一个相当有能力的环境中,因此显然首先进行负载测试。还值得一提的是,当 MVC 被合并到“经典”ASP.NET WebForms 站点中时,我不知道或体验过 MVC 对 ViewState 的分层参与。

祝你好运。

B

【讨论】:

  • 感谢您的建议。我从未探索过这条路线,研究了将视图状态置于会话中可能导致的所有问题,我偏离了滚动我自己的 PageStatePersister。如果我把这个打开,我一定会探索你自己加密会话的想法。
【解决方案2】:

Web.config page settings do not apply to pre-compiled ASP.Net application with updatable option disabled. 已经有一段时间了,但我可能已经部署了我的测试服务器,但禁用了可更新选项......吸取了教训。

MSDN

类似Question我问过,同样的问题。

【讨论】:

    【解决方案3】:

    我的猜测是负载平衡的网络农场是混乱的根源。您说“现在只有一个服务器 [is] up for testing”,但是您遇到的所有症状听起来与 Web 场中的多台服务器正在运行时会发生的情况完全相同,但您只制作了 web.config和 machine.config 在一台服务器上更改。当您使用浏览器访问网站时,有时您会访问以一种方式配置的服务器,有时您会访问以另一种方式配置的另一台服务器。

    【讨论】:

    • 在我玩这个的一周中,这个想法在我脑海中闪过很多次。我不断检查这一点,当我感到沮丧时,我转移到了我的未负载平衡的开发服务器。但是您确实有一个正确的观点,对于负载平衡环境中的每个人来说,理解这一点很重要
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2014-10-23
    相关资源
    最近更新 更多