PHP安全漏洞修复指南:防SQL注入与XSS

一、为什么 PHP 项目总被盯上

做 PHP 开发这些年,我见过太多项目上线后被黑的情况。说句实话,大部分漏洞并不是什么高深的技术,翻来覆去就是 SQL 注入和 XSS 这两类。很多新手写代码的时候图省事,直接把用户输入拼进 SQL 语句,或者原样输出到页面上,结果就给黑客留了后门。

这篇文章不聊那些虚的理论,直接讲怎么修、怎么防。我会结合实际的代码片段,把常见的坑一个个填平。

二、SQL 注入:别再把变量拼进查询里

先看一段典型的反面教材。很多老代码里都有这种写法:

<?php // 危险写法:直接拼接用户输入 $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id = " . $id; $result = mysqli_query($conn, $sql); ?>

这段代码的问题在于,如果用户在地址栏输入?id=1 OR 1=1,那查询就变成了SELECT * FROM users WHERE id = 1 OR 1=1,整张表的数据全被捞走了。更狠一点的,还能用UNION SELECT拖出其他表的数据。

正确的做法是使用预处理语句,也就是参数化查询。拿 PDO 举例:

<?php // 推荐写法:PDO 预处理语句 $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password'); $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute([':id' => $_GET['id']]); $user = $stmt->fetch(); ?>

这样写,参数和 SQL 语句是分开传输的,数据库会先把语句编译好,再把参数当纯数据处理,无论用户输入什么,都只是一串字符,不会变成可执行的 SQL 片段。

如果你还在用老旧的mysqli,同样有对应的预处理写法:

<?php // mysqli 预处理写法 $stmt = mysqli_prepare($conn, 'SELECT * FROM users WHERE id = ?'); mysqli_stmt_bind_param($stmt, 'i', $_GET['id']); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); ?>

这里有个小细节:bind_param的第二个参数'i'表示整数类型,如果字段是字符串就写's'。养成绑定类型的习惯,能少踩不少坑。

三、XSS 跨站脚本:输出之前先过滤

XSS 的攻击思路和 SQL 注入正好相反,它是把恶意脚本塞进页面里。比如用户在留言板提交了这么一段内容:

<script>alert('你被黑了')</script>

如果后端直接把这个内容原样输出到 HTML 里,那所有访问这个页面的用户都会弹窗,更严重的还能窃取 Cookie、伪造登录状态。

修复的核心思路就一句话:输出到 HTML 之前,把特殊字符转义掉。PHP 自带的htmlspecialchars函数就是干这个的:

<?php // 安全输出:转义 HTML 特殊字符 echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); ?>

这个函数会把<、>、&、引号等字符转成对应的 HTML 实体,浏览器拿到之后只会显示成普通文本,不会当成标签去解析。

另外要提醒一点,htmlspecialchars的第二个参数建议用ENT_QUOTES,这样单引号和双引号都会被转义。有些老代码只写了第一个参数,结果单引号没被处理,照样能绕过。

如果项目里用了模板引擎,比如 Twig 或者 Blade,它们默认就开启了自动转义,这能省不少事。但要注意,如果用了|raw之类的过滤器强制输出原始内容,那安全责任就又回到自己身上了。

四、顺手再补几个小习惯

除了上面两个核心修复,还有几个日常开发里容易忽略的点,一起列出来:

  • 数据库账号权限:给应用用的数据库账号,只授予它需要的权限,别一上来就给root或者ALL PRIVILEGES。
  • 关闭错误回显:生产环境把display_errors关掉,避免把 SQL 语句和文件路径直接暴露给用户。
  • 设置字符集:连接数据库时显式指定utf8mb4,能避免一部分编码相关的注入绕过。
  • 内容安全策略:在响应头里加上Content-Security-Policy,限制脚本来源,即使有 XSS 漏洞,也能降低危害。

安全这东西,从来不是一次修完就一劳永逸的。代码上线之后,建议定期用扫描工具过一遍,或者干脆请懂行的朋友帮忙做一次代码审计。毕竟,漏洞往往藏在那些你觉得“应该没问题”的地方。

相关新闻

中小企业建数据中台预算不多怎么办?先把这 5 笔成本拆开,别只问报价

中小企业建数据中台预算不多怎么办?先把这 5 笔成本拆开,别只问报价

报价单拿到手&#xff0c;最常见的第一反应是"怎么比我想的贵这么多"。而这个"我想的"&#xff0c;通常是拿一套软件的价钱估出来的。 这篇为谁写&#xff1a;中小企业里兼管数据的 IT、被老板一句"我们是不是该上中台&#xff0c;先报个价"问到…

2026/10/21 2:25:53 阅读更多 →
C语言基础笔记 04 指针

C语言基础笔记 04 指针

00 包 目前CLion的最新版本还不支持中文&#xff0c;需要导入#include <stdlib.h> &#xff0c;再在main函数内写system("chcp 65001");才能在代码中用中文stdlib 还可以提供动态内存分布——malloc函数01 使用原因对于函数&#xff0c;在函数外定义的变量&…

2026/10/21 2:24:52 阅读更多 →
Spring Boot个人云盘系统实战:分片上传、JWT与文件管理设计

Spring Boot个人云盘系统实战:分片上传、JWT与文件管理设计

最近做了一套基于Spring Boot的网盘类管理系统&#xff0c;核心功能就是个人云盘。像这种"Spring Boot 前端JS"的Title&#xff0c;其实是很典型的Java Web练手项目&#xff0c;网上也有各种各样的教程&#xff0c;但绝大多数都是跑通就完事&#xff0c;真正像工程一…

2026/10/21 2:24:52 阅读更多 →

最新新闻

RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

先说明一点&#xff1a;这个标题我深有同感。做了大半年RAG相关的东西&#xff0c;见过不少团队把精力全压在召回链路调参上&#xff0c;结果效果上不去&#xff0c;最后排查一圈&#xff0c;问题全出在知识库本身——脏数据、错分块、无版本、无评测&#xff0c;源头一乱&…

2026/10/21 3:06:07 阅读更多 →
基于MATLAB深度学习与LSTM的污水处理异常工况识别实践

基于MATLAB深度学习与LSTM的污水处理异常工况识别实践

简介&#xff1a;面向污水处理异常工况识别的MATLAB深度学习资料包&#xff0c;覆盖数据集、迁移学习网络结构、训练脚本到结果可视化全流程&#xff0c;适合环境工程与人工智能交叉领域的研究者、研究生及工程师&#xff0c;可用于异常工况建模、模型迁移与效果评估。包内共20…

2026/10/21 3:06:07 阅读更多 →
MiniMax 2.5 Function Calling 格式解析与 AI 编程工具落地实践

MiniMax 2.5 Function Calling 格式解析与 AI 编程工具落地实践

做IkunCoder这段时间&#xff0c;我最大的感受是&#xff1a;一个AI编程工具能不能真正“动手干活”&#xff0c;关键不在模型聊天多好&#xff0c;而在对function calling格式吃得透不透。最近一直在跟进MiniMax 2.5的function calling方案&#xff0c;研究它如何把“用户一句…

2026/10/21 3:06:06 阅读更多 →
火箭飞行仿真中推力曲线处理模块的设计与实践

火箭飞行仿真中推力曲线处理模块的设计与实践

1. 推力曲线为什么是仿真里最"磨人"的一块做火箭飞行仿真做过一段时间的朋友&#xff0c;应该都有一个共同感受&#xff1a;飞行力学方程、气动模型、控制律这些东西&#xff0c;理论上都有成熟套路可循&#xff0c;真正让人反复返工、调试到深夜的&#xff0c;往往是…

2026/10/21 3:06:06 阅读更多 →
Python+CNN卷积神经网络实战:土豆病害识别项目全流程解析

Python+CNN卷积神经网络实战:土豆病害识别项目全流程解析

1. 项目到底在做什么&#xff1a;别被“毕设”两个字吓住先说结论&#xff1a;基于 Python 和 CNN 卷积神经网络做土豆病害识别&#xff0c;本质上就是一个图像分类任务&#xff0c;核心目标是让程序拿到一张土豆叶子的照片&#xff0c;自动判断它属于哪种病害&#xff0c;比如…

2026/10/21 3:06:06 阅读更多 →
Nginx为何要用StatefulSet?稳定身份与持久化存储实战解析

Nginx为何要用StatefulSet?稳定身份与持久化存储实战解析

1. Nginx为什么会落到StatefulSet头上——先弄清楚值不值得先说个直觉判断&#xff1a;一听到“Nginx用StatefulSet部署”&#xff0c;大多数人第一反应是“写错了吧”。Nginx这种典型无状态的反向代理&#xff0c;常规做法就是Deployment挂ConfigMap&#xff0c;前面再套个Ser…

2026/10/21 3:05:06 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →