SQL注入是PHP应用中最危险的漏洞之一,攻击者通过构造恶意SQL语句,绕过身份验证、窃取数据甚至删除整个数据库。根本原因在于将用户输入直接拼接到SQL查询中,未做任何安全处理。
最可靠的方法是使用PDO或MySQLi的预处理语句(Prepared Statements)。它将SQL结构与数据严格分离:先定义含占位符的语句,再绑定参数执行。数据库引擎会将参数视为纯数据而非可执行代码,彻底阻断注入可能。例如PDO中使用bindParam()绑定变量,而非字符串拼接。
禁用或谨慎使用旧式函数至关重要。mysql_系列函数早已废弃且不支持预处理,必须替换为PDO或MySQLi。即使使用mysqli_query(),若拼接$_GET[‘id’]等变量,仍存在高风险;必须改用mysqli_prepare()流程。
过滤与转义不能替代预处理,但可作为辅助层。若临时无法重构代码,可用mysqli_real_escape_string()对单个字符串转义——注意必须指定正确的字符集(如UTF-8),否则可能被绕过。filter_var()可用于验证邮箱、URL等格式,但不可用于SQL上下文。

AI图片,仅供参考
权限最小化是关键纵深防御策略。数据库连接账户不应拥有DROP、CREATE等高危权限,只授予SELECT、INSERT、UPDATE等业务必需权限。生产环境禁用错误回显(display_errors=Off),避免泄露表名、字段名等敏感信息,防止被用于探测攻击。
输入验证需“白名单”而非“黑名单”。例如ID只接受数字时,用is_numeric()或intval()强制转换;用户名限制字母数字下划线,可用正则/^[\\w]{3,20}$/精确匹配。避免仅用stripslashes()或去除\”‘\”等简单过滤,易被编码、大小写、注释符绕过。
定期使用开源工具(如sqlmap)进行渗透测试,配合WAF(如ModSecurity)作为应急补充。但WAF无法替代代码层加固——它可能漏报或被绕过。真正的防护始于每一行SQL执行前的意识:用户输入永远不可信,必须经预处理、验证、权限三重校验才能进入数据库。