Безопасный анализ строки JSON с ключами без кавычек - PullRequest
15 голосов
/ 18 ноября 2010

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 );
}

Ответы [ 3 ]

5 голосов
/ 18 ноября 2010
data.replace(/(['"])?([a-zA-Z0-9]+)(['"])?:/g, '"$2":');

Это заменит любые одинарные кавычки в имени параметра и добавит пропущенные.

1 голос
/ 19 ноября 2010

Я подумал, что было бы полезно иметь реальные тестовые случаи, чтобы устранить любые проблемы с этой реализацией.Я добавил проект github под названием JSOL с некоторыми тестами.Пожалуйста, заполните бесплатно, чтобы добавить к нему и найти проблемы.Спасибо.

https://github.com/daepark/JSOL

0 голосов
/ 18 ноября 2010

JSON не допускает ключи без кавычек. JSON - это подмножество нотации JavaScript, которое не включает ключи без кавычек. Передача ключей без кавычек практически любому анализатору JSON, скорее всего, выдаст ошибку или выдаст «неожиданные» результаты.

Надеюсь, это поможет

...