PHP Web安全实战:SQL注入防护精要
SQL注入是PHP应用中最常见也最危险的安全漏洞之一,攻击者通过构造恶意SQL片段篡改数据库查询逻辑,从而窃取、删除或篡改数据。其本质在于将用户输入直接拼接进SQL语句,丧失了数据与代码的边界。

本图由AI生成,仅供参考
最可靠、首选的防护方式是使用预处理语句(Prepared Statements)。PDO和MySQLi均原生支持:PDO通过prepare()与execute()分离SQL结构与参数,MySQLi则提供mysqli_prepare()与mysqli_stmt_bind_param()。参数被严格当作数据处理,无论内容含单引号、分号或注释符,都不会影响语句语法结构。
切勿依赖简单的字符串过滤函数如addslashes()或magic_quotes_gpc(已废弃)。这些方法无法覆盖所有编码绕过场景(如宽字节注入、十六进制编码、Unicode多字节组合),反而给人虚假安全感。同理,白名单校验仅适用于明确有限的输入(如状态码、枚举值),不适用于用户名、搜索关键词等自由文本。
对于无法使用预处理的极少数场景(如动态表名、列名),必须严格限制范围:使用固定映射数组校验输入是否在允许列表中,禁止任何外部输入直接进入SQL结构部分。同时,数据库连接应遵循最小权限原则——应用账号只赋予所需表的SELECT/INSERT/UPDATE权限,禁用DROP、ALTER、UNION SELECT等高危操作权限。
错误信息需脱敏处理。生产环境务必关闭display_errors,并禁用mysql_error()、pdo::errorInfo()等直接暴露数据库结构的调试输出。开启错误日志记录供管理员分析,但绝不向用户返回原始SQL或字段名。
安全是纵深防御的过程。除SQL注入外,需同步关注XSS、CSRF、文件上传等风险。将预处理语句作为PHP数据库操作的强制规范,配合输入验证、权限控制与日志审计,才能构建稳健的Web安全防线。一次未经参数化的query()调用,就可能让整个系统暴露在攻击之下。