实验吧---你真的会php吗

啥都不说,抓包发现了猫腻,访问文件:

<?php


$info = ""; 
$req = [];
$flag="xxxxxxxxxx";

ini_set("display_error", false); 
error_reporting(0); 


if(!isset($_POST['number'])){
   header("hint:6c525af4059b4fe7d8c33a.txt");

   die("have a fun!!"); 
}

foreach([$_POST] as $global_var) { 
    foreach($global_var as $key => $value) { 
        $value = trim($value); 
        is_string($value) && $req[$key] = addslashes($value); 
    } 
} 


function is_palindrome_number($number) { 
    $number = strval($number); 
    $i = 0; 
    $j = strlen($number) - 1; 
    while($i < $j) { 
        if($number[$i] !== $number[$j]) { 
            return false; 
        } 
        $i++; 
        $j--; 
    } 
    return true; 
} 


if(is_numeric($_REQUEST['number'])){
    
   $info="sorry, you cann't input a number!";

}elseif($req['number']!=strval(intval($req['number']))){
      
     $info = "number must be equal to it's integer!! ";  

}else{

     $value1 = intval($req["number"]);
     $value2 = intval(strrev($req["number"]));  

     if($value1!=$value2){
          $info="no, this is not a palindrome number!";
     }else{
          
          if(is_palindrome_number($req["number"])){
              $info = "nice! {$value1} is a palindrome number!"; 
          }else{
             $info=$flag;
          }
     }

}

echo $info;

1.ini_set — 为一个配置选项设置值,设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。
display_errors
该选项设置是否将错误信息作为输出的一部分显示到屏幕,或者对用户隐藏而不显示。
2.禁用错误报告,也就是不显示错误
error_reporting(0);
3.
foreach有两种语法:

第一种:遍历给定的 数组语句 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

foreach (array_expression as $value)

第二种:同上,同时当前单元的键名也会在每次循环中被赋给变量 $key。

foreach (array_expression as $key => $value)

那么他两个的区别在哪里?我们直接上例子:

$a = array('Tom','Mary','Peter','Jack');

我们用第一种foreach方法来输出。

foreach ($a as $value) {

  echo $value."<br/>";

}

最后得到的结果是:

Tom
Mary
Peter
Jack
我们用第二种 foreach 方法来输出。

foreach ($a as $key => $value) {

  echo $key.','.$value."<br/>";

}

最后得到的结果是:

0,Tom
1,Mary
2,Peter
3,Jack
无论是一维数组还是二维数组,他们的区别就是第二种情况会在值前面加一个序号。
我们举个例子:
第一种输出

$c = array(

  array('1','Tom'),

  array('2','Mary'),

  array('3','Peter'),

  array('4','Jack')

);

得到这样的结果:

Array ( [0] => 11 [1] => Tom )
Array ( [0] => 22 [1] => Mary )
Array ( [0] => 33 [1] => Peter )
Array ( [0] => 44 [1] => Jack )

第二种输出:

foreach ($c as $key => $value) {

  echo '$key='.$key."<br/>";

  print_r($value);

  echo "<br/>";

}

$key=0
Array ( [0] => 11 [1] => Tom )
$key=1
Array ( [0] => 22 [1] => Mary )
$key=2
Array ( [0] => 33 [1] => Peter )
$key=3
Array ( [0] => 44 [1] => Jack )

strval(mixed pre)
功能:获取变量的字符串值
参数:只有一个,$ pre为任何数据类型的变量
返回值:类型(字符型),返回一个变量的字符串形式
在这里插入图片描述5.addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
在这里插入图片描述预定义字符是:
单引号(’)
双引号(")
反斜杠(\)
NULL

function is_palindrome_number($number) { 
    $number = strval($number); 
    $i = 0; 
    $j = strlen($number) - 1; 
    while($i < $j) { 
        if($number[$i] !== $number[$j]) { 
            return false; 
        } 
        $i++; 
        $j--; 
    } 
    return true; 
} 

以上代码的作用是:
对于number这个变量我们,把他的第一位与最后一位比较,以此类推。
7.intval() 函数用于获取变量的整数值。

if(is_numeric($_REQUEST['number'])){  
   //不能是数字
   $info="sorry, you cann't input a number!";

}elseif($req['number']!=strval(intval($req['number']))){
      //不能是数字,而且是number取整数之后不能等于它本身。
     $info = "number must be equal to it's integer!! ";  

}else{

     $value1 = intval($req["number"]);
     $value2 = intval(strrev($req["number"]));  //发转字符串

     if($value1!=$value2){   //反转之后不相等
          $info="no, this is not a palindrome number!";
     }else{
          
          if(is_palindrome_number($req["number"])){  
              $info = "nice! {$value1} is a palindrome number!"; 
          }else{  //不是palindrome数字
             $info=$flag;
          }
     }

}

所以我们要的到flag就必须满足:
1.不能是数字
2.字符串翻转之后必须相等,要注意是翻转的整数值相等,不是说必须要翻转的整数相等。
3.不是palindrome数字(第一个数字与最后一个数字不相等)
比如:
02000%20
%20url编码是空格
1.他不是数字
2.正向翻转2,反向也为2
3.不是回文数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值