即使在ssl上,在ViewState中存储信用卡和定价信息是否安全?

时间:2010-07-07 22:48:11

标签: asp.net security viewstate

我有一个私有属性的页面,它在viewstate中存储信用卡对象和购物车对象,因此我可以在回发中维护对它们的引用。顺便说一下,涉及的页面将使用SSL。

这样安全吗?

6 个答案:

答案 0 :(得分:10)

我不会在viewstate中存储敏感信息...... 永远通过这样做,您可以将安全性委托给浏览器实施以保护您的客户数据。诸如跨站点脚本(XSS),URL重定向攻击等漏洞可能会将此敏感数据暴露给入侵,被盗或欺骗。

如果您要在回发中存储此类详细信息,则应重新评估您的设计 - 并找到避免这样做的方法。

答案 1 :(得分:2)

Viewstate是可以攻击的。如果您需要在回发中存储该信息,请查看将其存储在加密数据库中。

编辑(对于下选民):

  

Q10。 ViewState默认是安全的吗?可以保障吗?怎么样?

     

默认情况下,__VIEWSTATE隐藏表单字段的值为Base64编码且未加密。因此,默认情况下,ViewState中的数据不安全。

     

是的,可以保护ViewState中的数据。有两件事可以做。首先是使用SSL。第二个是确保EnableViewStateMac设置为true。这将确保ViewState将被加密并检查以防止篡改。默认加密算法是SHA1,但如果需要,可以将其更改为MD5或3DES。   也就是说,应该记住,在增加安全性和性能之间几乎总是需要权衡。最好避免在ViewState中存储敏感数据,并且由于需要提高安全性而导致性能损失。

page link

请记住,ViewState中包含的任何内容都将传递到客户端浏览器(只是存储在隐藏的输入中),并且正在从客户端传递到服务器。加密和解密数据可能是一个巨大的系统开销。

答案 2 :(得分:0)

我绝对不会说,如果您需要在多个Http请求中存储信用卡详细信息,我可能会重新考虑您的架构。

希望这有帮助。

答案 3 :(得分:0)

所有其他答案似乎暗示观点状态完全不安全。我不同意。

ASP.NET可以使用服务器密钥加密视图状态。如果你这样做,那么在理论上它应该足够安全。话虽如此,我仍然不推荐它。其他人有一天会出现并禁用加密“用于测试目的”或设置弱密钥,否则服务器的配置文件将以某种方式受到损害,突然您的信用卡号码容易受到攻击。

所以是的,在viewstate中有一定程度的安全性,但仍有更好的方法可以做到这一点。即使在用户的会话中存储敏感数据也会更好,也很简单。

答案 4 :(得分:0)

我不推荐它,如果我跑进去,我会考虑我的设计。但是如果你想这样做:将viewstate存储在服务器上。

阅读本文: http://aspguy.wordpress.com/2008/07/09/reducing-the-page-size-by-storing-viewstate-on-server/

答案 5 :(得分:0)

几点

  • MSDN :( Session vs ViewState)虽然ViewState数据经过编码并且可以选择加密,但如果数据从未发送到客户端,则数据最安全。因此,会话状态是一种更安全的选择。 (由于额外的数据库凭据,将数据存储在数据库中更加安全。您可以添加 SSL 以获得更好的链接安全性。)但是如果您显示用户界面中的私人数据,可能您已经熟悉了链接本身的安全性。在这种情况下,同样的值也可以安全,也可以将相同的值放入 ViewState

  • ViewState is Visible in Source: 尽管可以在名为__VIEWSTATE的隐藏字段中自由访问,但视图状态信息不是明文。默认情况下,计算机器特定的身份验证代码并将其附加到视图状态字符串。然后,生成的文本仅为 Base64 编码,但未加密。但是,如果需要数据机密性,则SSL是唯一的解决方案,因为它不仅可以保护视图状态,还可以保护进出页面的所有数据。仍然可以解码视图状态,但必须完成许多步骤;不仅必须拆卸几个无证件和内部结构,而且还必须发生一些情况。此外,请考虑通常在服务器上检测到篡改的视图状态,并抛出安全异常。最后,最重要的是,视图状态包含数据,而不是代码。除非您明确减少页面的默认安全设置,否则黑客无法修改视图状态。 但是,如果更改默认安全设置,则应注意视图状态。黑客可以修改代表页面状态的数据。这不是一个错误本身,只有在不强制执行数据验证和数据检查的基本规则时才会为攻击打开漏洞。但是,您理解,当您尝试编写安全代码时,这是一个更普遍的问题。 视图状态内部实现非常复杂,并且足以阻止攻击。加密是保护视图状态信息的最重要元素。 为了使视图状态更安全,ASP.NET @Page指令支持一个名为EnableViewStateMac的属性,其唯一目的是检测任何可能的破坏原始数据的尝试。

  • 如果EnableViewStateMac为True,则当页面回发时,通过算法检查加密视图状态,以验证它是否未在客户端上被篡改。最终结果是您可能能够读取视图状态的内容,但要替换它,您需要加密密钥,该密钥位于Web服务器的LSA中。