json2.jsは厳密で、すべてのオブジェクト キーを二重引用符で囲む必要があります。ただし、Javascript 構文{"foo":"bar"}
では と同等{foo:"bar"}
です。
ユーザーからの JSON 入力を受け入れるテキストエリアがあり、キーの二重引用符の制限を「緩和」したいと考えています。json2.js が JSON 文字列を評価する前に 4 段階で検証する方法を見てきました。引用符で囲まれていないキーを許可する 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 );
}