我正在寻找一种在我的网址哈希中存储一些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
变量的技术是否可以安全使用?如果没有,为什么不呢?可能发生的最坏情况是什么?
答案 0 :(得分:5)
是的,解析任意数据是安全的。 JSON解析器不执行任何与定义Object / Array / String / Number不同的代码。原生的甚至根本不使用eval
(非本地的那些在使用eval
之前验证JSON数据)。
将它分配给预定义(全局)变量也是安全的,假设您的代码不会对这些变量做“坏”的事情。
但是,将 分配给任意全局变量必然是安全的。虽然JSON不能包含函数,但您不希望任何人能够覆盖任何全局变量。
答案 1 :(得分:4)
恶意用户可以将任意代码写入网址[...]该技术是否可以安全使用?
这很安全。 JSON.parse()
优于旧eval()
方法的一个优点是它安全且不会运行任意代码。
另一个问题是:将JSON放入哈希值是个好主意吗?我会寻求更简洁的代表。
答案 2 :(得分:0)
第一课是所有用户输入都不应该被信任。
始终验证一切。对于您的应用程序,如果它只是脱机,那么恶意用户输入的内容并不重要,因为它只会影响他们自己的计算机。
如果它涉及服务器端活动,那么您应该检查以确保您收到的输入有意义。例如,如果用户试图访问已保存的文件,用户是否有权查看它?
默默无闻都没有安全性,因此散列中的JSON与某些复杂的加密方法一样安全。