json2.js требует, чтобы все ключи объектов заключались в двойные кавычки. Однако в синтаксисе Javascript {"foo":"bar"}
эквивалентно {foo:"bar"}
.
У меня есть текстовая область, которая принимает ввод JSON от пользователя и хотела бы «ослабить» ограничение на двойное цитирование ключей. Я рассмотрел, как json2.js проверяет строку JSON в четыре этапа перед ее оценкой. Я смог добавить 5-й этап, чтобы разрешить ключи без кавычек, и хотел бы знать, есть ли какие-либо последствия для безопасности этой логики.
var data = '{name:"hello", age:"23"}';
// 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, ":") // EDITED: allow key:[array] by replacing with safe char ":"
/** everything up to this point is json2.js **/
/** this is the 5th stage where it accepts unquoted keys **/
.replace(/\w+\s*\:/g, ":")) ) { // EDITED: allow any alphanumeric key
console.log( (new Function("return " + data))() );
}
else {
throw( "Invalid JSON: " + data );
}
{name:"Joe"}
является действительным Javascript, но это недопустимый JSON. Кроме того, вы не хотите взломатьjson2.js
, потому что это просто отражает то, как работает встроенная поддержка JSON в браузерах. В Chrome, например,JSON.parse()
безjson2.js
тоже задохнется. Но хуже то, чтоjson2.js
ничего не загрузит, если в браузере есть встроенная поддержка JSON. Таким образом, вы окажетесь в ситуации, когда браузеры с собственной поддержкой JSON никогда не увидят этот хак, потому что вместо этого он использует собственный код для его анализа. - person Alex Wayne   schedule 18.11.2010