1、既是0又是1的情况
$a==1 & $test[$a]=t 时
知识点1)php在处理数字时,如果数字的位数超过 16 位是可以弱等于1的,也就是
var_dump( 9999999999999999999 == 1 );//true
因为当数字位数超过 16 位时,是将该数字转换成了数值为 1 的字符串进行处理
知识点2)在科学计数法中也有种特殊情况,0.1e1 是代表 0.1*10,而 .1e1 代表的也是 0.1*10 ,但在数组中时,由于 . 代表的是字符串,所以会于数组中变成 0 ,于 is_numeric 中有点则正常输出为数字
// 打印数组b下标为0的数据
echo $b['.1e1'] //输出t
2、switch代码漏洞
当使用 switch 并且没有使用 break 来跳出循环时,代码是会继续往下执行。这属于程序员在编写程序出现的人为漏洞,并不是语言本身的问题。
3、$a==0可用.绕过(非数字都可绕过)
如何使 $a==0 的同时 $a 又为真?
<?php
$a=$_GET['a'],
if ($a==0){
echo "1";
}
if ($a) {
echo "must";
}
?>
答:接收参数$a得存在,并且$a==0可用 . 绕过(非数字都可绕过) ,例如输入 .1e1
4、php://伪协议绕过
接收参数中不能出现某一字符,但下面又必须使用时,就可以php://伪协议绕过
$s=file_get_contents(php://input);
<?php
$res=file_get_contents('php://input');
var_dump('file_get_contents 数据是:'.$res);
echo '<br>post 数据是:';
var_dump($_POST);
运行后我们会发现:file_get_contents('php://input')不能接收curlpost过来的数组
解释:如果POST的原始数据是一维数组或&拼接的标准格式的键值对字符串,那么可以用$-POST来获取。
如果要通过file_get_contents获取,这种情况下可以发送json字符串,用ison_encode转一下或者使用http_build_query:比如上面修改如下:curl_setopt($ch, CURLOPT_POSTFIELDS, http _build_query($data));//POST数据结果:
string(97)"file_get_contents 数据是:username=%E5%91%A8%E4%BC%AF%E9%80%9A&password=123456&sign=asdfg123456"
post 数据是:array(3){["username"]=> string(9)"周伯通"["password"]=> string(6)"123456"["sign"]=>string(11)"asdfg123456"}