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辅助编程工具
相关推荐
weixin_444012931 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现zjy277771 小时前
CSS解决浮动元素导致的布局闪烁_稳定容器布局高度2501_901006471 小时前
MySQL主从复制过程中怎么增加从库_利用mysqldump快速扩容从库Jackzaker1 小时前
Prompt工程在代码中的实现weixin_704266051 小时前
MySQL到ES曲幽1 小时前
让FastAPI Agent真正记住你:聊聊会话记忆与持久化存储的落地实践2301_769340671 小时前
Navicat导出CSV文件数据为空如何解决_过滤条件与权限排查kexnjdcncnxjs1 小时前
bootstrap如何设置响应式导航栏的切换宽度2301_815901971 小时前
如何测试FSFO观察者进程的自动切换_模拟主库断网与Observer心跳超时