我正在尝试将一个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”,这些对象为每个属性手动存储都很繁琐。
答案 0 :(得分:5)
将序列化数据存储在cookie中是一个非常非常糟糕的主意。由于用户可以完全控制cookie数据,因此他们很容易使用此机制来提供恶意数据。换句话说:反序列化代码中的任何弱点都会立即被利用(或者至少是崩溃的方式)。
相反,只能在cookie中保留最简单的标识符,其格式可以轻松验证(例如,GUID)。然后,存储序列化数据服务器端(在数据库中,文件系统上的XML文件或其他),并使用该标识符检索它。
编辑:此外,在这种情况下,请确保您的标识符足够随机,以使用户无法猜测彼此的标识符,并通过简单地更改自己的标识符来模仿彼此。同样,GUID(或ASP.NET会话标识符)也可以很好地用于此目的。
问题所有者澄清情景之后的第二次编辑:在这种情况下,为什么要使用自己的Cookie?如果在会话状态(Session对象)中保留对原始对象或轻量级对象的引用,ASP.NET将以非常有效的方式为您处理所有实现细节。
答案 1 :(得分:1)
我不会在cookie中将数据存储在XML中 - 对于初学者的cookie大小有限制(对于所有标题包括cookie,以前是4K)。选择较不详细的编码策略,例如分隔符,例如a | b | c或单独的cookie值。分隔编码使得解码值变得特别容易和快速。
您看到的错误是ASP.NET抱怨标题看起来像是XSS攻击。
答案 2 :(得分:1)
查看View State。也许您希望在ViewState中的后备文件中保留数据,而不是使用cookie。否则,您应该将XML存储在服务器上,并将cookie中的数据存储为唯一标识符。
答案 3 :(得分:0)
您可以考虑使用Session State来存储值。您可以将其配置为使用cookie来存储会话ID。这也更安全,因为用户端的值既不可见也不可更改。
另一种方法是使用分布式缓存机制来存储值。我目前最喜欢的是Memcached。