20

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

5 に答える 5

7
data.replace(/(['"])?([a-zA-Z0-9]+)(['"])?:/g, '"$2":');

これにより、パラメーター名の一重引用符が置き換えられ、欠落しているものが追加されます。

于 2010-11-18T00:32:00.850 に答える
2

この実装に関する問題を洗い流すために、実際のテスト ケースがあると役立つと思いました。いくつかのテストを含む JSOL という github プロジェクトを追加しました。自由に記入して追加し、問題を見つけてください。ありがとう。

https://github.com/daepark/JSOL

于 2010-11-18T22:18:29.973 に答える
1

JSON では、引用符で囲まれていないキーは許可されません。JSON は JavaScript 表記のサブセットであり、引用符で囲まれていないキーは含まれません。ほぼすべての JSON パーサーに引用符で囲まれていないキーを渡すと、エラーがスローされるか、「予期しない」結果が返される可能性があります。

お役に立てれば

于 2010-11-18T00:21:20.553 に答える
0

使用するJSON5.parse

JSON5は、引用符で囲まれていないプロパティ キーを含む ES5 構文を使用できる JSON のスーパーセットです。JSON5 参照実装 ( json5npm パッケージ) はJSON5、組み込みオブジェクトと同じ引数とセマンティクスを持つ同じメソッドを持つオブジェクトを提供しJSONます。

于 2020-05-04T19:26:27.377 に答える