您的位置:首页 > 数据库

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注入的问题。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: