题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。
题目虽然是不难,我们做题的目的是为了总结知识点。下面的php弱类型比较的知识点都是多位大佬总结的,真香。
php有两种比较的符号 == 与===
=== :在进行比较的时候,会判断两种字符串的类型是否相等,再比较。
== :在进行比较的时候,会先将字符串类型转成相同,在进行比较
==如果比较一个数字和字符串,或者比较涉及到数字内容的字符串,则字符串会被转换成数值,并且比较的方式会按照数值进行。
代码示例:
<?php
var_dump("admin"===0); //bool(false) ===:字符串不能和数字比较,所以错
var_dump("admin"==0); //bool(true) admin转换为0
var_dump("1admin"==1); // bool(true) 1admin转换为1
var_dump("admin1"==1); //bool(false) admin1转换为0
var_dump("admin1"==0); //bool(true) admin1转换为0
var_dump("0e123456"=="0e4456789"); //bool(true) 0e:为科学计算法, 0的多少次方都为0,所以正确
?>
1 观察上述代码,"admin"==0 比较的时候,会将admin转化成数值,强制转化,由于admin是字符串,转化的结果是0自然和0相等
2 "1admin"==1 比较的时候会将1admin转化成数值,结果为1,而“admin1“==1 却等于错误,也就是"admin1"被转化成了0,为什么呢??
3 "0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等
问题2的答案
当一个字符串欸当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内
该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
注:<、>、<=、>=都存在和==相同的弱类型,原理相同!!!
var_dump:是PHP中的调试函数,用于判断一个变量的类型与长度,并输出变量的数值。可以用var_dump打印所有的对象,查看对象内部的数据结构。
解:
既然前置知识已经学完,就开始解题了。我们首先来分析一下代码。。。感觉回到以前做数学题的时候了。。。。
<?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;
}
?>
(1)include("config.php"); 文件包含,使用include函数包含了config.php文件
(2)$a=@$_GET['a']; $b=@$_GET['b']; url可以接受a,b参数的值
(3)if($a==0 and $a) :如果a等于0和$a, 得到flag1。 所以a可以输入任意的纯字母,也可以字母加数字,但是数字不能在第一个,参考上面问题2。
(4)if(is_numeric($b)) : 如果b为纯数字,就会退出,所以b不能为 纯数字
(5)if($b>1234) : 只要b大于1234,就可以得到flag2,并且b不能为纯数字,所以,可以使用一个大于1234的数字加字母组成
结论:a输入任意的纯字母,b使用一个大于1234的数字加字母组成
最后得到flag
Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}
参考链接:
https://blog.csdn.net/qq_41617034/article/details/91847131
https://www.cnblogs.com/Mrsm1th/p/6745532.html
声明:
本文仅限于大家技术交流和学习,严谨读者利用本博客的所有知识点进行非法操作。如果你利用文章中介绍的技术对他人造成损失,后果由您自行承担,感谢您的配合,
作者创作不容易,请大家点赞支持一下。谢谢各位读者大老爷。