将XML数据存储在Cookie中

时间:2020-03-06 14:35:05  来源:igfitidea点击:

我正在尝试将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,则几乎仍要在我的所有页面上调用该服务。

我可以分别存储所有字符串和整数,但是该对象还有其他轻量级对象,例如" contactinformation"和" address",对于它们的每个属性,手动存储这些繁琐的工作很繁琐。

解决方案

我不会将数据存储在XML的cookie中,对于启动器来说cookie的大小是有限制的(过去对于包括cookie的所有标头都是4K)。选择不太冗长的编码策略,例如定界符,例如a | b | c或者单独的Cookie值。定界编码使解码值变得特别容易和快速。

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

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

取而代之的是,仅在cookie中保留最简单的标识符,这种标识符的格式易于验证(例如GUID)。然后,将序列化的数据存储在服务器端(在数据库中,文件系统上的XML文件或者任何其他文件中),然后使用该标识符进行检索。

编辑:同样,在这种情况下,请确保标识符足够随机,以使用户无法猜测彼此的标识符,并且只需稍微改变一下自己的标识符就可以互相模仿。同样,GUID(或者ASP.NET会话标识符)可以很好地实现此目的。

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

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

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

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