我正在存储整数索引的JSON编码数组=> cookie中的整数值。
显然,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页面,但这些并没有直接解决安全问题。
我的插件即将推出实时测试版,所以我想知道直接在Cookie上调用json_decode
是否足够安全,或者在调用json_decode
之前是否应该运行某种类型的验证。我也可以运行preg_match
,但是在使用它们之前我正在测试一个白名单值,除非json_decode
以某种方式运行任意代码,否则应该没有问题,它不是,对吧?
我知道json_encode
如果它不是有效的JSON则返回NULL
,但我想知道这是否是正确的方法,或者我应该在调用{{1}之前添加某种验证}}吗
很抱歉,如果这个问题太愚蠢了,我对cookies / JSON的经验很少,并且不愿意因为服务器的数据库丢失而受到指责。任何帮助/信息表示赞赏。 json_decode
答案 0 :(得分:30)
使用json_decode
直接解码用户输入没有安全问题。
它只是字符串解析,不会做任何字符串评估。
php中的 json_decode
与javascript中的JSON.parse
类似,它们都可以直接用于用户输入,在解码时它们是安全的。
但在解码后,您必须根据您的要求验证数据。
答案 1 :(得分:8)
由于json_decode
已正确实施,因此在没有额外预处理的情况下使用应该是安全的(事实上,考虑到您的预处理器可能存在错误,可能会更糟糕)。
答案 2 :(得分:5)
在将其合并到查询中之前,请确保清理任何内容(或白名单,就像您已经是这样)。