1

我正在尝试将 xml 序列化对象存储在 cookie 中,但出现如下错误:

A potentially dangerous Request.Cookies value was detected from the client (KundeContextCookie="<?xml version="1.0" ...")

当您尝试在表单输入字段中存储看起来像 javascript 代码的内容时,我从类似的案例中知道了问题。

这里的最佳做法是什么?有没有办法(就像我描述的表单问题)来抑制来自 asp.net 框架的这个警告,或者我应该用 JSON 序列化而不是二进制序列化它?在 cookie 中存储序列化数据时的常见做法是什么?

编辑:感谢您的反馈。我想在 cookie 中存储比 ID 更多的数据的原因是因为我真正需要的对象需要大约 2 秒才能从我无法控制的服务中检索。我制作了一个轻量级对象“KundeContext”来保存完整对象中的一些属性,但这些属性在 90% 的时间里都在使用。这样我只需要在 10% 的页面上调用慢速服务。如果我只存储 ID,我仍然必须在几乎所有页面上调用该服务。

我可以单独存储所有字符串和整数,但该对象还有其他轻量级对象,如“联系人信息”和“地址”,手动存储它们的每个属性会很乏味。

4

4 回答 4

5

在 cookie 中存储序列化数据是一个非常非常糟糕的主意。由于用户可以完全控制 cookie 数据,因此他们很容易使用这种机制来向您提供恶意数据。换句话说:反序列化代码中的任何弱点都会立即被利用(或者至少是一种使某些东西崩溃的方法)。

相反,只在您的 cookie 中保留最简单的标识符,其格式可以轻松验证的类型(例如,GUID)。然后,将您的序列化数据存储在服务器端(在数据库、文件系统上的 XML 文件或其他任何地方)并使用该标识符检索它。

编辑:另外,在这种情况下,请确保您的标识符足够随机,以使用户无法猜测彼此的标识符,并通过简单地更改自己的标识符来模拟对方。同样,GUID(或 ASP.NET 会话标识符)非常适合此目的。

问题所有者澄清场景后的第二次编辑:为什么在这种情况下使用您自己的 cookie?如果您在会话状态(会话对象)中保留对原始对象或轻量级对象的引用,ASP.NET 将以一种非常有效的方式为您处理所有实现细节。

于 2008-09-23T07:51:11.070 回答
1

我不会在 cookie 中以 XML 格式存储数据 - 初学者的 cookie 大小有限制(包括 cookie 在内的所有标头过去都是 4K)。选择不那么冗长的编码策略,例如分隔符,而不是例如 a|b|c 或单独的 cookie 值。定界编码使解码值变得特别容易和快速。

您看到的错误是 ASP.NET 抱怨标头看起来像 XSS 攻击。

于 2008-09-23T07:48:55.583 回答
1

查看视图状态。也许您希望在 ViewState 中的回发中保留数据,而不是使用 cookie。否则,您可能应该将 XML 存储在服务器上,并将该数据的唯一标识符存储在 cookie 中。

于 2008-09-23T07:51:11.943 回答
0

您可能会考虑使用会话状态来存储值。您可以将其配置为使用 cookie 来存储会话 ID。这也更安全,因为该值在用户端既不可见也不可更改。

另一种选择是使用分布式缓存机制来存储值。我目前最喜欢的是Memcached

于 2008-09-23T08:38:51.203 回答