java代码学习(三)——sql注入
2021/12/28 2:13:06
本文主要是介绍java代码学习(三)——sql注入,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java的sql注入一般是在两个场景下会产生,一个是JDBC未对参数进行过滤,一个是对mybatis使用${}来进行传参。让我们先来了解一下JDBC。
在几年前框架还未盛行的时候,很多cms和项目都是采用JDBC进行数据库连接和获取数据的。在使用JDBC时,代码中如果存在拼接SQL语句,就有可能产生注入,例如:
String sql = "SELECT * FROM users WHERE name ='"+ name + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
而注入一般的防御方法都是采用预编译,利用占位符?来对参数进行类型的绑定。JDBC中使用的是PreparedStatement。
String sql = "SELECT * FROM users WHERE name= ? ";
PreparedStatement ps = connection.prepareStatement(sql);
注:1、例如order by、column name需要手工过滤,可以使用白名单的方式来限制参数值
2、在使用 PreparedStatement 之前,存在拼接 sql 语句,仍然会导致注入
现在java开发大部分使用ssm框架来进行开发,m即是mybatis。在 MyBatis 中,使用 XML 文件 或 Annotation 来进行配置和映射,将 interfaces 和 Java POJOs (Plain Old Java Objects) 映射到 database records。
MyBatis 使用 #{} 和 ${} 来进行参数值替换。使用 #{} 语法时,MyBatis 会自动生成 PreparedStatement ,使用参数绑定 (?) 的方式来设置值。而使用 ${} 语法时,MyBatis 会直接注入原始字符串,即相当于拼接字符串,因而会导致 SQL 注入。
如需使用${}时,可进行白名单过滤,在xml文件中设置一个if判断。如
SELECT * FROM user
<if test="xxx == 'name' or xxx == 'email'"> order by ${xxx} </if>
在若依4.6.2版本中,就存在${}的注入漏洞。
入口处在,可以看出访问地址是system/role/list,一个后台注入漏洞,调用了roleService的selectRoleList进行处理。
接着直接查看sql语句的执行即可,一般都会存在xml的执行语句
可以看出,最后一行使用了${}对参数进行处理,了解过ssm框架防注入的都知道,这种情况是存在注入的。
后台角色管理处,抓包修改
这篇关于java代码学习(三)——sql注入的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-06小米11i印度快充版ROM合集:极致体验,超越期待
- 2024-10-06【ROM下载】小米11i 5G 印度版系统, 疾速跃迁,定义新速度
- 2024-10-06【ROM下载】小米 11 青春活力版,青春无极限,活力全开
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求