这道题的题目就提示了和变量有关,打开之后就看到一串PHP代码。
PHP是世界上最好的语言!
仔细观察了每条代码,讲述了一个小小故事:
error_reporting(0);//关闭PHP错误显示;
include "flag1.php";// 引入flag1.php文件代码
highlight_file(__file__);//对文件进行语法高亮显示
if(isset($_GET['args'])){//判断url直接定义的args是否存在
$args = $_GET['args'];//将GET赋值的args赋值给变量$args
if(!preg_match("/^\w+$/",$args)){// /^开始, \w表示任意一个单词字符,即[a-zA-Z0-9_] ,+将前面的字符匹配一次或多次,$/结尾
die("args error!");//输出 args error!
}
eval("var_dump($$args);");//此函数显示一个或多个表达式的信息,包括表达式的类型与值
其中最关键的点是正则表达式的用法和双$$符号表示了可变变量。
比如:
$change_name = "trans"
$trans = "you"
echo $change_name
echo "<br>"
echo $$change_name
输出:
trans
you
其实原理很简单有木有。
接下来是正则表达式了,一开始想的是可以随便什么字母数字组合都行,后来仔细一想不对劲。
preg_match函数的定义是一个正则表达式表示匹配模式,然后加上一个想要匹配的单词。
插播一下正则表达式的虐人技巧...
<?php
// 从URL中获取主机名称
preg_match('@^(?:http://)?([^/]+)@i', "http://www.codercto.com/index.html", $matches);
$host = $matches[1];
// 获取主机名称的后面两部分
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>
执行结果如下所示:
domain name is: codercto.com
转自:
https://www.codercto.com/courses/d/852.html
题目这里就相当于以所有字母数字模式,匹配args变量。也就是说我们赋值的args变量的值要出现在PHP文件中。这怎么做到???
这时候就出现了全局变量、超全局变量!
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
这些超全局变量是:
-
$GLOBALS
-
$_SERVER
-
$_REQUEST
-
$_POST
-
$_GET
-
$_FILES
-
$_ENV
-
$_COOKIE
-
$_SESSION
$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
来源:W3SCHOOL
所以尝试着全局变量,网页向我们展示出了
flag历历在目让我想起了初春的阳光,啊,暖暖的,很贴心。