我的知识记录

PHP网站SQL注入漏洞修复案例_恢复与处理_代码审计与修复_实战经验

很多PHP开发者修复SQL注入漏洞时存在误区:有的只对GET参数过滤,忽略了POST和Cookie参数;有的使用addslashes简单转义,在某些字符集下可以被绕过;有的只在入口处统一过滤,程序内部拼接SQL时又引入了新的注入点。正确的修复方法是在每个SQL查询处使用参数化查询,对每个用户输入进行验证和过滤,多层防护才能确保安全。本文从原理到实操,讲解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中导致注入)、盲注(页面不显示错误和数据,通过时间延迟或布尔差异判断注入结果)、宽字节注入(利用字符集编码差异绕过转义)。不同类型的注入修复方法略有不同,但核心原则都是使用参数化查询。

修复SQL注入漏洞的根本方法是使用参数化查询(预处理语句)。参数化查询将SQL语句的结构和数据分离,SQL语句中的参数用占位符表示,数据在执行时单独传递,数据库会将数据作为纯值处理,不会被解释为SQL代码。PHP中实现参数化查询有两种方式:PDO预处理和MySQLi预处理。

防止SQL注入的开发规范。第一,永远不要信任用户输入,所有来自客户端的数据(GET、POST、Cookie、HTTP头、上传文件名)都视为不可信。第二,所有SQL查询使用参数化查询,禁止直接拼接用户输入到SQL语句中。第三,使用最新的PHP数据库扩展(PDO或MySQLi),不要使用已废弃的mysql_*函数。第四,设置正确的数据库字符集,使用utf8或utf8mb4,避免宽字节注入。第五,数据库用户使用最小权限,只授予必要的权限,不要使用root或管理员账户连接网站。第六,关闭PHP的display_errors,生产环境不显示错误信息,避免错误信息泄露数据库结构。第七,定期进行代码审计和安全扫描,及时发现和修复新的注入漏洞。

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

修复提醒:修复SQL注入漏洞时,不要只修复被扫描工具检测到的注入点,要进行全面的代码审计,检查所有SQL查询。扫描工具可能有遗漏,只有全面审计才能确保没有注入点。修复后进行充分的测试,确认功能正常且漏洞已修复。

PHP网站SQL注入漏洞修复案例_恢复与处理_代码审计与修复_实战经验

标签:

更新时间:2026-08-26 23:56:53

上一篇:网站Node.js服务停止ERR_CONNECTION_REFUSED怎么处理

下一篇:FTP中python文件夹作用_Python程序目录与虚拟环境