32

我在 cookie 中存储一个 JSON 编码的整数索引数组 => 整数值。

显然 cookie 可以像任何其他用户输入一样轻松操作,所以这是我的 cookie getter 验证:

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. 我也可以运行 a preg_match,但是当我在使用它们之前针对值的白名单进行测试时,应该没有问题,除非json_decode以某种方式运行任意代码,它不会,对吧?

我知道如果它不是有效的 JSON,它会json_encode返回NULL,但我想知道这是否是正确的方法,或者我应该在调用之前添加某种验证json_decode

抱歉,如果这是一个太愚蠢的问题,我只是对 cookie/JSON 的经验很少,并且不希望成为我们服务器数据库丢失的罪魁祸首。任何帮助/信息表示赞赏。=]

4

3 回答 3

36

Using json_decode to decode the user input directly has no security problem.

It is just string parsing, won't do any string eval.

json_decode in php is like JSON.parse in javascript, and both of them could be used directly on the user input, they are safe at the decoding time.

But after being decoded, you have to validate the data for your requirement.

于 2012-09-06T02:18:20.107 回答
8

只要json_decode正确实现,在没有额外预处理的情况下使用应该是安全的(事实上,这可能会更糟,因为您的预处理器中可能有错误)。

于 2012-09-06T02:10:23.627 回答
5

json_decode will fail if the data is not in json format and otherwise will return an nice array for you to work with. Like Itay said if somebody can exploit this he almost deserves to get in. json_decode doesnt suffer from the risk of sql so I'd say you're fine doing this.

Just make sure you clean anything (or white list, like you already are) before incorporating it in a query.

于 2012-09-06T02:12:03.530 回答