я заметил, что JQuery parseJSON в основном делает простой регулярное выражение «проверить»:Должны использоваться методы parseJSON/getJSON jQuery?
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);
}
},
Если она проходит, что «чек», и если это современный браузер используется родной JSON парсер. В противном случае я предполагаю, что для браузера, такого как IE6, новая функция автоматически вызывается и возвращает объект.
Вопрос # 1: Поскольку это простой тест регулярных выражений, разве это не связано с каким-то неясным краевым эксплойтом? Разве мы не должны использовать полноразмерный парсер для браузеров, которые, по крайней мере, не поддерживают собственный JSON-анализ?
Вопрос №2: Насколько «безопаснее» (new Function(" return " + data))()
в отличие от eval("(" + text + ")")
?
json2.js будет использовать одно и то же регулярное выражение, а затем 'eval', если родной JSON недоступен. –
Отмечено. Спасибо за разъяснения. – spoulson