攻防世界web基础题
解题:具有一定的php基础,了解php松散比较 ==
【题目】
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
【题目分析】
通过第一个if条件得到$flag1
松散比较请参考:PHP弱类型比较表
if($a==0 and $a){
echo $flag1;
}
/*
1. $a 由$_GET['a']赋值而来,$_GET是一个数组,数组中的每一个值都是一个字符串类型。
2. 由1可得$_GET['a']是一个字符串类型的值
3. $a == 0 为true 并且 $a 为true 则if条件成立
== 是php中松散比较,松散比较不会严格比较类型,而会进行类型转换。
$a==0 首先判断$a是不是int型,如果是,直接和0比较,如果不是int型,会将$a先转换为int型再和0比较。
将一个不含有数字的字符串转换为int类型时,它的值为0。例如'php' == 0 为true
将一个非0的字符串转换为bool型,其值为true 例如:'php' ==true 为true 而 '0' ==true 为false
综上所述,$_GET['a']可以为一个非零的字符串,例如:'php'
*/
通过第2、3个if条件得到$flag2
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
/*
is_numeric — 检测变量是否为数字或数字字符串,数字字符串就是这个字符串里面仅有数字。
$b 首先不能为数字或数字字符串,否则直接exit
$b 和int型的1234比较,先判断$b的类型,后转换int
'1234a' 转化为int型就等价于 1234 ,而'1234a'不是数字字符串,是一般的字符串
'0a' 转换为int型等价于 0
'a12345' 转化为int型等价于0
当一个前半部分为数字的字符串转换为int类型时,会保留前半部分的数字作为最终的值
综上所述,$_GET['b']的值可以为'99999a' 转换为int 后为 99999 > 1234
*/
数组与数字比较时,数组是永远大于int类型的数字的
例如
$b = array();
var_dump($b);
if( $b > 999999999999999){
echo '<br>'.'yes';
}else{
echo '<br>'.'no';
}
/*
运行结果:
array(0) { }
yes
*/
通过分析,本题的答案可以为
http://220.249.52.133:33567/?a='php'&b='9999php'
【总结】
一切输入的类型是可疑的,永远不要相信在弱类型的php下任何比较函数,任何数学运算。否则,你绝对是被php出卖的那一个。