SQL注入仍是Web安全头号威胁,但多数PHP项目仅依赖基础过滤,形同虚设。真正的防御不是单点加固,而是构建数据流全程可控的三层硬核体系。
第一层:参数化查询为不可绕过的铁律。所有动态拼接的SQL必须使用PDO预处理或MySQLi预处理语句,将SQL结构与数据严格分离。哪怕一个ID参数来自$_GET,也绝不写成\”WHERE id = $_GET[‘id’]\”,而应绑定为$stmt->bindValue(‘:id’, $id, PDO::PARAM_INT)。字符串、整数、布尔值类型需显式声明,避免类型隐式转换引发绕过。

AI设计,仅供参考
第二层:输入边界在应用入口处即刻收口。对所有外部输入(GET/POST/COOKIE/HEADERS)执行白名单校验与格式化,而非模糊过滤。邮箱必须通过filter_var($email, FILTER_VALIDATE_EMAIL)验证;手机号用正则/^1[3-9]\\d{9}$/强制匹配;数字ID立即cast为(int)并校验范围。任何未通过初始校验的数据,直接返回400错误,不进入后续逻辑。
第三层:权限与上下文双重隔离。数据库连接按最小权限原则创建——读接口只用只读账号,写操作分离专用账户;敏感表字段(如密码、token)永不出现在SELECT 中,永远显式指定列名。更关键的是,业务逻辑层禁止复用数据库连接对象跨域操作,每个模块持有独立封装的数据访问类,杜绝“一处破、全局崩”的连锁风险。
这三层非叠加,而是嵌套生效:参数化确保SQL语法安全,入口校验切断恶意数据进入,权限隔离阻断横向越权。三者缺一,防线即失效。没有银弹,只有层层设卡;没有侥幸,只有每处输入都当作攻击源处理。安全不是功能补丁,是代码写入时的第一本能。