zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHP的弱数据类型安全

PHP安全 数据类型
2023-09-27 14:25:41 时间

弱类型比较缺陷

若类型,即在变量在使用过程中无需进行类型声明,数据类型根据代码执行情况可以动态变换(区别强类型指得是每个变量和对象都必须具有声明类型,它们是在编译时就确定了类型都数据,在执行时不能更改)。

由于PHP的若数据类型特性,使得PHP易学和易用,但正是由于这一点,在使用双等号‘==’和某些函数时,会造成一定的安全隐患。比如下面例子:

<?php

    var_dump(0 == 'xxx');
    var_dump(0 == '0xxx');

?

都会输出true,这会造成我们某些验证中,可以通过传入参数0巧妙地被跳过,所以我们应该在判断等于时用 === 来判断

Hash比较缺陷

我们的密码经过hash散列计算后,是有可能以0开头的,那么我们在进行判断时同样可以传入参数0跳过某些系统逻辑。在5.6版本以后,新增了hash_equals()函数用来比较hash值,可以避免对比被恶意跳过。如果版本低于5.6也没有关系,可以自己定义实现该函数:

if(!function_exists('hash_equals')){
    function hash_equals($a, $b){
        if(!is_string($a) || !is_string($b)){
            return false;
        }    

        $len = strlen($a)
        if($len !== strlen($b)){
            return false;
        }

        $status = 0;
        for($i = 0; $i < $len; $i++){
            $status |= ord($a[$i]) ^ ord($b[$i]);
        }

        return $status === 0;
    }
}

bool比较缺陷

在使用json_decode()和unserialize()函数时,部分结构有肯能会被解析成bool类型,造成比较缺陷,下面代码会输出true

<?php
 var_dump(true == 'root');
?>

避免的方法是,比较json_decode和unserialize函数解析的变量,用 === 三等号。

数字比较缺陷

当整形超出PHP整型范围时,PHP_INT_MAX(9223372036854775807)和 PHP_INT_MIN(-9223372036854775808)会按照最大或最小值进行保留和计算,输入超出范围值时,可能会造成业务逻辑错误,所以在判断整型的地方需要判断是否超出最大最小值。

switch比较缺陷

当在switch中使用case判断数字时,switch会将其中的参数转换为int类型进行计算,加入case判断0,那么传入任意string都可以执行case0的逻辑,所以在进入switch前一定要判断数据类型的合法性,同时在业务中如果可以的话,尽量避免case为0的判断。