防范SQL注入的SQL编码规范_禁用动态拼接字符串语句

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辅助编程工具

相关推荐
ly76891 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
滴啦嘟啦哒1 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
全栈练习生2 小时前
AI安全与红队测试
python·ai
小羊没烦恼!2 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
费曼学习法2 小时前
把「发送成功」当「送达」?我排查 IM 长消息被静默吞掉的完整过程
python·ai编程·自动化运维
鸽鸽程序猿2 小时前
【项目】【在线判题系统】b端题目增删改
开发语言·python
注塑机数据采集联网2 小时前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题
大数据·数据库·物联网·数据挖掘·数据分析
Lhappy嘻嘻2 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
黄俊懿2 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
NetX行者2 小时前
Python 工程化入门:从脚本到规范的 Python 项目结构
网络·python