1. "==" 与 “===”
-
== 在进行比较的时候,会先将字符串类型转化成相同,如果整型跟字符型比较字符或从左往右提取整型直到遇到字符结束,再比较。
-
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,当等号两边类型不同时,会先转换为相同的类型,再对转换后的值进行比较,如果比较一个数字和字符串或者涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照常数值进行比较。
//字符串和数字比较
var_dump(0=="admin"); //true
echo '<br>';
var_dump(1=="1admin"); //true
echo '<br>';
var_dump(1=="admin1"); //false
echo '<br>';
var_dump(0=="admin1"); //true
echo '<br>';
//数字和数组
$arr = array();
var_dump(0==$arr); //false
echo '<br>';
//字符串和数组
$arr = array();
var_dump("0"==$arr); //false
echo '<br>';
//"合法数字+e+合法数字"类型的字符串
var_dump("0e123456"=="0e4456789"); //true
echo '<br>';
var_dump("1e1"=="10"); //true
2. HASH比较缺陷
-
sha1函数和md5函数一样不能判断数组的值。
-
如果Hash值或者SHA1值以0e开头,后面都是数字,在与数字进行比较,就会被解释为010^n也就是0,就会被用于判断绕过。
$array1=[1,2,3]; $array2=[4,5,6]; var_dump(sha1($array1)===sha1($array2)); //true
var_dump(md5('240610708') == md5('QNKCDZO'));//true
$array1=[1,2,3];
$array2=[4,5,6];
var_dump(md5($array1)===md5($array2)) //true
-
3.bool欺骗
4. 数字转换欺骗
-
5. 生日欺骗
结论: hash function是不安全的
-
6. strcmp()函数
-
比较函数如果两者相等返回0,string1>string2返回>0 反之小于0。在5.3及以后的php版本中,当strcmp()括号内是一个数组与字符串比较时,也会返回0。
$pd = "6666"; if(strcmp($_GET['pwd'],$pd) == 0){ echo "giao"; }else{ echo "?"; }
Switch()函数
is_numeric()函数
in_array()函数
$array=[0,1,2,'3'];
var_dump(in_array('abc', $array)); //true
var_dump(in_array('1bc', $array)); //true
array_search 与 is_array函数
-
is_array:判断传入的是不是一个数组。
-
array_search(x,$数组):在数组中寻找与指定值(x)相等的值,array_search函数 类似于"==",会进行类型的转换。
-
if(!is_array($_GET['test'])){ exit(); } $test = $_GET['test']; for($i = 0;$i<count($test) ;$i++ ){ if($test[$i] === "admin"){ echo "error"; exit(); } $test[$i] = intval($test[$i]); } if(array_search("admin",$test) === 0){ echo "flag"; }else{ echo "false"; }
empty函数与isset函数
-
变量为:0,"0",null,'',false,array()时,使用empty函数,返回的都是true
-
变量未定义或者为null时,isset函数返回的为false,其他都为true
$a = null; $b = 0; $c = ""; var_dump(empty($a)); var_dump(empty($b)); var_dump(empty($c)); var_dump(isset($a)); var_dump(isset($b)); var_dump(isset($c));
7. 变量覆盖
- $$
extract()
post提交
Parse_Str()函数
import_request_variables()函数