在用户输入上调用json_decode是否安全?

时间:2012-09-06 02:03:51

标签: php input-sanitization

我正在存储整数索引的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

3 个答案:

答案 0 :(得分:30)

使用json_decode直接解码用户输入没有安全问题。

它只是字符串解析,不会做任何字符串评估。

php中的

json_decode与javascript中的JSON.parse类似,它们都可以直接用于用户输入,在解码时它们是安全的。

但在解码后,您必须根据您的要求验证数据。

答案 1 :(得分:8)

由于json_decode已正确实施,因此在没有额外预处理的情况下使用应该是安全的(事实上,考虑到您的预处理器可能存在错误,可能会更糟糕)。

答案 2 :(得分:5)

如果数据不是json格式,则json_decode将失败,否则将返回一个很好的数组供您使用。就像Itay所说,如果有人可以利用这个,他几乎应该进入.json_decode不会遭受sql的风险所以我会说你做得很好。

在将其合并到查询中之前,请确保清理任何内容(或白名单,就像您已经是这样)。