JDBC-sql注入
2020-09-07 19:51
756 查看
先举个用户登录的例子(问题)
数据库中存储的账号密码
java代码
package jdbc; import java.sql.*; import java.util.Scanner; import com.mysql.cj.protocol.Resultset; import com.mysql.cj.x.protobuf.MysqlxCrud.Collection; public class jdbc2 { public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根 String url = "jdbc:mysql://localhost:3306/login"; String user = "root"; String password = "981002"; Scanner scanner = new Scanner(System.in); System.out.println("登录"); System.out.println("请输入用户名"); String login_user = scanner.nextLine(); System.out.println("请输入密码"); String login_password = scanner.nextLine(); Connection collection = DriverManager.getConnection(url, user, password); Statement statement = collection.createStatement(); ResultSet resultset=statement.executeQuery( "SELECT `user`,`password` FROM register WHERE `user`='" +login_user+"' AND `password`='"+login_password+"';"); if(resultset.next()) { System.out.println("登录成功"); } else { System.out.println("登录失败"); } resultset.close(); statement.close(); collection.close(); } }
测试:
正确输入
错误输入
看起来并没有问题?
来试下这个
是不是很惊喜很意外?这种情况就是sql注入。下面来解析原因。
原因
将代码中的sql语句和输入的用户名密码代入,整理成sql语句,变成了这样
SELECT `user`,`password` FROM register WHERE `user`='abcd' or 1=1 # AND `password`='';
简单解析一下,首先#后面是注释,即后面代码都不起作用
其次or左右两边,只要一边未true,语句就正常运行
而1=1始终为true
mysql运行此句,查询结果为
什么是sql注入?
用户输入的数据中,有sql关键字或语法并且参与了sql语句的编译,导致sql编译后的条件为true,一直得到正确结果,这种现象称为sql注入。
如何避免?
代码中的sql语句是在用户输入数据整合后再进行编译,想要将之避免,我们要在用户输入数据之前,就编译好sql语句,输入数据后,再进行填充数据
JDBC中,java提供了一些工具类,可以解决如同上面遇到的那些问题。
比如使用preparedstatement类,就可以避免上面的 通过字符串拼接形成的sql语句形成sql注入的问题。
相关文章推荐
- 使用JDBC PreparedStatement 修正【SQL注入问题】---- 附有SQL交互超详细Demo !!
- jdbc PreparedStatement 防止sql注入的关键代码片段
- jdbc防止sql注入学习记录
- jdbc防止sql注入-PreparedStatement
- JAVA-JDBC解决SQL注入问题
- 有关sql注入以及jdbc和mybatis的防注入方法的个人理解
- 玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入
- JDBC的使用和SQL注入问题
- jdbc防止sql注入方法总结
- jdbc防止sql注入-PreparedStatement
- 玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入
- jdbc防止sql注入-PreparedStatement
- PreparedStatement就不用担心sql注入了吗?PreparedStatement防止sql注入的原理!建议看mysql的jdbc的实现类源码
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
- JDBC如何有效防止SQL注入
- JDBC基础学习笔记_03_jdbc增数据并防止sql注入
- 07_传智播客JDBC_Statement的sql注入问题
- jdbc动态条件查询防止sql注入的解决方案
- oracle 通过jdbc预编译sql防止sql注入。预编译的具体方法
- JDBC--解决sql注入