PHP黑魔法之既是0又是1/switch/$a==0可用.绕过(非数字都可绕过)/PHP://伪协议绕过

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"}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏大橙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值