这是其中一种方式
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/*
* Java程序实现用户登录,用户名和密码数据库检查
* 演示如何被别人注入攻击
*/
public class JDBCDemo3 {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
// url,username,password是自己设定的
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybase";
Connection con = DriverManager.getConnection(url, "root", "root");
Statement stat = con.createStatement();
Scanner sc = new Scanner(System.in);
String username = sc.nextLine();
String password = sc.nextLine();
// 执行SQL语句,查询数据表的用户名和密码,如果存在登陆成功,不存在登陆失败
String sql = "SELECT * FROM users WHERE username='" + username
+ "' AND PASSWORD='" + password + "'";
//输出sql语句
System.out.println("sql语句"+sql);
ResultSet rs = stat.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString("username") + " "
+ rs.getString("password"));
}
rs.close();
stat.close();
con.close();
}
}
我的表
正常情况下,无论用户名密码是否匹配都是正常的
注入攻击时,
即便是随便输入用户名,但只要密码带有'or' 1=1,也会把表都展示
原理就是本来sql语句为
SELECT * FROM users WHERE username=username AND PASSWORD=password;
变成了
SELECT * FROM users WHERE username=username AND PASSWORD=password or '1=1';