为了账号安全,请及时绑定邮箱和手机立即绑定

PHP代码安全--类型对比

标签:
PHP
字符串与数字对比

原理:

$a = '1DullCat';
$b = 'DullCat1';
var_dump($a == 1); //truevar_dump($b == 1); //falseintval($a); //1intval($b); //0

php的对比运算时,是会将两个变量都转换为相同类型,不同变量的无法对比
当字符串和int类型对比时,将会把字符串转化为int类型,相当于字符串在底层执行了一次intval()函数.
至于为什么数字放前面就能intval,放后面就不行,是因为:
该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
怪不得有些网站注册时非要名字以字符串开头....

注意:如果字符串在比较时带有'e','E'时,会被解析为科学计数法,如var_dump('1e123' == '1');为false

案例1:

$type = $_POST['type']   
 if($type == 1){  $sql = "select * from test where type = $type";
}
mysql_query($sql);

案例2:

$type = $_POST['type']   
switch($type)
{    case 1:
            $sql = "select * from test where type = $type";             break;    default:            die();
}
mysql_query($sql);

延伸:
如果字符串和数字比较会出现类型转换的问题,那么一些php自带函数会不会出现相同的问题?

in_array()

$haystack = array(1,2,3,4);
$needle= '1DullCat';
var_dump(in_array($needle,$haystack)); //truevar_dump(in_array($needle,$haystack,true)); //false

虽然也会出现问题,但是一直都有解决的方案,in_array()存在第三个参数,决定是否严格检查,
默认为false , 相当与 "==" , 传入true ,相当于"==="
还有很多这样的函数,如array_search(),这里不一一介绍了

函数返回值与数字对比

strcmp()
用来比较字符串和字符串,如果相等则返回0
一般有人会这么写

$a = $_POST['str'];if(strcmp($a,'DullCat') == 0){  //执行}

这段代码便可以使用传入数组来绕过
因为用strcmp()对比数组和字符串时返回值为null, 但是 null == 0为true ,所以继续执行

md5()
函数传入数组会返回null;
但是本猫看了下网上的例子, 真的认为完全不合逻辑,就暂时一笔带过

总结
一定要做好参数的过滤,在使用他之前
应该常用 "===" 来判断,而不是"=="
应该了解每一个常用函数的参数和返回值,尽量采用严格模式



作者:DullCat
链接:https://www.jianshu.com/p/d19ffbb850a9

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消