MySQL防注入
以下是MySQL防注入的全面解决方案及最佳实践:
一、核心防御方法
参数化查询(预处理语句)
PHP+PDO示例:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute(['username' => $input]);
通过占位符分离SQL逻辑与数据,彻底杜绝注入可能
MySQLi示例:
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?"); $stmt->bind_param("s", $email); ```:ml-citation{ref="5,6" data="citationList"}
ORM框架
Laravel的Eloquent ORM自动过滤危险字符:
User::where('name', $input)->first(); ```:ml-citation{ref="5,11" data="citationList"}
二、辅助防护措施
输入验证与过滤
白名单验证:
preg_match('/^[a-z0-9]+$/i', $input)
转义特殊字符:
mysqli_real_escape_string($conn, $input)
(需配合正确字符集)最小权限原则
数据库账号仅授予必要权限(如只读账号禁用
DROP
/ALTER
)存储过程封装
CREATE PROCEDURE GetUser(IN uid INT) BEGIN SELECT * FROM users WHERE id = uid; END
应用程序仅调用
CALL GetUser(1)
,避免直接拼接SQL
三、常见注入类型及对策
四、进阶配置
数据库层面
启用
sql_mode=STRICT_ALL_TABLES
强制类型校验定期审计SQL日志:
general_log=ON
Web服务器层面
WAF规则过滤
' OR 1=1 --
等攻击特征强制HTTPS防止流量劫持
五、验证工具推荐
SQLMap检测:自动化注入漏洞扫描
EXPLAIN分析:检查异常查询计划
关键原则:永远不要信任用户输入,所有数据必须经过预处理或严格验证