Javascript 在window.location.hash上运行JSON.parse()安全吗?

Javascript 在window.location.hash上运行JSON.parse()安全吗?,javascript,ajax,json,Javascript,Ajax,Json,我正在寻找一种在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) /

我正在寻找一种在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
像这样把他们找回来

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
这似乎是做我想做的事情最简单、最简洁的技巧。这对我来说很容易理解,而且它使用的代码行比,例如。然而,它也感到不安全。恶意用户可以将任意代码写入url,我的应用程序将执行该代码。这似乎很危险,但我对网络编程还很陌生,所以我不知道这有多重要


我上面概述的在
window.location.hash
中存储变量的技术安全吗?若否,原因为何?可能发生的最坏情况是什么

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

假设您的代码没有对这些变量做“坏”处理,那么将其分配给预定义(全局)变量也是安全的


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

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

总是验证一切。就你的应用而言,如果它只是离线的,那么恶意用户的类型实际上并不重要,因为它只会影响他们自己的计算机

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

模糊中没有安全性,因此哈希中的JSON与某些复杂的加密方法一样安全

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

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


另一个问题是:将JSON放入哈希中是一个好主意吗?我会选择更简洁的表示。

XSS将是一个问题,即使数据从未到达服务器。确切地说。特别是,为了使用JSON序列化特定的用户“类”,您必须传入一个由您控制的
恢复程序。这与其他语言不同,在这些语言中,特殊形式的密钥可以触发任意代码。问题是:“恶意用户”是否会导致其他人无意中执行某个操作?一个恶毒的人对自己做恶毒的事情是——撇开道德信仰不谈——好的。你的主要问题是你正在构建无效的URL。哈希不接受双引号和大括号等字符,它们显然是JSON的重要组成部分。