2

我正在寻找一种在我的 URL 哈希中存储一些 javascript 变量的方法。我的目标是允许用户使用书签来恢复 Web 应用程序的特定状态。

我突然想到一种方法可能使用 JSON 序列化。即,我会像这样存储我的变量

var params = { var1: window.val1, var2: window.val2 }
window.location.hash = JSON.stringify(params)

并像这样恢复它们

var paramStr = window.location.hash.substring(1) // substring removes the initial "#"
var params = JSON.parse(paramStr)
window.var1 = params.var1
window.var2 = params.var2

这似乎是做我想做的最简单和最简洁的技术。这对我来说很容易理解,并且它使用的代码行数比这个流行的 SO 建议少。然而,它也感到不安全。恶意用户可以将任意代码写入 url,我的应用程序会执行它。这似乎很危险,但我对网络编程很陌生,所以我不知道这有多大意义。

我上面概述的用于存储变量的技术是否可以window.location.hash安全使用?如果不是,为什么不呢?可能发生的最坏情况是什么?

4

3 回答 3

5

是的,解析任意数据是安全的。JSON 解析器不会执行任何不同于定义对象/数组/字符串/数字的代码。原生的甚至根本不使用eval(非原生的在使用之前验证 JSON 数据eval)。

假设您的代码不会对这些变量做“坏”的事情,将它分配给预定义的(全局)变量也是安全的。

但是,将其分配给任意全局变量并不一定安全。虽然 JSON 不能包含函数,但您不希望任何人能够覆盖任何全局变量。

于 2013-01-13T22:01:17.477 回答
4

恶意用户将能够将任意代码写入 url [...] 该技术 [...] 可以安全使用吗?

它是安全的。JSON.parse()旧方法的优点之一eval()是它是安全的并且不会运行任意代码。

另一个问题是:将 JSON 放入散列中是个好主意吗?我会寻求更简洁的表示。

于 2013-01-13T22:01:44.450 回答
0

第一课是永远不应该信任所有用户输入。

始终验证一切。对于您的应用程序,如果它仅处于脱机状态,那么恶意用户输入的内容实际上并不重要,因为它只会影响他们自己的计算机。

如果它涉及服务器端活动,那么您应该检查以确保您收到的输入是有意义的。例如,如果用户试图访问保存的文件,用户是否有权查看它?

默默无闻没有安全性,因此散列中的 JSON 与某些复杂的加密方法一样安全。

于 2013-01-13T22:01:27.457 回答