将eval()转换为JSON.parse

时间:2017-04-11 10:08:20

标签: javascript json eval xss code-injection

我正在经历使用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?

2 个答案:

答案 0 :(得分:4)

只需用以下代码替换该行:

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

如果响应是正确的JSON,这应该可行。

答案 1 :(得分:1)

假设响应是表现良好的JSON,您可以简单地用以下代码替换eval行:

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

请注意:与eval接受的Javascript对象相比,JSON解析器在它将接受的值中具有非常严格的限制。例如,

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

将导致Object {a:3},而

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

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

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

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

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