SQL注入是Web应用最古老也最危险的安全威胁之一,PHP项目若缺乏系统性防御,极易成为攻击跳板。真正的防护不依赖单一手段,而需构建数据输入、处理与执行三阶段的硬核防御体系。
第一层:输入端强制过滤与白名单校验。所有外部数据(GET、POST、COOKIE、HEADER等)在进入业务逻辑前,必须经由统一入口拦截。禁用模糊的“关键字替换”,改用严格类型转换和正则白名单——如用户ID只允许\\d+,邮箱必须匹配FILTER_VALIDATE_EMAIL,日期字段限定为Y-m-d格式。同时设置超时、长度、字符集限制,拒绝UTF-8 BOM、空字节、宽字节畸形编码等异常输入。
第二层:逻辑层参数化查询为铁律。无论使用PDO还是MySQLi,必须全程使用预处理语句(Prepared Statements),将SQL结构与数据彻底分离。禁止任何形式的字符串拼接构造查询,包括sprintf、concat、双引号内变量插值等。即便变量看似“可控”,也要视同不可信;连ORDER BY或表名这类无法参数化的动态部分,也须映射到预定义枚举数组中校验,而非直接透传。

AI生成图像,仅供参考
第三层:执行端最小权限与错误隔离。数据库连接账号仅授予当前应用必需的CRUD权限,严禁root或dba角色;禁用SELECT … INTO OUTFILE、LOAD_FILE等高危函数。全局关闭display_errors,生产环境启用log_errors并将错误详情写入日志而非返回前端——避免泄露表结构、字段名、路径等敏感信息。同时,在数据库层面启用SQL Mode严格模式(STRICT_TRANS_TABLES),让非法数据触发异常而非静默截断,暴露潜在逻辑漏洞。
三层并非叠加冗余,而是纵深设防:第一层挡掉大部分自动化扫描与初级攻击,第二层斩断核心攻击路径,第三层兜底防止逃逸与信息泄露。任何一层失效,其余两层仍可维持基本安全水位。防御的本质不是追求绝对无懈可击,而是大幅提升攻击成本,让攻击者得不偿失。