如何干掉恶心的 SQL 注入?
	简介
	文章主要内容包括:
	持久层技术/框架简单介绍
	不同场景/框架下易导致 注入的写法
	如何避免和修复 SQL 注入
	JDBC
	介绍
	全称 Java Database Connectivity
	是 Java 访问数据库的 API,不依赖于特定数据库 ( database-independent )
	所有 Java 持久层技术都基于 JDBC
	说明
	直接使用 JDBC 的场景,如果代码中存在拼接 SQL 语句,那么很有可能会产生注入,如
	// concat sql
	String
	 sql = 
	"SELECT * FROM users WHERE name ='"
	+ name + 
	"'"
	;
	Statement
	 stmt = connection.createStatement();
	ResultSet
	 rs = stmt.executeQuery(sql);
	安全的写法是使用 参数化查询 ( parameterized queries ),即 SQL 语句中使用参数绑定( ? 占位符 ) 和 PreparedStatement,如
	// use ? to bind variables
	String
	 sql = 
	"SELECT * FROM users WHERE name= ? "
	;
	PreparedStatement
	 ps = connection.prepareStatement(sql);
	// 参数 index 从 1 开始
	ps.setString(
	1
	, name);
	还有一些情况,比如 order by、column name,不能使用参数绑定,此时需要手工过滤,如通常 order by 的字段名是有限的,因此可以使用白名单的方式来限制参数值
	这里需要注意的是,使用了 PreparedStatement 并不意味着不会产生注入,如果在使用 PreparedStatement之前,存在拼接 sql 语句,那么仍然会导致注入,如
	// 拼接 sql
	String
	 sql = 
	"SELECT * FROM users WHERE name ='"
	+ name + 
	"'"
	;
	PreparedStatement
	 ps = connection.prepareStatement(sql);
	看到这里,大家肯定会好奇 PreparedStatement 是如何防止 SQL 注入的,来了解一下
	正常情况下,用户的输入是作为参数值的,而在 SQL 注入中,用户的输入是作为 SQL 指令的一部分,会被数据库进行编译/解释执行。
	当使用了 PreparedStatement,带占位符 ( ? ) 的 sql 语句只会被编译一次,之后执行只是将占位符替换为用户输入,并不会再次编译/解释,因此从根本上防止了 SQL 注入问题。
	Mybatis
	介绍
	较早的 class persistence framework
	介于 JDBC (raw SQL) 和 Hibernate (ORM)
	简化绝大部分 JDBC 代码、手工设置参数和获取结果
	灵活,使用者能够完全控制 SQL,支持高级映射
	更多请参考: http://www.mybatis.org
	说明
	在 MyBatis 中,使用 XML 文件 或 Annotation 来进行配置和映射,将 interfaces 和 Java POJOs (Plain Old Java Objects) 映射到 database records。
	XML 例子
	Mapper Interface
	@Mapper
	public
	interface
	UserMapper
	 {
	User
	 getById(
	int
	 id);
	}
	XML 配置文件
 
 时间:2020-06-21 17:53 来源: 转发量:次
声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。
相关文章:
- [数据挖掘]Angular、React 和 Vue 三大框架,Web 开发该如何选择
- [数据挖掘]Docker镜像优化:如何从1.16GB优化到22.4MB
- [数据挖掘]如何真正认识 Linux 系统结构?
- [数据挖掘]如何从0到1构建稳定、高性能Redis集群?
- [数据挖掘]RocketMQ如何保证消息的可靠性?
- [数据挖掘]如何使用 Prometheus 轻松实现监控?
- [数据挖掘]如何打造一个经常宕机的业务系统?
- [数据挖掘]如何搭建一个大数据平台:从新项目到成熟阶段
- [数据挖掘]如何用Prometheus监控十万container的Kubernetes集群
- [数据挖掘]前沿实践:垃圾回收器是如何演进的?
相关推荐:
网友评论:
最新文章
            
        热门文章
            
        
















