【问题标题】:Is EnableViewStateMAC=true compulsory for ViewStateEncryption in an ASP.Net Website?对于 ASP.Net 网站中的 ViewStateEncryption,EnableViewStateMAC=true 是强制性的吗?
【发布时间】:2012-12-12 16:47:58
【问题描述】:

我目前正在修复我们的 ASP.net 网站应用程序中的一些安全问题。

其中一个问题是ViewState 未加密。

所以我确实在 StackOverFlow 和其他地方检查了如何加密 viewState,我使用 <pages viewStateEncryptionMode="Always" /> 并在 Web.config 中添加像 <machineKey validation="3DES" /> 这样的 3DES 机器密钥。

我想知道"EnableViewStateMAC=true" 是否也是必需的?因为我在网上找到的一些建议解决方案中提到了这一点。 但是,在我的检查中,我发现即使没有这个加密也能正常工作。

[注意:我必须在应用程序级别 (Web.config) 进行这些更改,因为对这个应用程序进行单独的页面更改不是一个实际的解决方案。]

【问题讨论】:

  • 如果您要加密您的 ViewState,最好也对其进行 MAC 处理,以检测篡改数据的攻击者。单独加密并不能提供消息的完整性。

标签: c# asp.net .net encryption viewstate


【解决方案1】:

永远不要将 EnableViewStateMac 设置为 false,即使启用了加密也是如此。 MAC 保证客户端不能恶意篡改 ViewState 的内容。 (加密本身不足以保证这一点;MAC 是必要的。)

EnableViewStateMac 属性将在产品的未来版本中移除,因为没有正当理由将其设置为“false”。

【讨论】:

  • 如果您将 ViewState 持久化到数据库中,只有一个 ID 传递给客户端,而他们无法看到 ViewState,该怎么办?
  • 没关系。 EnableViewStateMac 保护的不仅仅是 ViewState,因此它应该永远设置为 false。这条规则没有例外。
  • 而且... 10 个月后@Levi 刚刚在 Twitter 上宣布,即使您将其设置为 false,它也会被忽略。就像 Levi 说的,没有例外,现在如果你的代码依赖于此,它就会中断。 :)
【解决方案2】:

以防万一:

从 ASP.NET 4.5.2 开始,运行时强制 EnableViewStateMac = true

更多详情:ASP.NET 4.5.2 and EnableViewStateMac

【讨论】:

    【解决方案3】:

    您可能需要注意,截至 2014 年 9 月

    现在所有版本的 ASP.NET 运行时 1.1 - 4.5.2 都禁止设置

    http://blogs.msdn.com/b/webdev/archive/2014/09/09/farewell-enableviewstatemac.aspx

    【讨论】:

    • 如果我的 EnableViewStateMac="true" 需要修复什么吗?
    【解决方案4】:

    托管多台服务器时会出现问题。因为机器密钥不同。

    如果您的项目在单台机器上运行。 EnableViewStateMAC=true 是安全的。

    使用 enableViewStateMac 要求将连续的请求转发到同一服务器(即服务器关联)。此功能用于帮助防止篡改页面的视图状态;但是,它是基于当前服务器上自动生成的验证密钥来执行此操作的。从此密钥生成消息验证码 (MAC),并在 ViewState 中将其发送回浏览器。问题是,如果执行 POST 返回并转到不同的服务器,您将收到一条漂亮的小错误消息,上面写着“Corrupt View State”。

    要解决此问题,您可以在元素中将 enableViewStateMac 设置为 false,或者在所有服务器(在场中)的元素中为该元素中的 validationKey 属性指定一个通用值。

    顺便说一句,文档说默认情况下这是关闭的。这是不正确的!去检查 machine.config!

    【讨论】:

    • 嗨,哈利特,感谢您的回复。我想知道的是我是否绝对有必要使用 EnableViewStateMAC=true ???还是我所做的上述更改不足以加密我的viewState?如果没有必要,我不希望 EnableViewStateMAC。
    • 你会决定的。如果你没有启用它。第三方工具可以解码。你的观点。 ignatu.co.uk/ViewStateDecoder.aspx
    • 前。如果您在视图状态中存储包含密码的用户列表。他们可以解码并查看密码。
    • 您永远不应该在 ViewState 中存储用户列表及其密码。你甚至应该永远看不到他们的原始密码。
    • 密码只是示例。 :) 他不应该存储。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多