我的知识记录

PHP MySQL SQL注入漏洞原理与防御_代码审计与修复_恢复与处理

SQL注入是PHP网站最常见的安全漏洞之一,也是危害最严重的漏洞之一。攻击者通过在URL参数、表单输入、Cookie等位置插入恶意SQL语句,可以绕过登录验证、窃取数据库内容、修改或删除数据,甚至通过SQL注入写入webshell获取服务器控制权。很多PHP程序因为开发时没有重视安全,存在大量SQL注入漏洞,被安全扫描工具报出后不知道如何修复。本文讲解PHP程序SQL注入漏洞的检测、修复、验证全流程。

白盒检测是通过代码审计找出SQL注入漏洞。审计方法:搜索代码中所有执行SQL查询的函数,如mysql_query、mysqli_query、PDO::query、$wpdb->query、$db->query等。检查这些函数中的SQL语句是否拼接了用户输入($_GET、$_POST、$_COOKIE、$_REQUEST、$_SERVER等变量)。如果SQL语句中直接拼接了用户输入且没有使用参数化查询,就是潜在的注入点。重点关注WHERE条件、ORDER BY、LIMIT、表名、列名等位置的拼接,这些都是常见的注入点。代码审计能发现黑盒检测无法发现的漏洞,是最全面的检测方法。

SQL注入漏洞的类型包括:数字型注入(参数是数字,如id=1,不需要引号闭合)、字符型注入(参数是字符串,如name=abc,需要单引号闭合)、搜索型注入(LIKE查询中的注入)、ORDER BY注入(排序参数的注入)、LIMIT注入(分页参数的注入)、二次注入(数据先存入数据库,取出时被拼接到SQL中导致注入)、盲注(页面不显示错误和数据,通过时间延迟或布尔差异判断注入结果)、宽字节注入(利用字符集编码差异绕过转义)。不同类型的注入修复方法略有不同,但核心原则都是使用参数化查询。

PDO预处理的使用方法:$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass'); $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute([':id' => $_GET['id']]); $result = $stmt->fetch();。注意PDO的预处理在某些情况下会被模拟(EMULATE_PREPARES=true),这时候实际上是本地转义,可能存在绕过风险。建议设置$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false),强制使用数据库原生预处理。同时设置字符集为utf8或utf8mb4,避免宽字节注入。

修复SQL注入漏洞后的验证和测试。验证方法:第一,重新运行SQL注入扫描工具,确认之前的注入点已经修复。第二,手动测试每个修复的注入点,构造注入payload(如' OR 1=1--、1 AND SLEEP(5)),确认页面没有异常、没有数据泄露、没有时间延迟。第三,代码审查,检查所有SQL查询是否都使用了参数化查询,是否有遗漏的注入点。第四,功能测试,确认修复后网站的正常功能不受影响,特别是搜索、排序、分页、登录等涉及SQL查询的功能。第五,压力测试,参数化查询的性能与普通查询相当,确认没有性能问题。

真实经历:修复SQL注入时,把WHERE条件都改成了预处理,但ORDER BY的注入漏掉了,后来被扫描工具检测出来。ORDER BY、表名、列名这些位置不能用预处理,必须用白名单验证。修复SQL注入要全面,不能只关注WHERE条件,其他位置的注入点同样危险。

安全提示:SQL注入漏洞的危害极大,可能导致数据泄露、数据篡改、网站被入侵。如果程序中存在SQL注入漏洞且已经被利用,需要评估数据泄露的范围和影响,必要时通知用户和监管机构。不要隐瞒安全事件,及时处理和透明沟通是负责任的做法。

PHP MySQL SQL注入漏洞原理与防御_代码审计与修复_恢复与处理

标签:

更新时间:2026-08-27 11:22:52

上一篇:大文件分卷上传_分卷压缩与远程下载

下一篇:DirectAdmin主机迁移到DA面板VPS_虚拟主机实用教程