在window.location.hash上运行JSON.parse()是否安全?

时间:2013-01-13 21:58:46

标签: javascript ajax json

我正在寻找一种在我的网址哈希中存储一些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

这似乎是做我想要的最简单,最简洁的技术。我很容易理解它,并且它使用的代码行数比例如this popular SO suggestion少。但是,它也感到不安全。恶意用户可以将任意代码写入URL,我的应用程序将执行它。这看起来很危险,但我对网络编程很陌生,所以我不知道这有多大。

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

3 个答案:

答案 0 :(得分:5)

是的,解析任意数据是安全的。 JSON解析器不执行任何与定义Object / Array / String / Number不同的代码。原生的甚至根本不使用eval(非本地的那些在使用eval之前验证JSON数据)。

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

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

答案 1 :(得分:4)

  

恶意用户可以将任意代码写入网址[...]该技术是否可以安全使用?

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

另一个问题是:将JSON放入哈希值是个好主意吗?我会寻求更简洁的代表。

答案 2 :(得分:0)

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

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

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

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