我注意到,jQuery的parseJSON基本上没有一个简单的正则表达式“检查”:如果它传递的是“检查”,如果它是一个现代的浏览器中使用本地JSON解析器应该使用jQuery的parseJSON/getJSON方法吗?
parseJSON: function(data) {
if (typeof data !== "string" || !data) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim(data);
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse(data) :
(new Function("return " + data))();
} else {
jQuery.error("Invalid JSON: " + data);
}
},
。否则,我假设像IE6这样的浏览器会自动调用一个新函数并返回该对象。
问题#1:因为这只是一个简单的正则表达式测试,是不是容易出现某种模糊的边缘案例漏洞?我们真的不应该使用全面的解析器,对于至少不支持本地JSON解析的浏览器?
问题#2:多少“更安全”是(new Function(" return " + data))()
而不是eval("(" + text + ")")
?
如果本机JSON不可用,json2.js将使用相同的正则表达式,然后使用'eval'。 – 2010-07-13 15:50:05
已注意。感谢澄清。 – spoulson 2010-07-13 17:23:56