【问题标题】:localStorage to save an object without beeing able to read its content?localStorage 保存对象而无法读取其内容?
【发布时间】:2011-12-07 03:19:29
【问题描述】:

我发现了 HTML5 的“localStorage”功能。据我了解,它只允许保存字符串,因此我们还需要使用 eval()/JSON 来保存对象/函数。

现在我想知道是否可以保存一个可以用 eval() 执行但无法读取的字符串。

所以我想只使用一次 localStorage.setItem,完全禁用 localStorage.getItem 并将其替换为“localStorage.evalItem”之类的东西。

这将是对抗 XSS/MITM 的安全方法(在保存函数之后)。

编辑:

详细信息:这个想法是保存类似于:

function aes_encode(string) {
   var salt='unique_salt';
   // aes encoding...
   return salty_encoded_string
}

在访问者端的非(源)可读存储主机中。

由于每个访问者都会创建一次唯一的盐,因此可以验证客户端数据。

但正如 James 和 nwellcome(谢谢!)所说,避免阅读源代码是不可能的。

我不认为投反对票是正确的,还是问题如此不清楚?!

【问题讨论】:

  • 可以用 eval() 执行但无法读取的字符串 - 没有这样的东西。你可以让它难以阅读,但绝不是不可能的。

标签: javascript json html eval local-storage


【解决方案1】:

根据经验,为了防止 XSS,不要信任来自客户端的数据。

这包括本地存储中的任何内容。 LocalStorage 没有像 cookie 这样的 HTTPOnly 标志,以使其无法被 Javascript 访问。即使是这样,用户也可以使用调试工具对其进行修改。出于这个原因,我会警告不要在你从 localStorage 获得的任何东西上使用eval()。我鼓励您使用 JSON sans eval 来读取 JSON 对象,并且根本不要将其用于函数。您应该能够通过使用适当的缓存和offline applications 将函数放入 localStorage 来完成任何您能做到的事情。

顺便说一句,你描述的方式

localStorage.evalItem(key).toSource() == localStorage.getItem(key);

所以我不相信你的方法会阻止任何人阅读,如果它可以评估的话。

【讨论】:

  • 我不相信。这个想法是将function aes_encode(var salt='unique_string';return salty_encoded_string)保存在访问者端的非(源)可读存储主机中。并且为每个访问者创建一次唯一的字符串,因此可以验证客户端数据。但正如你所说,避免阅读源代码是不可能的。无赖!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2015-03-06
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多