4

我需要在每个会话中跨几个页面(通过 https 运行)存储敏感数据。

我不能使用会话对象,主要原因是会话存储被设计为备份存储(主要是进行服务调用并加载会话)。如果会话已重新启动,或者换句话说会话中的密钥不存在,则创建服务并重新填充会话。

因此,在用户键入敏感数据的情况下,我需要跨页面转发这些数据,我们目前没有持久存储,因此左侧选项是将这些敏感数据存储在 Viewstate 中。

1)我应该加密数据然后存储在 Viewstate 中(虽然不推荐 - 秒和性能影响)或 2)我应该将数据存储在可序列化的类中并将其存储在 Viewstate 中吗?(由于性能影响,不再推荐)

请问有什么意见吗?

4

7 回答 7

4

我需要在每个会话中跨几个页面(通过 https 运行)存储敏感数据。

ViewState 在页面级别设置和维护。它不能跨不同的页面请求进行,只能回发当前页面。假设您真的意味着您必须“跨越几页”而不是回发数据。

您可能会将敏感数据存储在 cookie 中,但这会带来一些安全风险。

您还可以将敏感数据存储在服务器端数据存储(xml 文件、数据库等)中,并将数据的密钥存储在客户端 cookie 中。安全一点。

于 2008-11-05T08:08:40.830 回答
1

好吧,一般的答案是不要这样做!尽管 viewstate 是(可以)加密的,但它并不是为存储敏感数据而设计的。原因是视图状态数据可以被第三方获取并在以后解密。

但是,这并不意味着您不应该这样做... :-) 首先,您的连接是通过 https 进行的,因此您传输的所有内容都已加密。这意味着获取敏感数据将非常困难。如果第三方窃取您的敏感数据,他首先必须解密连接,然后解密视图状态。因此,攻击者可能更容易使用其他方法来获取您的数据(如欺骗用户、网络钓鱼等)。

因此,为了您的数据安全,我认为将它们存储在加密的视图状态中并使用 https 就足够了。

在 1) 和 2) 之间进行选择应该对性能没有影响或影响很小。当您在视图状态中存储对象时,该对象被序列化然后存储,因此无论您选择哪种方法,数据都会为您序列化。设计一个类来存储您的数据听起来像是一种干净的方法,所以我建议这样做。您甚至可能希望创建一个将敏感数据存储在加密字段中的类,以使获取敏感信息变得更加困难,但这会花费更多的性能。

于 2008-11-05T08:08:48.317 回答
1

如果您使用的是 2.0,则可以加密视图状态。请参阅此Channel9 文章。AES 对于美国军方和联邦政府来说是足够好的加密。虽然 DES 可以在几小时内破解,但 AES 需要150 万亿年(以 2001 年硬件计算)来破解 AES。即使使用更快和更分布式的硬件,您的视图状态也不值得恶意用户破解它所需的资源。除非您认为机器密钥在某种程度上不安全,否则我不确定加密会带来什么安全风险。

至于性能,带有敏感数据的视图状态是在将数据存储在有价值的内存服务器端或使用宝贵的 CPU 周期来加密数据之间的权衡(尤其是在 2.0 中,您可以配置“服务器端视图状态”)。您可能希望收集一些与您的工作量和特定硬件相关的经验证据,以找出真正的权衡是什么。如果将应用程序设计为在会话中存储状态而不是视图状态还为时不晚,您可能还需要考虑 SqlSessionStore,它是安全的(服务器端)并且不使用太多服务器端内存。

如果您使用的是 1.1,那么所有关于将敏感数据放入视图状态的令人沮丧的建议都是 100% 正确的,因为从 1.1 解码视图状态(或从 2.0 解码未加密的视图状态)是一项微不足道的任务。

于 2008-12-04T03:01:11.357 回答
1

Considering that you are talking about a decent amount effort to write code to get this to work safely and reliably with viewstate, you should consider putting that time and effort into just creating the server-side data store instead.

You already have a clearly defined need for one, and the effort to implement it is probably the same or less than the custom viewstate mechanism that is your alternative. The difference is that the persistent store might have value elsewhere in the app, or later on during development of other features... while the viewstate mechanism doesn't add value outside the immediate scope of the one requirement.

It would be rather trivial to drop a simple MS Access data file on the server, or you can even just drop in an XML or text files and write your data to those. It isn't much more effort beyond that to go to the light-weight relational stores like SQL Express, VistaDB, or even MySQL

于 2008-11-05T09:22:01.413 回答
0

在视图状态中存储适量的数据,无论您是否使用可序列化的类,都不应成为性能问题。

您将需要使用加密来保护视图状态中的数据值。同样,性能不应该是少量数据的问题。有关如何启用视图状态加密的详细信息,请参阅此页面。

于 2008-11-05T08:08:29.067 回答
0

敏感数据不应该存储在 ViewState 中,因为它很容易被反序列化。

但是您也说页面是通过https运行的,所以您需要回答的问题是;数据对谁敏感?访问页面的用户?然后你需要加密它。

如果不是,那么您应该没问题,因为您使用的是 https。

于 2008-11-05T08:08:32.640 回答
0

由于开发人员认为不可能发生的事情而导致所有安全漏洞,我认为我永远不会在视图状态中存储敏感信息。
加密与否。

您无法控制用户环境,因此您无法控制真正可以访问此“敏感”信息的内容。

于 2008-11-05T12:33:09.080 回答