🌟 想系统化学习 PHP 编程?看看这个:[编程基础] PHP · 学习手册
在前面的章节中我们已经成功安装了 PhpStudy(PHP 集成开发环境),有了该开发环境,我们就可以编译运行 PHP 代码了。
在编写 PHP 代码前,我们先过一下 PHP 程序的整体运行流程:
我们首先会在网站的指定目录下(假设值根路径下)编写一个后缀为 .php
的源代码文件,该文件内部可以包含 .html
文件中的内容,然后我们开启 PhpStudy 的 Apache 环境。当有用户访问这个 PHP 文件时,Apache 会调用 PHP 解析器解析 PHP 文件中的内容,并将解析后的内容返回给用户浏览器,用户浏览器接收到服务端发来的内容,解析,并渲染,就成了我们的网页。
0x01:PHP · 初窥门径 —— 声明 PHP 代码块
在前面的介绍中说了,PHP 文件中是可以写 HTML 代码的,像这种 HTML & PHP 混杂写的脚本,如何让解析器识别哪里是 PHP 代码呢 ?这就需要提到 PHP 的声明了。 PHP 的声明有如下四种格式:
0x0101:PHP 代码块声明 — 标准版
下面这种以 <?php
开头,以 ?>
结尾的样式,是 PHP 最标准的声明格式,也是最常用的格式:
<?php
echo "这是 PHP 的代码"; # echo 是用来输出的函数。
?>
0x0102:PHP 代码块声明 — 省略 php 版
在网络攻防中,有些检查器会通过检查用户上传的内容中是否包含 <?php
来判断用户是否上传了一个恶意脚本,针对此种情况,我们可以采用下面这种声明方式进行绕过:
<?
echo "这也是 PHP 代码";
?>
0x0103:PHP 代码块声明 — 省略结尾版
有时你是不是觉得,写 ?>
的结尾很烦,没关系,这个其实也是可以省略的,省略的结果就是,PHP 解释器会认为,从 <?
开始的后续的所有的内容都是 PHP 的代码块:
<?
echo "这也是 PHP 代码";
echo "这还是 PHP 代码";
0x0104:PHP 代码块声明 — 短开标签版
<?=是什么意思? | 那些遇到过的问题如何解决<<?=是什么意思?>经验,为你挑选了2个好方法https://qa.1r1g.com/sf/ask/137147951/
该声明方式奇奇怪怪的,笔者也是在学习 “网络攻防” 时遇到的,其格式如下(下面的 $name
是 PHP 中声明变量的格式,至于啥是变量我们后面会讲):
<?= $name ?>
上面这个格式其实可以等价于下面这样:
<?php
echo $name;
?>
以 <?=
开头的这种写法,笔者经常是在写一句话木马时用到,比如下面这样(有点复杂了哈哈):
<?= @eval($_POST['hacker']) ?>
上面的 eval()
函数,它可以执行系统命令,然后 $_POST['hacker']
它可以接收用户的输入,那这两个命令一结合是不是就可以执行任意系统命令啦,但是执行完系统命令还不行,我们得看到命令结果的回显吧,那正好 <?=
就帮我们干了这样一个事(不懂没关系,笔者只是这边提一嘴)。
0x02:PHP · 初窥门径 —— 编写并执行 PHP 源文件
在上一小节中,你已经学会了如何声明 PHP 代码了,其实也就是学会了如何编写基本的 PHP 语言的框架了,所以本小节,着重教你如何 “执行 PHP 代码”。
0x0201:快速验证 PHP 代码 —— 交互式编写
如果你是一个 PHP 开发者,下面这种方式可能不是很适合你(可以跳过)。如果你是一个 “网安” 爱好者,那么下面这种方式应该会经常用。
我们在看 PHP 代码时,经常会遇到一些奇奇怪怪的函数,这个时候光看函数解析是没用的,我们一般还会尝试运行一下来确认其用法,此时,我们就可以通过在命令行中输入下面这个内容,开启一个交互式的 PHP 运行窗口:
php -a
如上,运行完成后,会出现以 php >
开头的一个小窗口,此时我们就可以快速输入语句,并单行执行啦,比如我们输入下面这个语句并回车:
echo "Welcome To Hack3rx!";
echo
这个函数就是用来输出后面我们给它的变量的值的,现在这个值叫 “Wlecom To Hack3rX!”,你看,它是不是直接就输出了。
除了上面这种简单的用法外,我们其实还可以调用一些函数来看看,比如下面这个,我们尝试把 Welcom To Hack3rX!
进行 Base64 编码并输出:
echo base64_encode("Welcome To Hack3rx!");
OK,就说这么多,不认识也没关系,随着后面的学习,你会逐渐理解这种交互式编写的优势的。最后再说一下怎么退出这种状态,按住 Ctrl + C 即可:
最后提一嘴,啥是 “交互式编辑”,像上面这种,我写一行,它输出一行,是不是就是我一句,它一句,我们就产生交互了 ?这就是交互式编辑。
0x0202:通过 php 命令运行 PHP 脚本文件
在前面的介绍中,我们一直认为 PHP 是一种网页开发语言,PHP 重心确实是为写网页而生,但这其实也并不妨碍它可以作为一种脚本语言运行。
我们随便找个目录,创建一个 test.php
,内容如下(可以使用文本编辑器,没事的,主要是笔者在这里都还没有讲到 PHP 的 IDEA 咋用):
<?php
echo "1 + 1 = ";
echo 1 + 1;
然后还是在这个目录,选中目录上的路径,然后输入 cmd 即可快速在当前文件夹中打开 CMD 窗口:
然后我们在打开的 cmd 窗口中输入下面的内容,即可使用 PHP 解释器快速运行 PHP 文件:
php test.php
至于为啥会打印 1 + 1 = 2,读者可以去看看我们写入源码(现在不懂没关系,知道有这种运行方式就可以,即 PHP 文件也是可以作为脚本运行的)。
0x0203:通过 Web 服务中间件解析并执行 PHP 脚本文件
此节就是我们最常用的了,即用 PHP 语言编写 Web 文件,并用客户端访问。首先,我们先定位到 PhpStudy 的 Web 站点根路径下:
然后我们在其 Web 站点根目录下创建一个 test.php 文件,内容如下(PHP 与 HTML 混合):
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Welcome To Hack3rX !!</title>
</head>
<body>
<h3><?php
echo "1 + 1 = ";
echo 1 + 1;
?>
</h3>
</body>
</html>
创建完成后就可以访问了,那么如何访问呢 ?自然是通过浏览器,那么访问哪个地址呢 ?看一下 PhpStudy 的那个域名:
我们现在是不是将 test.php 写到了 localhost 域名根目录下 ?那很自然的,我们就可以通过访问下面这个地址,来获取 test.php 中的内容(这里涉及了域名等的基础概念,属于计算机网络基础):
http://localhost/test.php
但是你现在访问大概率会出现上面的情况,是我们操作有问题吗 ?这到也不是,你想,我们通过浏览器上的 URL 访问一个站点,那个站点凭啥要接受我们的访问 ? 如果每个人都可以随意访问别人电脑中的资源,那不就乱套了嘛。
不过,我们现在的诉求就是,要让别人能访问到,此时,我们就可以去开启 PhpStudy 中的 Apache 服务(其实 Nginx 也可以):
Apache 服务就会接收别人访问本机 80 端口的请求(http 协议默认是 80 端口,这个也是计算机网络的只是),并进行处理。此时我们再访问一下看看:
如上,可以看到,页面成功展示了 1 + 1 = 2,但我相信你也注意到了,其展示的结果和我们后端源码其实不一致,倒是和后端源码中 PHP 执行完成后的结果一致。这也就是笔者前面一直介绍的 PHP 站点的执行流程。
用户向 Apache 发起请求,请求一个 PHP 文件,Apache 会调用 PHP 解析器对该 PHP 文件进行解析,并将解析后的文件以纯 HTML 格式返还给前端。这就是为啥,前端看就和 HTML 一样,后端却是贼拉复杂的代码的原因。
读者还可以通过我们前面介绍的 php 命令,直接运行后端的 test.php 看看结果:
0x03:PHP · 初窥门径 —— PHP 程序中常见问题
PHP 文件说实话,它规则不是很严谨,你偶尔写错一两个字符,它也不会像其他变成语言一样直接摆烂,只要错的不是很离谱,它就会直接执行下去。
初学者学习 PHP 时,经常发生如下问题(笔者大概列一下,你自己写时候注意一点):
-
PHP 文件后缀问题: PHP 文件后缀目前推荐就用
.php
,别写成.html
了。 -
PHP 分号结束问题: PHP 中每行代码都必须以分号结束,别把 PHP 和 Python 搞混。
0x0301:PHP 文件后缀问题
其实 PHP 文件后缀不一定必须是 .php
,这个我们是可以控制的(比如可以通过修改 .htaccess
文件进行配置),只不过由于大部分读者是初学者,就先这么理解吧。
我们前面介绍了,PHP 文件中可以混杂 HTML 代码,并且也演示了,此时就会有小伙伴想,我要是往 HTML 文件中写 PHP 代码是不是也会执行 ?笔者告诉你,不会(我试过)。
比如还是前面演示的那个 test.php,我把其后缀该为 .html 后再次访问:
http://localhost/test.html
如上,并没有解析。但其实,学到后面你会发现,这些都是可以自由控制的,我们甚至可以把 .txt 文件都当作 HTML 解析。
笔者讲这些就是告诉你,编程语言没啥特别的,很多初学者都会说,我没有 IDA 我咋写程序嘛,但 IDA 啥的其实本身只是个高级的文本编辑器,要让程序运行主要还是靠编程语言的解释器。你只要装了解释器,你拿啥都能写程序,比如上面的记事本。
而且程序的后缀也不是一成不变的,只是我们喜欢这么约定俗成而已,这些都是可以通过自己的配置更改的,这就是人造学科的魅力,可以说,计算机就是建立在约定上的一门学科(网络协议更是如此,啥 HTTP,都是人与人之间的约定计算机化了而已)。
0x0302:PHP 分号结束问题
每行 PHP 代码都必须以分号(;
)进行结尾,不然运行的时候会报错:
虽然如此,但 PHP 还是很灵活的,比如下面这个代码就不会报错,读者可以自行尝试,笔者并不推荐这种写法,笔者把例子放这里,就是为了让读者看看 PHP 语法有多宽松:
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Welcome To Hack3rX !!</title>
</head>
<body>
<h3><?php
echo "1 + 1 = ";
echo 1 + 1
?>
</h3>
</body>
</html>