sql注入: 由于下面的password = ‘’ 和username = ‘jdslfkjsd’,执行结果i为 false(密码不成立,查询不到),然后就会进行 ‘1’ = ‘1’ 结果为true 所以where 后面为true就执行
java -jar +jar包名 可以启动jar包
在sql语句这里拼接字符串(有单引,有双引)很容易拼错, 可以先写两个双引号,然后再写两个 ++号, ➕中间写变量名
package com.itheima.jdbc;
import com.itheima.pojo.Account;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* JDBC API 详情:Result
*/
public class JDBCDemo6_UserLogin {
@Test
public void testResultSet() throws Exception {
// 2. 获取连接:如果连接的是本机mysql并且端口是默认的3306 可以简化,(简化,就是端口号和ip不写)
// 这里的127.0.0.1 可以写成localhost 不想要红色警告可以设置参数后面的键值对(前面加问号)
// useSSL=false (Java的键值对是 键=值 这里不能有空格
String url = "jdbc:mysql:///db1?useSSL=false"; // db1 是数据库名
String userName = "root";
String passWord = "123456";
Connection connection = DriverManager.getConnection(url, userName, passWord);
// 接收用户输入的 用户名和密码
String name = "zhangsan";
String pwd = "123";
String sql = "select * from tb_user where username = '"+ name +"' and password = '" + pwd +"'";
// 获取stmt对象
Statement stmt = connection.createStatement();
// 执行sql
ResultSet rs = stmt.executeQuery(sql);
// 判断是否登录成功: 使用ResultSet的next方法,先向下移动一行查看是否有效行
if (rs.next()){// 如果是有效行(代表有数据)
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
// 7. 释放资源
rs.close();
stmt.close();
connection.close();
}
/** 演示sql注入
* inject 是注入的意思
* @throws Exception
*/
@Test
public void testtestLogin_inject() throws Exception {
// 2. 获取连接:如果连接的是本机mysql并且端口是默认的3306 可以简化,(简化,就是端口号和ip不写)
// 这里的127.0.0.1 可以写成localhost 不想要红色警告可以设置参数后面的键值对(前面加问号)
// useSSL=false (Java的键值对是 键=值 这里不能有空格
String url = "jdbc:mysql:///db1?useSSL=false"; // db1 是数据库名
String userName = "root";
String passWord = "123456";
Connection connection = DriverManager.getConnection(url, userName, passWord);
// 接收用户输入的 用户名和密码
String name = "z发士大夫";
String pwd = "' or '1' = '1";
String sql = "select * from tb_user where username = '"+ name +"' and password = '" + pwd +"'";
// 获取stmt对象
Statement stmt = connection.createStatement();
// 执行sql
ResultSet rs = stmt.executeQuery(sql);
// 判断是否登录成功: 使用ResultSet的next方法,先向下移动一行查看是否有效行
if (rs.next()){// 如果是有效行(代表有数据)
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
// 7. 释放资源
rs.close();
stmt.close();
connection.close();
}
}