繁体   English   中英

将XML数据存储在Cookie中

[英]Storing xml data in a cookie

我正在尝试将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”,要为它们的每个属性手动存储会很繁琐。

在cookie中存储序列化数据是一个非常非常糟糕的主意。 由于用户可以完全控制cookie数据,因此使用这种机制向您提供恶意数据实在太容易了。 weakness in your deserialization code becomes instantly exploitable (or at least a way to crash something). 换句话说:反序列化代码中的弱点都可以立即被利用(或者至少是崩溃的一种方式)。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM