第22天:安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引_笔记|小迪安全2023-2024|web安全|渗透测试|
一、安全开发00:00
1. 留言板功能02:35

- 实现流程:分为四个核心步骤:浏览器提交→服务器处理→数据库操作→结果返回
- 类比场景:与评论区功能实现原理相同,都是用户输入内容的存储与展示
1)浏览器输入昵称及内容提交02:53
- 前端模块:需要构建包含昵称输入框和内容输入框的表单界面
- 用户行为:用户填写信息后点击提交按钮触发数据传送
- 技术要点:表单需设置正确的action属性和method属性指向处理脚本
2)服务器接收数据写入数据库03:14
- 数据处理:服务器通过$_POST等超全局变量获取表单数据
- 安全过滤:应对接收数据进行验证和过滤(如防SQL注入)
- 连接数据库:使用mysqli或PDO扩展建立与MySQL的连接
3)数据库返回结果通知服务器03:26
- 操作反馈:数据库执行INSERT操作后返回成功/失败状态
- 错误处理:需捕获可能出现的主键冲突、字段超长等异常情况
- 状态记录:建议记录操作日志以便后续排查问题
4)服务器将最终结果交给浏览器03:41
- 响应构建:根据数据库返回状态生成JSON或HTML格式响应
- 用户提示:前端应明确显示"提交成功"或"提交失败"的反馈
- 数据展示:成功时可选择立即刷新显示最新留言列表
2. 开发环境06:04
1)开发环境介绍
- 工具组合:
- DW:用于HTML/JS/CSS基础开发(前端布局)
- PHPStorm:专业PHP IDE(代码提示和调试)
- PhpStudy:集成Apache+MySQL环境(本地服务器)
- Navicat:数据库可视化管理工具(表结构操作)
- 版本选择:
- 推荐版本:PHP7.x系列(兼容性和稳定性最佳)
- 市场现状:PHP8使用率仍较低,企业多用7.x版本
- 技术趋势:根据TIOBE指数,PHP当前排名第9位
- 环境特点:
- DW局限:主要用于前端美化,安全审计不关注样式代码
- 核心重点:应聚焦业务逻辑代码而非界面呈现效果
- 工具定位:Navicat简化数据库操作,PhpStudy快速搭建环境

- 资源获取:提供网盘打包下载(含激活工具和安装教程)
- 版本说明:演示基于PHP7环境开发,注意函数兼容性差异
3. 演示案例09:40
1)数据导入
- 连接数据库与创建数据库09:50
- 环境准备:需先启动phpStudy服务,包含Apache和MySQL环境
- 连接工具:使用Navicat Premium连接本地MySQL数据库
- 创建流程:
- 新建数据库命名为"demo"
- 选择UTF-8编码集
- 确认创建后得到空数据库
- 创建数据库表与列名10:19

- 表名:gbook(留言板功能表)
- 列设计:
- username:存储用户名,类型为varchar,非空
- content:存储留言内容,类型为text
- ip_addr:存储IP地址,类型为varchar(255)
- ua_get:存储浏览器UA头信息
- 设置列的属性与保存表11:01
- 字段属性:
- 类型选择:文本字段用varchar,长文本用text
- 长度设置:IP地址字段设为255字符
- 约束条件:用户名设置为NOT NULL
- 保存操作:点击保存按钮完成表结构设计
- 字段属性:
- 数据库名、表名、列名概述12:45
- 三级结构:
- 数据库名:demo
- 表名:gbook
- 列名:username/content/ip_addr/ua_get
- 元数据关系:通过Navicat可查看完整的库表列结构关系
- 三级结构:
2)数据库操作13:04

- 核心函数:
- mysqli_connect():建立数据库连接
- mysqli_select_db():选择默认数据库
- mysqli_query():执行SQL查询
- mysqli_fetch_row():获取结果集行数据
- mysqli_close():关闭数据库连接
- SQL操作:
- 增:INSERT INTO 表名(列) VALUES(值)
- 删:DELETE FROM 表名 WHERE 条件
- 改:UPDATE 表名 SET 列=值 WHERE 条件
- 查:SELECT 列 FROM 表名 WHERE 条件
3)前端页面开发15:26
- 开发环境配置

- 工具选择:
- PHPStorm:专业PHP开发IDE
- Dreamweaver:辅助HTML设计
- 项目创建:
- 在phpStudy目录下新建demo01项目
- 创建gbook.php主文件
- 表单设计实现

- 表单结构:
- 关键属性:
- method="post":指定POST提交方式
- action="":表单提交到当前页面
- name属性:作为数据传输的键名
- 数据接收处理

- 接收方法:
u=u =u=
_POST['username']; // 接收用户名
c=c =c=
_POST['content']; // 接收内容
- 错误处理:
- 使用@抑制未提交时的警告提示
- 变量命名与表单name属性严格对应
- 验证方式:通过echo输出接收值进行调试验证
4)数据库通讯24:01
- 数据库连接参数24:10

- 基本参数:需要配置四个核心参数:主机地址(dbip)、用户名(dbuser)、密码(dbpass)和数据库名(dbname)
- 本地连接:本地开发时主机地址可设为"localhost"或"127.0.0.1"
- 默认账号:演示中使用root账号,密码为"123456",实际开发中应使用专用账号
- 命名规范:参数变量名建议采用dbip、dbuser等前缀形式保持统一
- mysqli_connect函数使用25:03

- 函数语法:mysqli_connect(host, username, password, dbname, port, socket)
- 参数说明:
- 前四个参数对应连接的基本配置
- port参数默认为3306,非标准端口时需要指定
- socket参数在特殊连接方式时使用
- 返回值:返回连接对象,失败时返回false
- 代码示例:
con=mysqliconnect(con = mysqli_connect(con=mysqliconnect(
dbip,
dbuser,dbuser,dbuser,
dbpass,$dbname);
- 连接成功判断 1539000

- 错误处理 :使用
if(!$con)判断连接是否成功 - 错误信息 :通过
mysqli_connect_error()获取具体错误原因 - 终止执行 :连接失败时使用
die()终止程序并显示错误 - 成功提示:可添加else分支显示连接成功信息(调试用)
- 完整示例:
php
if (!$con) {
die("连接错误:" . mysqli_connect_error());
} else {
echo "连接成功";
}
- 执行SQL语句准备26:56

- 必要步骤:连接成功后需要准备并执行SQL语句
- 常用函数:
- mysqli_query():执行SQL查询
- mysqli_fetch_array():获取结果集
- mysqli_close():关闭连接
- 操作类型:包含增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)四种基本操作
- 安全考虑:实际开发中应使用预处理语句防止SQL注入
- SQL插入语句构建27:25

- 语句结构:INSERT INTO 表名(列1,列2) VALUES('值1','值2')
- 引号规则:
- 外层使用双引号,便于嵌入变量
- 字符串值必须用单引号包裹
- 数字值可不加引号(但建议统一加引号)
- 变量插入:将接收的表单数据($_POST)嵌入SQL语句
- 完整示例:
sql="INSERTINTOdemo01(uname,content)VALUES(′sql = "INSERT INTO demo01(uname,content) VALUES('sql="INSERTINTOdemo01(uname,content)VALUES(′
u','$c')";
- 隐藏字段:如IP、UA等信息应通过服务器自动获取,而非用户输入
4. 超全局变量 1815000
1)超全局变量的定义与用途 1817000

- 定义:在PHP脚本中无需声明即可在任何作用域使用的特殊变量
- 核心变量:
- **GET∗∗:收集URL中发送的数据,如'_GET**:收集URL中发送的数据,如`GET∗∗:收集URL中发送的数据,如'_GET['id']
获取?id=123`参数 - **POST∗∗:接收表单'method="post"'提交的数据,如'_POST**:接收表单`method="post"`提交的数据,如`POST∗∗:接收表单'method="post"'提交的数据,如'_POST['username']`
- $_REQUEST:同时包含GET、POST和COOKIE数据
- $_SERVER:存储服务器和执行环境信息
- $_FILES:处理文件上传数据
- $_SESSION:存取会话变量
- $_COOKIE:获取客户端Cookie
- $_ENV:包含服务器环境变量

- $_SERVER常用属性:
- REMOTE_ADDR :客户端IP地址,如
127.0.0.1 - HTTP_USER_AGENT :浏览器信息,如
Mozilla/5.0 (Windows NT 10.0...) - REQUEST_METHOD:请求方式(GET/POST等)
- SCRIPT_FILENAME:当前脚本绝对路径
- HTTP_REFERER:来源页面URL(不可靠)
2)$_SERVER应用实例
-

-
典型应用场景:
-
获取用户信息 :
php
ip=ip =ip=_SERVER['REMOTE_ADDR']; // 获取客户端IP
ua=ua =ua=_SERVER['HTTP_USER_AGENT']; // 获取浏览器信息
- **表单处理**:
```php
$username =$_POST['username'];
$content =$_POST['content'];
-
防空提交 :使用
isset()判断必填字段phpif(isset($_POST['username'])) { // 执行数据库操作 } -
开发技巧:
-
SQL调试 :通过
echo$sql输出完整SQL语句检查语法 -
容错处理 :使用
@符号抑制错误提示,如@$_POST['name'] -
连接指定 :
mysqli_query($con,$sql)需显式指定连接对象 -
输入验证 :防止空值插入需先判断
isset($_POST['field'])
5. 显示数据 2249000
1)留言成功提示 2251000
-

-
执行提示:在数据库操作执行后需要添加提示语句,告知用户操作结果
-
提示方式选择 :
- 页面输出:通过echo直接输出到HTML页面
- 弹窗提示:使用JavaScript的alert函数实现更醒目的提示
-
代码实现 :
phpecho "<script>alert('留言成功!')</script>"; -
引号使用技巧:外层使用双引号,内层使用单引号,避免符号混淆
2)弹窗提示的实现 2269000
-

-
JS与PHP混编 :
- 原理:将JavaScript代码作为字符串通过PHP输出到页面
- 执行机制:浏览器接收到HTML后会解析并执行其中的JS代码
-
错误处理 :
- 失败提示:添加else分支处理数据库操作失败情况
php} else { echo "<script>alert('留言失败!')</script>"; } -
注意事项 :
- 符号规范:严格区分中英文符号,避免使用输入法的智能引号
- 编码规范:保持代码缩进和格式统一
3)查询留言数据 2414000
-
查询语句构建
-

-
基本语法 :
sqlSELECT * FROM 表名 WHERE 列名='条件' -
全量查询 :
php
$sql1 = "SELECT * FROM gbook";
- **执行方法**:使用`mysqli_query()`函数执行SQL语句
- 结果集处理
- <img src="https://bdcu01.baidupcs.com/file/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-21?bkt=en-3de6f374fcad9f514a94920d227b7f50&fid=282335-250528-&time=1773116741&sign=FDTAXUVGEQlBHSKfWqij-GBWOGYTBgG0KqHy7wNbwoLTVMyJyK6xE-rhNWozx75vjzimbWGUb4Qee2Y0E%3D&to=136&size=10&sta_dx=10&sta_cs=0&sta_ft=&sta_ct=7&sta_mt=7&fm2=MH%2CBaoding%2CAnywhere%2C%2C%E8%BE%BD%E5%AE%81%2Ccnc&ctime=0&mtime=0&dt3=0&resv0=-1&resv1=0&resv2=rlim&resv3=5&resv4=10&vuk=0&iv=2&vl=0&htype=&randtype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=en-59da7b375aa3f13dc1af921523adb6352610d6d965f066a00f5b73c026f28bcc4592309e7cf6c78c598d9c952b0e6bd118c9e81411c8a103305a5e1275657320&expires=8h&r=134221027&vbdid=-&fin=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-21&fn=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-21&rtype=1&dp-logid=436200101022951369&dp-callid=0.1&hps=1&tsl=0&csl=0&fsl=-1&csign=dmayhhcqdS1jXSxjkf6DN1P7N8o%3D&so=0&ut=1&uter=-1&serv=-1&uc=3072429091&ti=738aa28698fb94aa6f966071f9640f3463b1cedcb718803d&hflag=30&from_type=&adg=n&reqlabel=250528_n_5e85df782932ee0df25b1a171be0d35a_0_25e468a9ed7f593cb4e46ad13166e48e&chkv=5&bid=250528&by=themis" data-ilink="http://yq.newbcs.bae.baidu.com/rest/2.0/poms/bcs?sign=MBOT:UmxSaFNWRVpHVlcxMFIx:89UikllBltg2uKhjHVPavgvrdhI%3D&method=download&bucket=ai-note-store&object=/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-21&time=1773123941">
- **获取结果**:
```php
$data = mysqli_query($con,$sql1);
-
逐行提取 :
- mysqli_fetch_row:以枚举数组形式返回结果行
php
x=mysqlifetchrow(x = mysqli_fetch_row(x=mysqlifetchrow(data);
var_dump($x);
- **数组索引**:
- 索引0对应username字段值
- 索引1对应content字段值
- 索引2对应ipaddr字段值
- 索引3对应uagent字段值
- 常见错误处理
- <img src="https://bdcu01.baidupcs.com/file/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-22?bkt=en-3de6f374fcad9f514a94920d227b7f50&fid=282335-250528-&time=1773116741&sign=FDTAXUVGEQlBHSKfWqij-GBWOGYTBgG0KqHy7wNbwoLTVMyJyK6xE-ewde5nw%2FGSRXMxk9I9tH13m4YPU%3D&to=136&size=10&sta_dx=10&sta_cs=0&sta_ft=&sta_ct=7&sta_mt=7&fm2=MH%2CBaoding%2CAnywhere%2C%2C%E8%BE%BD%E5%AE%81%2Ccnc&ctime=0&mtime=0&dt3=0&resv0=-1&resv1=0&resv2=rlim&resv3=5&resv4=10&vuk=0&iv=2&vl=0&htype=&randtype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=en-64c53b9bd5232fe66e15b7d45280141eeb2a15654b12187553867a082c31ac1f6e7e98f35d43e12e5de6485093fecbcdeaa1da4eacf0bfe9305a5e1275657320&expires=8h&r=556863730&vbdid=-&fin=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-22&fn=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-22&rtype=1&dp-logid=436200101022951369&dp-callid=0.1&hps=1&tsl=0&csl=0&fsl=-1&csign=dmayhhcqdS1jXSxjkf6DN1P7N8o%3D&so=0&ut=1&uter=-1&serv=-1&uc=3072429091&ti=12146e4ffd7df3c9fc73f631f0eb166b8c693a6cf5faf387305a5e1275657320&hflag=30&from_type=&adg=n&reqlabel=250528_n_5e85df782932ee0df25b1a171be0d35a_0_25e468a9ed7f593cb4e46ad13166e48e&chkv=5&bid=250528&by=themis" data-ilink="http://yq.newbcs.bae.baidu.com/rest/2.0/poms/bcs?sign=MBOT:UmxSaFNWRVpHVlcxMFIx:bHTpETtZnXQOM%2FTftomfLWzW9Nk%3D&method=download&bucket=ai-note-store&object=/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-22&time=1773123941">
- **参数缺失错误**:`mysqli_query()`需要至少2个参数(连接对象和SQL语句)
- **结果集类型错误**:`mysqli_fetch_row()`需要有效的mysqli_result对象
- **调试技巧**:
- 使用`var_dump()`输出中间变量
- 检查SQL语句拼接是否正确
- 验证数据库连接是否有效
#### 4)显示留言数据 <timestamp>2645000</timestamp>
- 数据库查询与显示
- <img src="https://bdcu01.baidupcs.com/file/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-23?bkt=en-3de6f374fcad9f514a94920d227b7f50&fid=282335-250528-&time=1773116741&sign=FDTAXUVGEQlBHSKfWqij-GBWOGYTBgG0KqHy7wNbwoLTVMyJyK6xE-UAF0gCJM%2BH6RwALoHhzmkoYlMtI%3D&to=136&size=10&sta_dx=10&sta_cs=0&sta_ft=&sta_ct=7&sta_mt=7&fm2=MH%2CBaoding%2CAnywhere%2C%2C%E8%BE%BD%E5%AE%81%2Ccnc&ctime=0&mtime=0&dt3=0&resv0=-1&resv1=0&resv2=rlim&resv3=5&resv4=10&vuk=0&iv=2&vl=0&htype=&randtype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=en-02de68c7c6fa43f7e66f105e8a404b3c9e7a7add32214c32c3cfde0f5a0af6f5db727033f974a49cbfd88dac3543fc592dfb6cc21e25bd0d305a5e1275657320&expires=8h&r=709679600&vbdid=-&fin=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-23&fn=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-23&rtype=1&dp-logid=436200101022951369&dp-callid=0.1&hps=1&tsl=0&csl=0&fsl=-1&csign=dmayhhcqdS1jXSxjkf6DN1P7N8o%3D&so=0&ut=1&uter=-1&serv=-1&uc=3072429091&ti=4d291be9b942195958b0858e8c0e727d63b1cedcb718803d&hflag=30&from_type=&adg=n&reqlabel=250528_n_5e85df782932ee0df25b1a171be0d35a_0_25e468a9ed7f593cb4e46ad13166e48e&chkv=5&bid=250528&by=themis" data-ilink="http://yq.newbcs.bae.baidu.com/rest/2.0/poms/bcs?sign=MBOT:UmxSaFNWRVpHVlcxMFIx:8%2FMpY3%2BlNK9eu90s9wlB4Yy%2BAq4%3D&method=download&bucket=ai-note-store&object=/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-23&time=1773123941">
- **数据获取**:通过`$_POST['content']`获取留言内容,`$_SERVER['REMOTE_ADDR']`获取IP地址,`$_SERVER['HTTP_USER_AGENT']`获取浏览器信息
- **SQL插入语句**:`insert into gbook(username,content,ipaddr,uagent) values($u,$c,$i,$ua)`
- **查询结果显示**:使用`mysqli_fetch_row`逐行获取数据,通过`$row[0]`到`$row[3]`分别对应username、content、ipaddr、uagent字段
- 输出格式优化
- <img src="https://bdcu01.baidupcs.com/file/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-24?bkt=en-3de6f374fcad9f514a94920d227b7f50&fid=282335-250528-&time=1773116741&sign=FDTAXUVGEQlBHSKfWqij-GBWOGYTBgG0KqHy7wNbwoLTVMyJyK6xE-om1XvADdsOKx%2B0FGSunymE7QvaA%3D&to=136&size=10&sta_dx=10&sta_cs=0&sta_ft=&sta_ct=7&sta_mt=7&fm2=MH%2CBaoding%2CAnywhere%2C%2C%E8%BE%BD%E5%AE%81%2Ccnc&ctime=0&mtime=0&dt3=0&resv0=-1&resv1=0&resv2=rlim&resv3=5&resv4=10&vuk=0&iv=2&vl=0&htype=&randtype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=en-5051d64d809c2ddf8adfac5ed9184e2b323ea137e3c0d42c3ed952e6a1c8a9b60af10d84295121eb0ceda1b8c851d9a291484e86ca1dfb63305a5e1275657320&expires=8h&r=465742196&vbdid=-&fin=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-24&fn=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-24&rtype=1&dp-logid=436200101022951369&dp-callid=0.1&hps=1&tsl=0&csl=0&fsl=-1&csign=dmayhhcqdS1jXSxjkf6DN1P7N8o%3D&so=0&ut=1&uter=-1&serv=-1&uc=3072429091&ti=12146e4ffd7df3c97a69add409d960c78dd2ba0ec82145e7&hflag=30&from_type=&adg=n&reqlabel=250528_n_5e85df782932ee0df25b1a171be0d35a_0_25e468a9ed7f593cb4e46ad13166e48e&chkv=5&bid=250528&by=themis" data-ilink="http://yq.newbcs.bae.baidu.com/rest/2.0/poms/bcs?sign=MBOT:UmxSaFNWRVpHVlcxMFIx:TjaTmGaQQeN7zZMNYSjDsABcNfc%3D&method=download&bucket=ai-note-store&object=/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-24&time=1773123941">
- **分行显示**:使用`<br>`标签实现换行,使每个字段单独成行
- **字段标注**:在每个值前添加说明文字如"用户名:"、"内容:"等
- **分隔符使用**:通过`<hr>`标签在不同留言间添加水平分隔线,增强可读性
- 完整显示效果
- <img src="https://bdcu01.baidupcs.com/file/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-25?bkt=en-3de6f374fcad9f514a94920d227b7f50&fid=282335-250528-&time=1773116741&sign=FDTAXUVGEQlBHSKfWqij-GBWOGYTBgG0KqHy7wNbwoLTVMyJyK6xE-eCCeyad%2B%2FrPtS1CWI9YSGFxRk%2Bc%3D&to=136&size=10&sta_dx=10&sta_cs=0&sta_ft=&sta_ct=7&sta_mt=7&fm2=MH%2CBaoding%2CAnywhere%2C%2C%E8%BE%BD%E5%AE%81%2Ccnc&ctime=0&mtime=0&dt3=0&resv0=-1&resv1=0&resv2=rlim&resv3=5&resv4=10&vuk=0&iv=2&vl=0&htype=&randtype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=en-71b9ff6d4f6843bd1181a41dd1e36e512e5ee466b37de75b54de51543ae0b5022a05632922a2dba3410319aefda6a18f523f78934244dd0d305a5e1275657320&expires=8h&r=680408927&vbdid=-&fin=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-25&fn=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-25&rtype=1&dp-logid=436200101022951369&dp-callid=0.1&hps=1&tsl=0&csl=0&fsl=-1&csign=dmayhhcqdS1jXSxjkf6DN1P7N8o%3D&so=0&ut=1&uter=-1&serv=-1&uc=3072429091&ti=cf87eda222dfadb732be6415e6271c8363b1cedcb718803d&hflag=30&from_type=&adg=n&reqlabel=250528_n_5e85df782932ee0df25b1a171be0d35a_0_25e468a9ed7f593cb4e46ad13166e48e&chkv=5&bid=250528&by=themis" data-ilink="http://yq.newbcs.bae.baidu.com/rest/2.0/poms/bcs?sign=MBOT:UmxSaFNWRVpHVlcxMFIx:xreS79QGekkZBKDKRzmr98MZ02c%3D&method=download&bucket=ai-note-store&object=/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-25&time=1773123941">
- **显示结构**:每条留言按"用户名-内容-IP地址-UA浏览器"的顺序排列
- **实际案例**:
- 用户名:dsadasda
- 内容:gay
- IP地址:127.0.0.1
- UA浏览器:Mozilla/5.0(Windows NT 10.0;Win64;x64)...
- 代码实现细节
- <img src="https://bdcu01.baidupcs.com/file/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-26?bkt=en-3de6f374fcad9f514a94920d227b7f50&fid=282335-250528-&time=1773116741&sign=FDTAXUVGEQlBHSKfWqij-GBWOGYTBgG0KqHy7wNbwoLTVMyJyK6xE-RI6C2w1xUsEjMqHTFYa2IRT2pgU%3D&to=136&size=10&sta_dx=10&sta_cs=0&sta_ft=&sta_ct=7&sta_mt=7&fm2=MH%2CBaoding%2CAnywhere%2C%2C%E8%BE%BD%E5%AE%81%2Ccnc&ctime=0&mtime=0&dt3=0&resv0=-1&resv1=0&resv2=rlim&resv3=5&resv4=10&vuk=0&iv=2&vl=0&htype=&randtype=&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=en-4034b4395a89f39e24e472535c704616d5771ac83ae82ac41c5b9efd9eaa5c9808e52b41507a49653e3b001f2221517f789770c78c2728c7305a5e1275657320&expires=8h&r=121542332&vbdid=-&fin=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-26&fn=p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-26&rtype=1&dp-logid=436200101022951369&dp-callid=0.1&hps=1&tsl=0&csl=0&fsl=-1&csign=dmayhhcqdS1jXSxjkf6DN1P7N8o%3D&so=0&ut=1&uter=-1&serv=-1&uc=3072429091&ti=875e0ff32ac7bd8926befe8131a78dea8dd2ba0ec82145e7&hflag=30&from_type=&adg=n&reqlabel=250528_n_5e85df782932ee0df25b1a171be0d35a_0_25e468a9ed7f593cb4e46ad13166e48e&chkv=5&bid=250528&by=themis" data-ilink="http://yq.newbcs.bae.baidu.com/rest/2.0/poms/bcs?sign=MBOT:UmxSaFNWRVpHVlcxMFIx:uvAT%2FahIXXTZYoawS8KgAnKee6I%3D&method=download&bucket=ai-note-store&object=/p-2540c3edc89bfe78f546a3fad4c5c76e-40-2025042100-26&time=1773123941">
- **循环结构**:使用`while($row=mysqli_fetch_row($data))`遍历所有查询结果
- **输出格式**:
```php
echo '用户名:'.$row[0].'<br>';
echo '内容:'.$row[1].'<br>';
echo 'IP地址:'.$row[2].'<br>';
echo 'UA浏览器:'.$row[3].'<br>';
- 错误处理:包含留言失败的提示alert('留言失败!')
5)后台管理留言47:07

- 文件结构:在admin目录下创建gbook_admin.php文件专门用于管理留言
- 管理功能:
- 显示所有留言记录
- 提供选择性删除功能
- 代码实现:
- 使用SQL查询select * from gbook获取留言数据
- 通过mysqli_fetch_row循环显示每条留言的:
- 用户名($row[0])
- 留言内容($row[1])
- IP地址($row[2])
- UA浏览器信息($row[3])
6)数据库配置文件的包含48:01

- 配置分离:将数据库连接信息单独存储在config.php文件中
- 包含机制:
- 使用include或require包含配置文件
- 同级目录直接包含"config.php"
- 上级目录使用".../config.php"
- 优势:
- 避免重复编写连接代码
- 修改数据库配置只需改动一处
- 提高代码复用性和维护性
- 实现细节:
- 配置文件包含:
- 数据库IP($dbip)
- 用户名($dbuser)
- 密码($dbpass)
- 数据库名($dbname)
- 建立连接对象:$con = mysqli_connect(...)
- 配置文件包含:
- 注意事项:
- 路径引用要正确
- 配置文件应设置适当权限
- 包含后可直接使用$con变量执行查询
7)删除留言功能实现50:13
-

-
删除按钮实现:
- 在留言板后台页面添加删除按钮,使用标签实现
- 删除按钮链接格式:gbook-admin.php?del=参数值
- 参数值通常选择用户名作为删除条件(如$row[0])

-
参数接收方法:
- 使用GET接收URL参数(区别于_GET接收URL参数(区别于GET接收URL参数(区别于_POST接收表单数据)
- 示例:delstr=delstr =delstr=_GET['del']获取要删除的用户名
- 注意:URL参数传递需用双引号包裹含变量的字符串
-
SQL删除语句构建

- 语句格式:
- 基础语法:delete from 表名 where 列名='条件'
- 实际应用:sql2="deletefromgbookwhereusername=′sql2 = "delete from gbook where username='sql2="deletefromgbookwhereusername=′delstr'"
- 注意:SQL语句结尾需要分号,但作为PHP字符串时不需额外分号
- 执行与反馈:
- 使用mysqli_query()执行删除SQL
- 通过判断执行结果返回操作提示:
-
功能优化建议

- 错误处理:
- 添加@符号抑制未定义变量警告:delstr=@delstr = @delstr=@_GET['del']
- 使用条件判断确保有删除参数时才执行操作:
- 代码结构优化:
- 将显示数据和操作数据分离为独立函数
- 先执行删除操作再显示最新数据,避免页面残留
- 示例结构:
8)函数化显示与操作数据57:33
- 留言板功能实现

- 核心函数:
- add_gbook():用于添加留言数据,包含表单提交处理和数据库插入操作
- show_gbook():显示留言数据,通过mysqli_fetch_row()循环输出留言内容
- 数据库操作:
- 使用mysqli_query()执行SQL语句
- 留言包含字段:用户名、内容、IP地址、UA浏览器信息
- 删除功能:
- 通过$_GET['del']获取要删除的用户名
- 执行delete from gbook where username = '$delstr'删除语句
- 删除成功显示提示:"删除成功!"
- 代码优化技巧
- 函数调用:
- 将重复代码封装成函数,通过include引入配置文件
- 示例:include './config.php'和include './gbook.php'
- 错误处理:
- 使用isset()判断变量是否存在
- 数据库连接错误时输出:die("连接错误:"。 mysqli_connect_error())
- 函数调用:
9)显示与操作数据的调用01:02:01
- 逻辑流程优化

- 执行顺序:
- 先执行add_gbook($con)添加数据
- 再调用show_gbook($con)显示数据
- 代码复用:
- 将显示数据的代码移到单独文件,通过include调用
- 示例:include './gbook.php'包含显示功能
- 注意事项:
- 避免重复显示,需要判断是否为表单提交
- 未添加数据时显示空白列表是正常逻辑
- 实际运行演示

- 前端显示:
- 每条留言显示:用户名、内容、IP、UA信息
- 管理员界面显示删除链接
- 表单设计:
- 包含用户名输入框和内容文本域
- 提交后自动刷新显示最新留言
10)选择性激活删除按钮01:05:08
- 权限控制实现

- 实现方法:
- 在show_gbook()函数中添加模式参数
- 示例:show_gbook($con, 'dl')显示删除按钮
- 代码逻辑:
- 应用场景:
- 普通用户界面不传参数,隐藏删除功能
- 管理员界面传入'dl'参数,显示删除链接
- 实际效果验证

- 用户界面:
- 仅显示留言内容,无删除选项
- 管理界面:
- 每条留言后显示"删除"链接
- 点击后执行删除并提示"删除成功!"
- 数据验证:
- 删除后刷新页面确认数据已移除
- 注意检查数据库连接是否正常关闭
6. 第三方插件引用01:07:23
1)插件介绍与用途01:07:35

- 功能扩展:用于在留言板系统中实现富文本编辑功能,支持图片/音频上传等多媒体内容
- 典型场景:当需要增强评论区功能时(如图片上传),可直接引用现成插件而非从头开发
- 选择依据:UE编辑器是常用前端富文本组件,通过JavaScript实现,能与PHP后端良好配合
2)插件加载与调用01:09:16

- 文件引入:
- 初始化要点:必须确保引入路径正确,建议使用绝对路径避免404错误
- 常见问题:若编辑器显示不完整,需检查是否通过域名访问而非本地文件路径
3)插件使用示例01:10:01

- 核心方法:通过UE.getEditor("content")实例化编辑器,其中"content"对应textarea的id
- 容器绑定:编辑器会自动替换指定id的textarea元素,保留原表单提交功能
- 调试技巧:出现显示异常时可尝试清除浏览器缓存或检查控制台网络请求
4)编辑器集成与功能实现01:11:03

- 数据接收:编辑器内容通过常规POST方式提交,PHP用$_POST['content']获取
- 多媒体支持:上传的图片会自动转为HTML标签存储,需确保服务器有写入权限
- 样式优化:可通过CSS调整编辑器容器尺寸,建议设置为固定宽度响应式布局
- 安全注意:需对用户提交内容做XSS过滤,避免存储未处理的HTML/Javascript代码

- 功能验证:实际演示了图片上传和富文本排版功能,提交后能正确显示图文内容
- 扩展建议:可通过配置ueditor.config.js自定义工具栏按钮和上传文件类型限制
二、第三方插件原理01:13:43

- 实现方式:通过调用两个JS文件实现功能,分别是配置文件和核心功能文件
- 调用过程:
- 首先引入ueditor.config.js配置文件
- 然后引入ueditor.all.js核心功能文件
- 最后通过UE.getEditor("content")实例化编辑器
1. 函数对象调用

- 对象定义:
- 调用逻辑:
- 当调用obj.increment()时,value增加1
- 当调用obj.increment(2)时,value增加传入的参数值2
- 通过typeof判断参数类型,确保只接受数字类型参数
2. 编辑器实例化

- 实例化方法:UE.getEditor("content")
- 参数"content"对应页面中textarea的id
- 该方法会查找id为"content"的DOM元素并将其替换为富文本编辑器
- 多实例支持:可以通过多次调用UE.getEditor()方法创建多个编辑器实例
- 每个实例需要对应不同的DOM元素id
- 实例化时会自动加载配置文件中定义的编辑器样式和功能
3. 表单集成

- 表单元素:
- 用户名输入框:
- 内容编辑区:
- 提交按钮:
- 样式控制:
- 通过style属性设置边框样式:style="border:1px solid"
- 通过rows和cols属性设置默认大小:rows="10" cols="70"
三、安全开发01:14:52
1. 示例操作

- 编辑器实例化:通过UE.getEditor("content")实例化编辑器,参数为要替换的容器ID
- 表单提交限制:未设置限制时使用默认限制,可通过的rows和cols属性控制大小
2. 超全局变量01:15:49

- 请求方式区别:
- 浏览器直接访问默认为GET请求
- 表单提交方式由method属性决定(POST/GET)
- 超全局变量应用:
- $_SERVER:包含报头、路径和脚本位置信息
- GET/_GET/GET/_POST:分别处理URL和表单提交数据
- $_REQUEST:可收集HTML表单提交的所有数据
3. 安全漏洞01:17:42

- 混编执行原理:
- PHP输出的JS代码会被浏览器直接执行
- PHP代码在服务端执行,客户端只能看到执行结果
- 安全边界:
- 前端语言(JS/HTML)在浏览器可见可执行
- 后端语言(PHP)执行过程对客户端不可见
4. 留言板功能01:17:58
1)数据接收输出01:18:01

- 第三方组件安全:
- 使用第三方编辑器时,其安全逻辑由组件开发者控制
- 组件存在的安全问题与使用者无关
- 未授权访问风险:
- 后台管理界面缺少权限验证(如登录检查)
- 可直接通过URL访问管理功能
2)数据库操作01:21:14

- SQL注入防护:
- 示例中直接拼接用户输入存在SQL注入风险
- 应使用预处理语句或参数化查询
- XSS漏洞示例:
- 用户提交的JS代码被存储后再次显示时会执行
- 需对输出内容进行HTML实体编码
5. 课程总结01:26:29

- 技术要点:
- 输入输出处理
- 超全局变量使用
- 数据库CRUD操作
- MVC架构思想
- 安全开发关系:
- 理解功能实现才能发现潜在漏洞
- 开发知识是漏洞分析的基础
- 后续内容:
- 将增加权限验证模块
- 扩展文件上传下载功能
- 引入模板引擎和框架开发
四、知识小结
| 知识点 | 核心内容 | 安全开发关联点 | 难度系数 |
| Web开发基础 | PHP/JS/JAVA/Python四种语言在Web开发中的应用 | 安全开发需要在这些语言基础上增加安全机制 | ⭐⭐ |
| 课程架构设计 | 由易到难讲解PHP→JS→JAVA EE | 开发流程理解有助于后续漏洞分析 | ⭐⭐ |
| 原生开发与框架开发 | 原生类开发使用语言原生代码,框架类开发使用现成框架 | 框架开发可能存在第三方组件安全风险 | ⭐⭐⭐ |
| 留言板功能实现 | 浏览器→服务器→数据库的四步交互流程 | 典型的数据流攻击面(SQL注入/XSS等) | ⭐⭐ |
| PHP数据库操作 | mysqli连接、SQL语句执行(增删改查) | SQL注入漏洞主要发生在此环节 | ⭐⭐⭐ |
| 全局变量使用 | POST/_POST/POST/ _GET/$_SERVER等超全局变量 | 输入验证不严导致变量覆盖等漏洞 | ⭐⭐⭐ |
| 混编技术 | PHP输出HTML/JS代码到页面 | XSS漏洞的典型产生场景 | ⭐⭐⭐⭐ |
| 第三方组件集成 | UEditor富文本编辑器调用 | 文件上传漏洞和编辑器自身安全问题 | ⭐⭐⭐⭐ |
| 权限控制缺失 | 后台管理界面直接可访问 | 未授权访问漏洞典型案例 | ⭐⭐ |
| 开发环境配置 | DW+PHPStorm+PHPStudy+Navicat | 环境配置不当可能导致信息泄露 | ⭐ |
