Web 安全的核心在后端,而后端语言中 PHP 占据了半壁江山。DVWA、SQLi-Labs 等经典靶场都是 PHP 写的,不懂 PHP 就看不懂漏洞原理。这一篇从最基础开始:PHP 是什么、怎么运行、变量和数组怎么用、GET 和 POST 有什么区别。
一、PHP 是什么
PHP(全称:PHP: Hypertext Preprocessor)是一种广泛使用的服务器端脚本语言,专为 Web 开发设计。
核心工作模式:客户端(浏览器)发起请求,服务器端执行 PHP 代码,生成 HTML 响应并返回给客户端。
关键特征:用户仅能获取运行后的结果(HTML 页面),无法查看 PHP 核心源代码。这与 HTML/CSS/JavaScript 等前端语言不同 —— 前端代码在浏览器端执行,用户可以直接查看源码;而 PHP 在服务器端执行,用户看到的只是执行后的输出。
二、PHP 运行环境
2.1 为什么本地双击 .php 文件无效
双击电脑上的.php文件会发生什么?不是执行,而是用记事本打开显示源代码。
原因很简单:PHP 代码在本地电脑上没有服务器环境,无法执行,只会以文本形式在编辑器中打开。PHP 必须在 Web 服务器(Apache/Nginx)环境中才能被解析执行。
2.2 使用 phpstudy 集成环境
推荐使用phpstudy等集成环境,一键安装 Apache/Nginx + MySQL + PHP,省去手动配置的麻烦。
搭建步骤:
- 访问 phpstudy 官网下载并安装
- 安装后启动 Apache 或 Nginx 服务
- 找到网站根目录(Windows 默认为
C:\phpstudy\WWW,Linux 为/var/www) - 在根目录新建 PHP 文件,写入代码
- 浏览器访问
http://localhost/文件名.php查看运行结果
为什么要放到 WWW 目录下?这是 Web 服务器配置的默认根目录,只有该目录下的文件才会被 PHP 解析器识别并对外提供访问服务。
三、PHP 基础语法
3.1 PHP 标签与输出
PHP 代码必须写在<?php ?>标签内:
\<?php echo "Hello, 世界!"; ?>常用输出方式:
| 方式 | 说明 |
|---|---|
echo | 输出一个或多个字符串,最常用 |
print | 输出一个字符串,返回值始终为 1 |
var_dump() | 输出变量的类型与值,适用于调试 |
3.2 变量
变量是用来存放数据的容器。PHP 变量有三大核心规则:
| 规则 | 说明 | 示例 |
|---|---|---|
必须以$符号开头 | 所有变量名前必须加美元符 | $username、$age |
| 严格区分大小写 | $name和$Name是两个完全不同的变量 | $name != $Name |
| 弱类型语言 | 无需声明类型,PHP 根据赋值自动判断 | $age = 20(整数)、$name = "小明"(字符串) |
命名风格推荐使用蛇形命名法(snake_case),如$user_name、$file_path。
3.3 数据类型
PHP 是弱类型语言,常见数据类型包括:
| 类型 | 说明 | 示例 |
|---|---|---|
| 整数(int) | 整数数值 | $age = 18 |
| 字符串(string) | 文本数据 | $name = "张三" |
| 布尔值(bool) | 真或假 | $is_admin = true |
| 数组(array) | 存放多个数据的复合类型 | $arr = ["a", "b"] |
3.4 字符串操作
字符串拼接:PHP 使用.运算符拼接字符串(注意不是+):
\$dir = "./uploads/"; \$file = "shell.php"; \$full\_path = \$dir . \$file; // 结果:"./uploads/shell.php"四、数组(Array)
数组是一种可以存放多个数据的复合类型,是有序映射(键 => 值)。PHP 数组分为三种:
4.1 索引数组
键默认是从 0 开始的整数:
\$students = \["小明", "小红", "小刚"]; echo \$students\[0]; // 输出:小明4.2 关联数组
键可以自定义为字符串或数字:
\$user = \["name" => "李四", "age" => 30, "add" => "北京"]; echo \$user\["name"]; // 输出:李四4.3 多维数组
数组中的元素也是数组:
\$users = \[   \["name" => "张三", "age" => 20],   \["name" => "李四", "age" => 25] ]; echo \$users\[1]\["name"]; // 输出:李四五、GET 和 POST 提交方式
Web 交互中,客户端向服务器传递数据主要通过 GET 和 POST 两种方式。
| 对比维度 | GET 请求 | POST 请求 |
|---|---|---|
| 数据位置 | 参数附加在 URL 后面,对用户完全可见 | 数据在请求体中传输,URL 中不可见 |
| 长度限制 | 受 URL 长度限制(通常 2KB-8KB),不适合大量数据 | 可传输大量数据,支持文件上传,理论上无大小限制 |
| 适用场景 | 数据查询、页面跳转等非敏感操作(如百度搜索) | 登录、注册、文件上传等敏感或大数据量操作 |
| 安全性 | 参数在 URL 中可见,相对不安全 | 参数在请求体中,相对安全 |
典型应用:
- 百度搜索使用 GET 传递搜索关键词,参数在 URL 中可见
- 微信登录使用 POST 传递账号密码,参数在请求体中隐藏
- 文件上传 100% 用 POST,因为需要传输大量数据
在 PHP 中,通过$_GET和$_POST超全局变量获取对应方式提交的数据。
六、知识小结
| 知识模块 | 核心内容 | 一句话速记 |
|---|---|---|
| PHP 本质 | 服务器端脚本语言,用户看不到源码 | 后端执行,前端看结果 |
| 运行环境 | phpstudy 集成环境,文件放 WWW 目录 | 双击无效,要走服务器 |
| PHP 标签 | 代码写在<?php ?>内 | 标签包裹 |
| 输出 | echo 最常用,var_dump 用于调试 | echo 输出 |
| 变量 | $ 开头、区分大小写、弱类型 | 三规则 |
| 字符串拼接 | 用.运算符,不是+ | 点号拼接 |
| 索引数组 | 键从 0 开始的整数 | $arr[0] |
| 关联数组 | 自定义字符串键名 | $arr[“key”] |
| 多维数组 | 数组嵌套数组 | $arr[0][“key”] |
| GET | URL 传参,可见,适合查询 | 查东西用 GET |
| POST | 请求体传参,隐藏,适合登录上传 | 传数据用 POST |
PHP 基础语法是后续 Web 漏洞学习的前提。理解了变量、数组和 GET/POST 数据传递,才能看懂 SQL 注入中参数如何进入查询、文件上传中文件名如何被处理、XSS 中输出如何被渲染。下一篇将进入运算符与流程控制。