防止sql注入的核心是永远不拼接用户输入到sql语句中,应使用pdo或mysqli的参数化查询,辅以输入验证与最小权限等纵深防御措施。

防止 SQL 注入的核心是:**永远不拼接用户输入到 SQL 语句中**。用参数化查询(预处理语句)替代字符串拼接,是最可靠、最直接的防御方式。
用 PDO 或 MySQLi 的预处理语句
这是 PHP 中防注入的黄金标准。数据库驱动会自动分离 SQL 结构与数据,确保用户输入只被当作值处理,不会被解析为 SQL 代码。
-
PDO 示例:
php
$pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass);
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND status = ?");
$stmt->execute([$username, $status]); // 自动转义,安全
$results = $stmt->fetchAll();
?> -
MySQLi 面向对象示例:
$mysqli = new mysqli("localhost", $user, $pass, "test");
$stmt = $mysqli->prepare("INSERT INTO logs (message, level) VALUES (?, ?)");
$stmt->bind_param("si", $msg, $level); // "si" 表示 string 和 int
$msg = $_POST['msg'] ?? '';
$level = (int)$_POST['level'];
$stmt->execute();
?>
严格验证和过滤输入,但不依赖它防注入
验证(如检查邮箱格式、长度、数字范围)能提升健壮性,但它只是辅助手段——不能替代预处理。过滤函数如 htmlspecialchars() 是为 HTML 输出服务的,对 SQL 安全无效。
NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
- 对 ID 类参数,用
(int)强制转换或filter_var($id, FILTER_VALIDATE_INT) - 对邮箱,用
filter_var($email, FILTER_VALIDATE_EMAIL) - 对用户名等字符串,可限制长度、禁止特殊字符(如正则
/^[a-zA-Z0-9_]{3,20}$/),但仅用于业务逻辑校验
避免已淘汰或危险的函数
以下函数在现代 PHP 中应完全弃用:
立即学习“PHP免费学习笔记(深入)”;
-
mysql_*()系列函数(PHP 7.0+ 已移除)——不仅不安全,而且不再维护 -
addslashes()—— 编码规则简单,绕过容易(如宽字节注入、多字节编码环境) -
magic_quotes_gpc(PHP 5.4+ 废弃)——自动加斜杠机制不可靠,且干扰正常逻辑
其他关键实践
纵深防御让系统更稳妥:
- 最小权限原则:数据库连接账号只授予必要权限(如 Web 应用通常只需 SELECT/INSERT/UPDATE,禁用 DROP、UNION、FILE 等)
-
错误信息不暴露细节:关闭
display_errors,开启log_errors,避免把 SQL 错误(含表名、字段名)返回给前端 -
使用 ORM 时确认其底层是否真正预处理:如 Laravel Eloquent、Doctrine 默认使用预处理,但手写原始 SQL 查询(如
DB::select("...")中拼接变量)仍会出问题










