32

JSON でエンコードされた整数インデックスの配列 => 整数値を Cookie に格納しています。

明らかに、Cookie は他のユーザー入力と同じように簡単に操作できるため、ここに私の Cookie ゲッターの検証を示します。

if ($_COOKIE['myCookie']) { //if cookie exists
    $myCookie = json_decode($_COOKIE['myCookie'], true);
    if (!is_array($myCookie)) { //in case decoding fails or bad cookie
        $myCookie = array(); //sets it as empty array
    }
} else { //if cookie doesn't exist, uses an empty array instead
    $myCookie = array();
}

次に、値を使用する前に、それが配列に存在するかどうかを確認し、ホワイトリストに登録された値のリストに対してテストします。この部分はかなり安全に見えますが、検証の一部であるため投稿しています。

if (!empty($myCookie[$index])) { //checks if index exists and is truthy
    if ($myCookie[$index] !== 1 && $myCookie[$index] !== 2) { //values whitelist
        die('Hacking attempt through cookies exploit.');
    }
    //use the cookie data now
}

質問に戻りますが、Cookie を直接呼び出しても安全ですか? json_decodeユーザーは Cookie を操作して任意のコードを実行できますか?

私はこれまでSOに関する多くのトピックを読んできましたがunserialize()、コンストラクターを呼び出すため安全ではありませんが、json_decode技術的には安全であることがわかりました。私は彼らのphp.netページを読みましたが、それらはセキュリティに直接対処していません.

私のアドオンはすぐにライブ ベータ版に到達するのでjson_decode、Cookie を直接呼び出しても安全かどうか、または を呼び出す前に何らかの検証を実行する必要があるかどうか疑問に思っていjson_decodeます。私も実行できますがpreg_match、値を使用する前に値のホワイトリストに対してテストしているので、何らかの方法で任意のコードを実行しない限り問題はないはずjson_decodeです。

json_encode有効なJSONでない場合に返されることはわかっていますが、これが正しいアプローチなのか、それとも呼び出す前に何らかの検証を追加する必要NULLがあるのか​​ 疑問に思っていますか?json_decode

これがばかげた質問である場合は申し訳ありませんが、私は Cookie/JSON の経験がほとんどなく、サーバーのデータベースが削除されたことで非難されたくありません。ヘルプ/情報をいただければ幸いです。=]

4

3 に答える 3

36

を使用json_decodeしてユーザー入力を直接デコードしても、セキュリティ上の問題はありません。

これは単なる文字列の解析であり、文字列の評価は行いません。

json_decodephp はJSON.parsejavascript に似ており、どちらもユーザー入力で直接使用でき、デコード時に安全です。

ただし、デコードした後、要件に合わせてデータを検証する必要があります。

于 2012-09-06T02:18:20.107 に答える
8

正しく実装されてjson_decodeいる限り、追加の前処理なしで安全に使用できるはずです (実際、プリプロセッサにバグがある可能性があることを考えると、それはさらに悪いことかもしれません)。

于 2012-09-06T02:10:23.627 に答える
5

データが json 形式でない場合、json_decode は失敗します。Itayが言ったように、誰かがこれを悪用できるなら、彼はほとんど入るに値します.json_decodeはSQLのリスクに悩まされていないので、これをやっても大丈夫だと思います.

クエリに組み込む前に、何か(またはすでにあるようにホワイトリスト)を必ずきれいにしてください。

于 2012-09-06T02:12:03.530 に答える