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

标签 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) // 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 中的技术可以安全使用吗?如果不是,为什么不呢?可能发生的最坏情况是什么?

最佳答案

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

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

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

关于javascript - 在 window.location.hash 上运行 JSON.parse() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14308689/

相关文章:

javascript - 未定义元素从 URL 获取 JSON

javascript - 如何将 JavaScript 函数转换为在 typescript 中工作

javascript - 如何使用 Javascript 中的单击按钮更改笔划的颜色?

javascript - 在 jQuery 中调用 Ajax 返回数据的 HTML 元素 ID

javascript - 使用 javascript 从外部 url 获取内容

c# - 使用 .NET core 3.0/System.text.Json 解析 JSON 文件

Javascript 与高度取反模数

javascript - DOM 节点上的事件处理程序是否随节点一起删除?

javascript - Jquery 表单元素访问

ruby-on-rails - 使用 JBuilder 内联数组元素