如何防止SQL注入式非法删除_使用预处理语句绑定参数
mysqli_prepare()不能拼接表名列名因占位符仅保护值位置表名等须白名单校验绑定参数只防数据注入权限与日志盲区仍需业务层控制。为什么 mysqli_prepare() 不能直接拼接 SQL 字符串因为预处理语句的「参数占位符」只允许出现在值的位置不能替代表名、列名或关键字。一旦你写成 DELETE FROM $table WHERE id ?$table 是 PHP 变量拼进去的攻击者仍可控制它——比如传入 users; DROP TABLE users; -- 就完成注入。只有 ? 或 :name 占位符才受预处理机制保护且仅限于数据值表名、字段名、ORDER BY 子句、LIMIT 数值非 MySQLi 的 bind_param 范围必须提前白名单校验或硬编码MySQLi 中 mysqli_prepare() 对非法 SQL 结构不报错但执行时可能失败掩盖注入风险PHP 中用 mysqli_stmt::bind_param() 绑定 DELETE 参数的正确姿势绑定只解决「值」的安全问题。比如删除用户时根据 ID 或邮箱操作这些才是该走预处理的地方。SQL 模板固定DELETE FROM users WHERE id ? 或 DELETE FROM users WHERE email ?调用 bind_param() 时类型标记要匹配ID 用 i整型邮箱用 s字符串不要试图用 s 绑定整个条件表达式如 id ? OR status ? 是合法的但 ? ? 会出错——占位符不能在操作符位置mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);$stmt $mysqli-prepare(DELETE FROM users WHERE id ?);$stmt-bind_param(i, $user_id);$stmt-execute();PostgreSQL 和 SQLite 的等效做法差异不是所有数据库的预处理语法都一样。PHP 的 PDO 更统一但底层驱动行为仍有区别。 arXiv Xplorer ArXiv 语义搜索引擎帮您快速轻松的查找保存和下载arXiv文章。