您的位置:首页 > 编程语言 > PHP开发

PHP编程的安全性思考

2017-03-25 19:43 281 查看

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 编程 安全