php中in_array()和array_search()的弱类型问题

晚上基佬pcat突然问我一个题怎么做,其实我也很绝望啊。也是第一次见这个套路

丢出代码大家观赏

if(is_array(@$b["a"])){
        echo "1";
        echo "\n";
        if(count($b["a"])!==2 OR !is_array($b["a"][0])) die("ha1");
        $c = array_search("JILAO", $b["a"]);
        $c===false?die("ha2"):NULL;
        foreach($b["a"] as $key=>$val){
            $val==="JILAO"?die("ha3"):NULL;
        }
        echo "Ture";
}

前面几个判断都很容易绕过,到了最后一步发现存在问题,因为上面array_search()要求必须要有"JILAO"
但是后面又不让出现这个值,想了很久

image

然后就想这个两个函数肯定有一个存在绕过的,最后还是手册好用啊

mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )

最后还有一个参数$strict就是定义是否严格检测

$strict
如果可选的第三个参数 strictTRUE,则 array_search() 将在 haystack 中检查完全相同的元素。 这意味着同样严格比较 haystackneedle 的 类型,并且对象需是同一个实例。

默认为不严格
那就和=====的弱类型问题一样

测试代码

<?php 
$array=array(0,1);
var_dump(array_search('JILAO', $array)); 
var_dump(array_search('1bert', $array)); 
?>

打印

int(0)
int(1)

好了找到问题所在了,
不严格模式下在匹配过程中'JILAO'变成了
1bert变成了1

翻阅手册后发现in_array()也同样存在这个问题

又是百无聊赖的周末

又是啥也不会的pwnhub

很绝望

发表评论