将 xml 数据存储在 cookie 中
Posted
技术标签:
【中文标题】将 xml 数据存储在 cookie 中【英文标题】:Storing xml data in a cookie 【发布时间】:2010-09-12 06:55:06 【问题描述】:我正在尝试将 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,我仍然需要在几乎所有页面上调用该服务。
我可以单独存储所有字符串和整数,但该对象还有其他轻量级对象,例如“联系人信息”和“地址”,手动存储它们的每个属性会很乏味。
【问题讨论】:
【参考方案1】:您可能会考虑使用Session State 来存储值。您可以将其配置为使用 cookie 来存储会话 ID。这也更安全,因为该值在用户端既不可见也不可更改。
另一种选择是使用分布式缓存机制来存储值。我目前最喜欢的是Memcached。
【讨论】:
【参考方案2】:在 cookie 中存储序列化数据是一个非常非常糟糕的主意。由于用户可以完全控制 cookie 数据,因此他们很容易使用这种机制来向您提供恶意数据。换句话说:你的反序列化代码中的任何弱点都可以立即被利用(或者至少是一种使某些东西崩溃的方法)。
相反,只在您的 cookie 中保留最简单的标识符,其格式可以轻松验证(例如,GUID)。然后,将您的序列化数据存储在服务器端(在数据库、文件系统上的 XML 文件或其他任何地方)并使用该标识符检索它。
编辑:另外,在这种情况下,请确保您的标识符足够随机,以使用户无法猜测彼此的标识符,并通过简单地更改自己的标识符来模拟对方。同样,GUID(或 ASP.NET 会话标识符)非常适合此目的。
问题所有者澄***景后的第二次编辑:为什么在这种情况下使用您自己的 cookie?如果您在会话状态(会话对象)中保留对原始对象或轻量级对象的引用,ASP.NET 将以非常有效的方式为您处理所有实现细节。
【讨论】:
是的,我听到了 - 我刚刚对我的问题进行了编辑。我需要“所有这些数据”来加快速度。标识符可以给我整个对象,但是这样做的过程太慢了,我无能为力,因为它在我不能篡改的现有服务中。【参考方案3】:查看View State。也许您希望在 ViewState 中的回发中保留数据,而不是使用 cookie。否则,您可能应该将 XML 存储在服务器上,并将该数据的唯一标识符存储在 cookie 中。
【讨论】:
也是一个好点,但我在这里不使用视图状态的原因是因为有很多新请求(非回发),所以流程不包含在单个页面上。我实际上是在现有解决方案上实现这一点,所以我不想更改其他页面。【参考方案4】:我不会在 cookie 中以 XML 格式存储数据 - 初学者的 cookie 大小是有限制的(对于包含 cookie 的 所有 标头过去是 4K)。选择不那么冗长的编码策略,例如分隔符,例如a|b|c 或单独的 cookie 值。定界编码使解码值变得特别容易和快速。
您看到的错误是 ASP.NET 抱怨标头看起来像 XSS 攻击。
【讨论】:
好点子,在接受这个答案之前,我会把这个问题留待更长时间:)以上是关于将 xml 数据存储在 cookie 中的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net 将用户数据存储在 Auth Cookie 中