题目
<?php
error_reporting(0);
require __DIR__.'/lib.php';
if(isset($_GET['time'])){
if(!is_numeric($_GET['time'])){
echo 'The time must be number.';
}else if($_GET['time'] < 60 * 60 * 24 * 30 * 2){
echo 'This time is too short.';
}else if($_GET['time'] > 60 * 60 * 24 * 30 * 3){
echo 'This time is too long.';
}else{
sleep((int)$_GET['time']);
echo $flag;
}
echo '<hr>';
}
highlight_file(__FILE__);
分析
60 * 60 * 24 * 30 * 2=518400
60 * 60 * 24 * 30 * 3=777600
time传入数字处于这个区间即可在等待time秒后得flag,但显然不能等这么久
此处考虑php的弱类型比较问题
php弱类型比较
在PHP中遇到数字与字符串进行松散比较==
时,会将字符串中前几位是数字且数字后面不是.
,e
或E
的子串转化为数字,与数字进行比较,如果相同则返回为true,不同返回为false,后面的所有字符串直接截断扔掉。
例子:
var_dump(123==‘123asd’);//输出为true
var_dump(123==‘1234asd’);//输出为false
var_dump(123==‘123asd1234’);//输出为true
如果字符串数字后面是.
,e
, E
,则会有其他结果。
.
为浮点数的标志,会将字符串的子串转化为浮点数。
e
和E
为科学计数法的标志,将字符串的子串转化为科学计数法。
例子:
var_dump(123==‘123.5asd1234’);//输出为false
var_dump(123==‘123e5asd1234’);//输出为false
var_dump(123==‘123E5asd1234’);//输出为false
解法
输入的数字既能在518400-777600内,又能在int类型转换后是个小数字
考虑利用科学计数法
7e6 == 7000000
(int)7e6 == 7
参考
https://blog.csdn.net/baidu_41871794/article/details/83750615
https://www.php.net/manual/zh/types.comparisons.php