我在 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 的经验很少,并且不希望成为我们服务器数据库丢失的罪魁祸首。任何帮助/信息表示赞赏。=]