【问题标题】:Convert eval() to JSON.parse将 eval() 转换为 JSON.parse
【发布时间】:2017-04-11 10:08:19
【问题描述】:

我正在经历使用 eval() 对基于 XSS 的攻击的不良影响。我需要一段代码来防止可能的 XSS 攻击,我猜 JSON.parse() 应该可以正常工作。

var request = new XMLHttpRequest(); 
var url = encDataPath + "/jcr:content/metadata.json?_charset_=utf-8";
url = Granite.HTTP.externalize(url);
request.open("GET", url ,false);
request.send(null);

var jsonData =eval("(" + request.responseText + ")"); // <-- here
var assetTitle = jsonData["dc:title"];
var mimetype = jsonData["dc:format"];

有人可以建议我如何将eval()(用于 jsonData)更改为 JSON.parse?

【问题讨论】:

  • 这个问题似乎可以自己回答...?
  • 我不明白你为什么要问如何用另一种东西代替它,因为它看起来几乎太明显了,答案如下。为什么它被标记在 [xss] 和 [code-injection] 下?奇怪。

标签: javascript json eval xss code-injection


【解决方案1】:

只需将该行替换为:

var jsonData = JSON.parse(request.responseText);

如果响应是正确的 JSON,这应该可以正常工作。

【讨论】:

    【解决方案2】:

    假设响应是良好的 JSON,您可以简单地将 eval 行替换为:

    var jsonData = JSON.parse(request.responseText);
    

    但请注意:与 eval 接受的 Javascript 对象相比,JSON 解析器在接受的值方面非常严格。例如,

    var jsVal = eval("({a:3})");
    

    将产生对象 {a: 3},而

    var jsonVal = JSON.parse("{a:3}");
    

    将导致解析错误,因为 JSON 规范[0] 要求将对象键作为双引号字符串提供:

    var jsonVal = JSON.parse('{"a":3}');
    

    如果服务器配置正确,它通常会输出兼容的 JSON,但需要注意。

    [0]http://www.json.org/

    【讨论】:

    • 查看网址:/jcr:content/metadata.json。我认为响应是有效的 JSON 是一个相当安全的选择。
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2018-12-30
    • 2016-06-07
    • 2020-04-16
    • 2021-04-22
    • 2018-07-27
    • 2014-03-26
    相关资源
    最近更新 更多