PHP是弱数据类型,所以学PHP对于很多人来说,易学,易用。PHP在使用双等号(==)判断的时候,不会严格检验传入的变量类型,同时在执行过程中可以将变量自由地进行转换类型。因为弱数据类型的特点,在使用双等号和一些函数时,会造成一定的安全隐患。
弱类型变量在使用过程中无须进行类型声明,数据类型根据代码执行情况可以动态变换。强类型指的是每个变量和对象都必须具有声明类型,它们是在编译时就确定了类型的数据,在执行时类型不能更改。
以下代码当用户输入type=0
时,会直接进入支付逻辑。开发人员看到会哭。
<?php
$type = $_GET['type'];
if($type=='pay'){ //这里使用双等号进行判断
echo "这里是支付逻辑";
}else{
echo "这里是其他逻辑";
}
建议使用三个等号(===)来判断变量值与类型是否完全相等。修改代码后可以解决这个问题,防止用户传入type=0
时执行支付逻辑。
<?php
$type = $_GET['type'];
if($type==='pay'){ //这里使用三个等号进行判断
echo "这里是支付逻辑";
}else{
echo "这里是其他逻辑";
}
使用PHP开发过程中,进行判断的时候,为了避免安全漏洞,特别注意弱类型机制的特性。下面是一些弱类型判断的示例,供大家参考。
<?php
var_dump(false == 0); //执行结果bool(True)
var_dump(false == ''); //执行结果bool(True)
var_dump(false == '0'); //执行结果bool(True)
var_dump(0 == '0'); //执行结果bool(True)
var_dump(0 == '0xxx'); //执行结果bool(True)
var_dump(0 == 'xxx'); //执行结果bool(True)
//例如:
var_dump(0=='admin'); //执行结果bool(True)
var_dump(1=='1admin'); //执行结果bool(True)
var_dump('1'=='01'); //执行结果bool(True)
var_dump('a'=='1a'); //执行结果bool(False)
大家想进一步学习可以查看一下PHP官方文档的松散比较表。
弱数据类型在项目研发过程中,主要表现在Hash比较、bool比较、数字转换比较、switch比较、数组比较等几种比较方式,容易被忽视。
总结:
1.如果能转换成另一个比较的类型则进行转换。比如:'1admin'和1比较,'1admin'转换成整型。
2.如果是相同类型,并且都能转换成同一类型则进行转换,如'1'=='01'比较,都能转换成整型,那就全部转换为整型然后进行比较,最后就是1==01。
3.如果是相同类型,但不能转换成同一类型,如'a'=='1a',两者不能同时转换成整型,只能都当作字符串来比较。
衡阳信安,船山院士网络安全团队官方唯一公众号,欢迎大家进群交流学习!长期招募有情怀的成员,致力于有情怀的教学。
原文始发于微信公众号(衡阳信安):渗透培训笔记:弱数据类型安全
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论