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

第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=mysqlic​onnect(

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()判断必填字段

    php 复制代码
    if(isset($_POST['username'])) {
        // 执行数据库操作
    }
  • ​开发技巧​​:

  • ​SQL调试​ ​:通过echo$sql输出完整SQL语句检查语法

  • ​容错处理​ ​:使用@符号抑制错误提示,如@$_POST['name']

  • ​连接指定​ ​:mysqli_query($con,$sql)需显式指定连接对象

  • ​输入验证​ ​:防止空值插入需先判断isset($_POST['field'])

5. 显示数据 2249000

1)留言成功提示 2251000
  • ​执行提示​:在数据库操作执行后需要添加提示语句,告知用户操作结果

  • ​提示方式选择​

    • ​页面输出​:通过echo直接输出到HTML页面
    • ​弹窗提示​:使用JavaScript的alert函数实现更醒目的提示
  • ​代码实现​

    php 复制代码
    echo "<script>alert('留言成功!')</script>";
  • ​引号使用技巧​:外层使用双引号,内层使用单引号,避免符号混淆

2)弹窗提示的实现 2269000
  • ​JS与PHP混编​

    • ​原理​:将JavaScript代码作为字符串通过PHP输出到页面
    • ​执行机制​:浏览器接收到HTML后会解析并执行其中的JS代码
  • ​错误处理​

    • ​失败提示​:添加else分支处理数据库操作失败情况
    php 复制代码
    } else {
        echo "<script>alert('留言失败!')</script>";
    }
  • ​注意事项​

    • ​符号规范​:严格区分中英文符号,避免使用输入法的智能引号
    • ​编码规范​:保持代码缩进和格式统一
3)查询留言数据 2414000
  • 查询语句构建

  • ​基本语法​

    sql 复制代码
    SELECT * 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/P​OST/ _GET/$_SERVER等超全局变量 输入验证不严导致变量覆盖等漏洞 ⭐⭐⭐
混编技术 PHP输出HTML/JS代码到页面 XSS漏洞的典型产生场景 ⭐⭐⭐⭐
第三方组件集成 UEditor富文本编辑器调用 文件上传漏洞和编辑器自身安全问题 ⭐⭐⭐⭐
权限控制缺失 后台管理界面直接可访问 未授权访问漏洞典型案例 ⭐⭐
开发环境配置 DW+PHPStorm+PHPStudy+Navicat 环境配置不当可能导致信息泄露
相关推荐
阿迷不想上班2 小时前
千万级别数据表更新操作记录
数据库
fusugongzi2 小时前
milvus数据库安装
数据库·milvus
夫唯不争,故无尤也2 小时前
PostgreSQL + SQLAlchemy 快速搭一个能跑的 Agent 后端数据层
数据库·人工智能·postgresql·agent
橙汁味的风2 小时前
1计算机网络引言
开发语言·计算机网络·php
Z1eaf_complete2 小时前
SQL注入如何写入Webshell
数据库·sql
瀚高PG实验室2 小时前
瀚高安全版 V4.5.10卸载后残留了db_ha的agent进程导致6666端口被占用
linux·数据库·安全·瀚高数据库
十六年开源服务商2 小时前
2026年WordPress网站安全检测服务避坑指南
android·安全
与数据交流的路上2 小时前
oceanbase-长事务排查
java·数据库·oceanbase
ascarl20102 小时前
canal和ES同步失败维护步骤
java·数据库·elasticsearch