光谷科技
武汉工程大学全日制本科助学班招生简章
武汉工程大学全日制本科助学班网上报名
武汉工程大学全日制本科助学班录取查询

技术问答

PHP进行数据库查询时如何有效防止SQL注入?

在 PHP 中防止 SQL 注入,核心原则是将 SQL 语句结构与用户输入数据严格分离,避免直接拼接用户输入到 SQL 语句中。以下是几种有效方法,按推荐程度排序:

一、使用 PDO 预处理语句(参数化查询)

这是最推荐的方式,通过预编译 SQL 模板,将参数安全传递,彻底避免注入风险。

image.png

原理:数据库会先编译不含参数的 SQL 模板,再将用户输入作为纯数据传入,完全杜绝注入可能。

二、使用 MySQLi 预处理语句

如果项目中使用 MySQLi 扩展,同样支持预处理:

image.png

三、避免直接拼接 SQL 语句

如果必须拼接(不推荐),需对用户输入进行严格过滤:

  1. 针对数字类型参数:强制转换为整数 / 浮点数

image.png

针对字符串类型参数:使用数据库提供的转义函数

image.png

四、其他辅助措施

  1. 最小权限原则:数据库账号仅授予必要权限(如只给 SELECT/INSERT,不给 DROP/ALTER),即使被注入也能降低损失。

  2. 输入验证:前端和后端双重验证用户输入(如检查邮箱格式、限制 ID 范围),从源头过滤非法数据。

  3. 使用 ORM 框架:如 Laravel 的 Eloquent、Doctrine 等,内部已实现参数化查询,进一步减少手动处理 SQL 的风险。

  4. 避免显示详细错误信息:生产环境中关闭 PHP 错误提示(display_errors = Off),防止攻击者通过错误信息猜测数据库结构。

总结

  • 最优方案:PDO 预处理语句(参数化查询),兼顾安全性和兼容性。

  • 核心思想:永远不要相信用户输入,始终将 SQL 结构与数据分离。

  • 禁忌:禁止直接使用$_GET/$_POST等用户输入拼接 SQL 语句(如"WHERE id = " . $_GET['id'])。