String.format或+拼接SQL是高危操作,因数据库驱动将拼接结果视为合法SQL执行,无法防御注入;必须用PreparedStatement等参数化查询,使用户输入仅作为数据而非语法结构处理。为什么 String.format 或 + 拼接 SQL 就算高危操作因为数据库驱动不会识别你拼出来的 WHERE name = 'admin' OR '1'='1' 是"用户输入",它只当这是合法 SQL 字符串执行。参数化查询的防护机制(如 PreparedStatement)在 SQL 解析阶段就固定了语句结构,变量值永远作为数据传入,不参与语法解析。常见错误现象:java.sql.SQLException: ORA-00917: missing comma 或看似正常但查出不该查的数据使用场景:任何含用户可控输入的地方------登录、搜索、导出条件、分页 offset哪怕输入做了 replaceAll("'", "''") 或 trim(),也拦不住 1; DROP TABLE users-- 这类绕过Java 里必须用 PreparedStatement 替代 Statement不是"建议用",是只要涉及变量就得走 setString()、setLong() 这套 API。JDBC 驱动会把参数值转义后安全注入预编译语句占位符位置。错误写法:statement.executeQuery("SELECT * FROM user WHERE id = " + userId)正确写法:ps = conn.prepareStatement("SELECT * FROM user WHERE id = ?"); ps.setLong(1, userId);注意:? 不能用于表名、列名、排序字段(这些属于 SQL 结构),只能用于值;动态表名需靠白名单校验 + 显式枚举MyBatis 用户注意:${} 是字符串替换,等同于拼接;必须改用 #{} 才触发预编译PHP 中 mysqli::prepare() 和 PDO::prepare() 的关键区别两者都支持预编译,但默认行为不同:PDO 默认关闭模拟预处理(PDO::ATTR_EMULATE_PREPARES = false),而 mysqli 在低版本或配置不当可能 fallback 到客户端模拟,失去防护能力。 文心快码 文心快码(Comate)是百度推出的一款AI辅助编程工具
相关推荐
jzshmyt8 小时前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)螺蛳粉 螺蛳粉9 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?用户83562907805110 小时前
使用 Python 将 DOCX 转换为 Markdown小玮看世界10 小时前
[Python]ADAS工程实战(三):多传感器扇区统计疑难点全解——归一化、跨边界、去重与置信度TomEval11 小时前
【测AI】第02篇:Python 环境搭建与基础语法速通归去来 兮11 小时前
LangChain从入门到精通淘气的小猴子11 小时前
Python 魔术方法入门我要见SA姐111 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程沉下心来学鲁班12 小时前
初识DeepAgents搭建第一个智能体ctlover13 小时前
数据结构:树