如何干掉恶心的 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集群
- [数据挖掘]前沿实践:垃圾回收器是如何演进的?
相关推荐:
网友评论:
最新文章
热门文章