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

Fab*_*tté 28 php input-sanitization

我在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();
}
Run Code Online (Sandbox Code Playgroud)

然后在使用任何值之前,我检查它是否存在于数组中并针对列出白名单的值进行测试 - 这部分看起来非常安全,但我发布它是因为它是验证的一部分:

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
}
Run Code Online (Sandbox Code Playgroud)

回到问题,直接在cookie上调用是否安全json_decode用户可以操纵cookie来运行任意代码吗?

到目前为止,我一直在阅读关于SO的许多主题,我发现它unserialize()是暗淡不安全的,因为它称为构造函数,但json_decode在技​​术上是安全的.我已经阅读了他们的php.net页面,但那些没有直接解决安全问题.

我的插件即将到达实时测试版,所以我想知道json_decode直接调用cookie是否足够安全,或者我是否应该在调用之前运行某种类型的验证json_decode.我也可以运行preg_match,但是在使用它们之前我正在测试一个值的白名单,除非json_decode以某种方式运行任意代码,否则应该没有问题,它不是,对吧?

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

对不起,如果这个问题太愚蠢了,我对cookies/JSON的经验很少,并且不愿意因为服务器的数据库丢失而受到指责.任何帮助/信息表示赞赏.=]

xda*_*azz 32

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

它只是字符串解析,不会做任何字符串eval.

json_decode在PHP中就像JSON.parse在javascript中,它们都可以直接用在用户输入上,它们在解码时是安全的.

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


Ham*_*ish 8

如果json_decode正确实现,没有额外的预处理就可以安全使用(实际上,考虑到预处理器中可能存在错误,可能会更糟糕).


Eri*_*rik 5

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

只需确保将任何内容(或白名单,如您所愿)清理干净,然后再将其合并到查询中即可。