addslashes不能防SQL注入,因其仅转义特定字符且不感知SQL语义与字符集,对数字型参数、宽字节绕过、二次注入等完全无效;唯一可靠方案是PDO或MySQLi预处理绑定参数并禁用模拟预处理。
唯一可靠方式是用 PDO::prepare() 或 mysqli_prepare() 做预处理,其他手段(如 addslashes()、正则过滤、关键词黑名单)在真实攻击场景下基本失效。
它只转义单引号、双引号、反斜杠和 NULL 字符,对数字型注入(如 id=1 OR 1=1)完全无效;更致命的是,它不感知字符集——当 MySQL 连接层用 GBK 而 PHP 没显式调用 mysqli_set_charset() 时,%A1%27 这类宽字节可绕过转义;且一旦数据从数据库读出再拼进新 SQL(二次注入),addslashes() 就彻底没用了。
addslashes() 不区分上下文:字符串、数字、表名都用同一套规则,但数据库解析这三类值的语法完全不同WHERE id = ? 中传入字符串 "1 OR 1=1" —— mysqli 可能隐式转换,PDO 在 PDO::ATTR_EMULATE_PREPARES = true(默认)时也可能出问题优先用 PDO:抽象层稳定,错误模式统一(如 PDO::ERRMODE_EXCEPTION),占位符支持命名(:username)和问号(?),迁移旧代码更平滑;若项目已重度依赖 mysqli,必须开启 MYSQLI_USE_PREPARE 模式,并在连接后立即调用 mysqli_set_charset($conn, 'utf8mb4')。
mysqli 只支持问号占位符,绑定参数必须用 bind_param(),类型字符(s/i/d)写错会导致静默失败(比如该传 i 却写了 s)prepare 前已完成连接初始化,且预处理语句对象不能跨连接复用PDO 默认启用模拟预处理(PDO::ATTR_EMULATE_PREPARES = true),需显式设为 false 才走真正服务端预编译预处理防注入,但不防业务逻辑错误。例如用户传 id=-999 或 id=99999999999999999999,可能触发越权、整数溢出或隐式类型转换漏洞。
filter_var($x, FILTER_VALIDATE_INT) 或 intval() 清洗,再传给 bind_param() 或 execute()
status=active)必须白名单校验:in_array($status, ['active', 'inactive'], true),不能只靠预处理$table_map = ['user' => 'users', 'log' => 'logs'])写了 prepare 却仍被绕过,问题常出在周边链条断裂:忘记检查 execute() 返回值,导致绑定失败被吞掉;用 mysqli_query() 直接执行拼接 SQL(哪怕只在日志或调试分支里);事务未关闭自动提交,错误时回滚失败。
mysqli_stmt::execute() 和 PDOStatement::execute() 都返回布尔值,必须判断,否则参数绑定失败时查不到数据却无报错prepare 了部分参数,其余还用字符串拼接mysqli_query() 或 PDO::query()
修复的核心不在“怎么写预处理”,而在“怎么确保每条 SQL 都走预处理”——漏掉一处拼接,整个防御就崩塌。最危险的不是不会写,而是写了却没全覆盖。
Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)