news 2026/10/21 2:25:50

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 漏洞,也能降低危害。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 2:25:50

Wi-Fi MAC Layer: Scanning, Authentication, Association, and Data Transmission Processes

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

作者头像 李华
网站建设 2026/10/21 2:25:25

小白连载漫剧怕人物变脸,知漫剧角色档案稳定形象

漫剧连载账号想要留住粉丝&#xff0c;人物辨识度十分关键&#xff0c;但很多新手连载时经常遇到角色五官漂移。知漫剧&#xff08;zz.jiaxunai.cn&#xff09;自带角色档案功能&#xff0c;一次录入人物特征长期调用&#xff0c;多集连载、不同镜头下形象稳定&#xff0c;不用…

作者头像 李华
网站建设 2026/10/21 2:25:16

[Linux操作系统]文件权限及归属

ln –s &#xff1b;创建软连接 把1.txt 在文件夹A里面生成快捷方式ls –1 1.txt &#xff1b;列出文件1.txt&#xff08;-1每行只显示1个&#xff09;ls –ld a&#xff1b;查看文件夹a属性 &#xff08;不看内容&#xff09;ls -1 a/1.txt&#xff1b;查看文件夹中1.txt的软连…

作者头像 李华
网站建设 2026/10/21 2:24:50

监控Kubernetes集群的GPU资源(一)

对于SRE团队来说&#xff0c;实现监控AI、高性能计算平台上大规模GPU资源&#xff0c;至关重要。SRE团队可以通过GPU指标了解工作负载等相关性能&#xff0c;从而优化资源分配&#xff0c;提升资源利用率及异常诊断&#xff0c;以提高数据中心资源的整体效能。除了SRE及基础设施…

作者头像 李华
网站建设 2026/10/21 2:24:18

【存储小知识】无防呆设计下E1.S/E3.S SSD和插槽如何对齐?

我们之前写了不少文章介绍在无防呆措施下应该如何避免将E1.S或者E3.S SSD在插槽插反从而导致烧盘&#xff0c;这个在当前Gen6 E1.S和E3.S SSD测试的情况显得更加重要。在 E3.S SSD&#xff08;属于 EDSFF 接口标准&#xff09;以及其他许多电脑硬件&#xff08;如 PCIe 扩展卡、…

作者头像 李华