PHP编程的安全性思考

来源:互联网 发布:情定三生知夏向天圆房 编辑:程序博客网 时间:2024/06/05 15:25

switch case忘记加break的后果

        $var= 0;        switch ($var) {            case 0:            case 1:                $var= 1;                break;        }        echo $var;//期望输出 0  实际输出  1

notice:如果不在 case 的语句段最后写上 break 的话,PHP 将执行所有的 case 语句!这将是非常危险的。


数字与字符串比较的陷阱

        $var1 = "2018a";        $var2 = "a2018";        $flag1 = 0;        $flag2 = 0;        ($var1 > 2017) ? $flag1 = 1 : NULL;        ($var2 > 2017) ? $flag2 = 1 : NULL;        echo $flag1;//输出 1        echo $flag2;//输出 0

notice: 数字与字符串比较时, 先尝试将字符串转换为数字, 再比较, 一个不能转换为数字的字符串, 转换结果为0,避免出现这种非预期结果的情况是使用类型比较符“===”。


不严格的array_search,你找到的真的是我吗

        $var = array(            0 => "a", 1 => true        );        var_dump(array_search("cx", $var));//期望输出 bool(false)  实际输出  int(1)

notice: array_search可选的第三个参数strict 如果为 TRUE,则 array_search() 将在数组中检查完全相同的元素。然而该参数默认为FALSE,这意味着如果你正在数组中寻找一个字符串,刚好它有个键对应的值是TRUE,那么无论如何你都会得到它所对应的那个键,不论被查找的字符串是否真的存在!


有时候我们不需要进行碰撞就能得到不可思议的MD5值比较结果

        $flag = false;        $girl = '15562';//一个孤单的女孩        for ($i = 0; $i < 1000000; $i++) {//她走到街上            $boy = "";            for ($i = 0; $i < 5; $i++) {                $boy .= chr(mt_rand(33, 126));//路人生成中            }            $boy = $boy . 'CHENG';//一个路人和她相遇了            if (substr(md5($boy), 8, 16) == substr(md5($girl), 8, 16)) {//另一半会是他吗                $flag = true;                break;            }        }        var_dump($flag);//期望输出 bool(false) 实际输出  bool(true)

notice:类似15562这样的数字能够在md5加密之后可能形成0e12312351的hash串,这种形式 的字符串会被“聪明”的PHP解析器默认解析为 numerical strings类型。在利用”!=”或”==”来对哈希值进行比较时,numerical strings类型强制转换结果为数字0。所以如果两个不同的密码经过md5加密以后,其hash值都是以”0e”开头的,那么PHP将会认为他们相同,都是0。


0 0
原创粉丝点击