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安全编程:register_globals的安全性
- PHP安全编程:register_globals的安全性 全局变量注册(转)
- PHP 编程安全性小结
- PHP安全编程:register_globals的安全性
- php的缓冲/缓存 js对象 ,php编程的深入思考-1
- [李景山php] 关于编程的思考
- php安全编程: register_globals的安全性
- PHP安全编程之register_globals的安全性
- PHP安全编程:register_globals的安全性 全局变量注册
- PHP 编程安全性小结
- PHP安全编程:register_globals的安全性
- C专家编程--学习笔记(2)_对内存的思考
- PHP套接字编程
- [ZT]用PHP与XML联手进行网站编程
- PHP编程技巧:看实例学正则表达式
- Think in Code,用代码思考-袁红岗编程思想
- Zend PHP 5 编程大赛冠军归 Qiang Xue
- 理解PHP中的MVC编程之MVC框架简介
- 最近碰到个问题,关于php扩展编程如何返回数组的问题
- Windows 安全性编程