在PHP开发中,SQL注入是常见且高危的安全漏洞,攻击者通过构造恶意SQL语句篡改查询逻辑,可能导致数据泄露、篡改甚至服务器沦陷。其核心成因是未对用户输入做严格过滤,直接拼接到SQL语句中执行。例如,用户输入`admin’ –`时,若未处理,可能导致密码验证逻辑被绕过。防御SQL注入的关键在于阻断用户输入与SQL语句的直接拼接。
预处理语句(Prepared Statements)是防御SQL注入的终极方案。通过将SQL语句结构与参数分离,数据库会先解析固定语句,再单独处理参数,即使参数包含恶意代码也会被当作数据而非指令。PHP中推荐使用PDO扩展实现:

AI图片,仅供参考
“`php
$pdo = new PDO(‘mysql:host=localhost;dbname=test’, ‘user’, ‘pass’);
$stmt = $pdo->prepare(‘SELECT FROM users WHERE username = :username’);
$stmt->execute([‘username’ => $_GET[‘user’]]);
“`
此方式彻底避免了拼接风险,且性能更优。
若因历史原因无法使用预处理,需对输入进行严格过滤。对于数值型参数,强制转换为整数:
“`php
$id = (int)$_GET[‘id’];
“`
对于字符串,使用白名单验证合法字符集,或通过正则匹配:
“`php
if (preg_match(‘/^[a-zA-Z0-9_]+$/’, $_GET[‘user’])) {
$safeUser = $_GET[‘user’];
}
“`
但需注意,白名单需根据业务需求动态调整,避免过于严格影响功能。
存储过程和ORM框架也能间接防御SQL注入。存储过程将SQL逻辑封装在数据库端,参数传递方式类似预处理;ORM(如Eloquent)会自动转义输入,但需避免直接执行原生SQL。•最小权限原则同样重要:数据库用户仅授予必要权限(如只读权限给查询账户),即使被注入,攻击者能执行的操作也有限。
安全是一个持续过程,需定期审计代码。使用工具如PHP_CodeSniffer检测潜在注入点,或通过渗透测试模拟攻击。同时关注OWASP发布的Top 10安全风险,及时更新防御策略。记住,没有绝对安全的代码,只有不断优化的防御体系。