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

dB'*_*dB' 2 javascript ajax json

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

在我看来,一种方法可能使用JSON序列化.即,我会存储我的变量

var params = { var1: window.val1, var2: window.val2 }
window.location.hash = JSON.stringify(params)
Run Code Online (Sandbox Code Playgroud)

并像这样恢复它们

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

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

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

Thi*_*ter 5

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

将它分配给预定义(全局)变量也是安全的,假设您的代码不会对这些变量执行"坏"操作.

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