json2.jsすべてのオブジェクトキーを二重引用符で囲む必要があります。ただし、JavaScriptの構文では{"foo":"bar"}
は{foo:"bar"}
に相当します。引用符で囲まれていないキーでJSON文字列を安全に解析する
私はユーザーからのJSON入力を受け入れ、キーの二重引用符の制限を「緩和」したいと思うテキストエリアを持っています。 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);
}
あなたはリテラルはそれがないJSON、と等価であるJavaScriptのオブジェクトを想定しています。 – Stephen
'{name:" Joe "}'は有効なJavascriptですが、それは_invalid_ JSONです。また、json2.jsをハックしたくないのは、ブラウザのネイティブなJSONサポートがどのように動作するかを反映しているからです。たとえば、Chromeでは、 'JSON.parse()'に 'json2.js'を指定しないと、それもまた邪魔になります。しかし、ブラウザがネイティブJSONをサポートしている場合、 'json2.js'は何もロードしません。したがって、ネイティブコードを使用してJSONを解析するため、ネイティブJSONをサポートしているブラウザではこのハックは見られません。 –
@Stephenそうです。 「JavaScript Object Literalを安全に解析してJSONに変換する」という質問を言い換えるべきでしょうか? – daepark