松散比较
- 松散比较:
==
比较时先转数据类型再进行比较 - 严格比较:
===
比较时先判断两种字符串类型是否相等,再进行比较
例:
"admin"==0
"1admin"==1
"admin1"==1
- 如果该字符串没有包含’.’ ‘e’ 'E’并且数值在整形范围值内,该字符串被当作int来取值,其他所有情况下被当作float来取值,该字符串的开始部分的值决定了它的值,如果该字符串以合法的数值开始,则使用该字符否则为0(不是字符串的0)。
哈希比较缺陷
- 如果hash值以0e开头,后面都是数字,再与数字比较时就会被解释为010^n(科学计数法)还是0就会被判断为相等,从而绕过登陆环节。
var_dump(md5(''250610708')==md5('QNKCDZO')) #输出为bool类型true
var_dump('0e12345'=='0e5767')
布尔欺骗
- 当存在json_decode和unserialize时,部分结构会被解释为bool类型,会造成欺骗
数字转换欺骗
var_dump(intval('2'))
var_dump(intval('3bc'))
var_dump(intval('abcd'))
var_dump(0.9999999999999999999==1)
boolean strcmp(str1,str2)
- str1,str2是两个字符串,如果str1小于str2返回<0的数,如果str1大于str2,返回>0的数,两者相等的话返回0
- 缺陷字符串与array()数组比较,返回0
var_dump(strcmp('passwd',a[]))
md5()函数
- md5()函数描述的是string md5(string $str[,bool $raw_outpuy=fake])
- md5()中需要的是一个string函数,但是当你传一个array()数组时,md5不会报错,只是无法求出array的md5值,这样会导致任意两个array的md5值都会相等
var_dump(md5([1,2,3])==md5([4,5,6]))
switch()函数
is_numeric()函数
$id='0x3120616e6420313d31'
if(is_numeric($id))
{
$sql='select * from admin and where id = $id;
echo $sql
}
in_array()函数
- 与array_search()相同
- in_array()函数的解析是bool in_array(mixed $needle,array $haystack [,bool $strict=false]
- 如果是
$
strict参数没有提供,那么in_array就会使用松散比较来判断$
needle是否存在$haystack中 - 当strict的值为true时,in_array()会比较needle的类型haystack是否相同
empty(var)函数
- 当var存在,并且时非空非零的值时返回false,否则返回true
- isset()函数相同
" "
0
0.0
"0"
NULL
FALSE
array()
$var
变量覆盖
- $$变量覆盖
- extract()函数
该函数使用数组键名作为变量名,使用数组的键值作为变量值
针对数组的每一个元素,将在当前符号表中创建一个对应的变量
extract(array,extract_rules,prefix)
extract flags标记位,默认存在变量覆盖漏洞
<?php
show_source(__FILE__);
$key = "bad";
extract($_POST);
if($key === 'bad'){
die('badbad!!!');
}
$act = @$_GET['act'];
$arg = @$_GET['arg'];
if(preg_match('/^[a-z0-9_]*$/isD',$act)) {
echo 'check';
} else {
$act($arg,'');
}
echo '666';