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

2022-08-30 13:59:51

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

显然,Cookie可以像任何其他用户输入一样轻松操作,因此这是我的cookie获取器验证:

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
}

回到问题,直接在饼干上呼叫json_decode是否安全?用户能否操纵 Cookie 来运行任意代码?

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

我的插件很快就会达到实时测试版,所以我想知道直接在cookie上调用是否足够安全,或者我是否应该在调用之前运行某种类型的验证。我也可以运行一个,但是由于我在使用它们之前正在针对值的白名单进行测试,因此除非以某种方式运行任意代码,否则应该没有问题,不是吗?json_decodejson_decodepreg_matchjson_decode

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


答案 1

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

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

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

但是在解码后,您必须验证数据是否符合您的要求。


答案 2

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


推荐