package jabc;
import com.mysql.cj.x.protobuf.MysqlxPrepare;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/*
1.解决SQL注入问题?
只要用户提供的信息不参与SQL语句的编译过程,问题就解决了。
即使用户提供的信息中含有SQL语句的关键字,但是没有参与编译,不起作用
要想用户信息不参与SQL语句的编译,java.sql.Statement
PreparedStatement接口继承了java.sql.Statement
PreparedStatement是属于预编译的数据库操作对象
PreparedStatement的原理是,预先对SQL语句的框架进行编译,然后再给SQL语句的“值”
2.测试结果
用户名:
fdas
密码:
fdas' or '1'='1
登陆失败
3.解决SQL注入的关键是神?
用户提供的信息中即使含有SQL语句的关键字,但是这些关键字没有参与编译,不起作用。
*/
public class JDBCTest07 {
public static void main(String[] args) {
// 初始化一个界面
Map<String,String> userLoginInfo=initUI();
// 验证用户名和密码
boolean loginSuccess=login(userLoginInfo);
// 最后输出结果
System.out.println(loginSuccess?"登陆成功":"登陆失败");
}
/*
用户登陆
userLoginInfo 用户登陆信息
false表示失败,true表示成功
*/
private static boolean login(Map<String, String> userLoginInfo) {
// 打标志的意识
boolean loginSuccess=false;
// 单独定义变量
String loginName=userLoginInfo.get("loginName");
String loginPwd=userLoginInfo.get("loginPwd");
// JDBC代码
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
// 1注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取连接
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/zwj","root","123456");
// 3.获取数据库操作对象
// sql语句的框子,其中一个?表示一个占位符,一个?将来接收一个“值“,注意,占位符不能使用单引号括起来。
String sql="select * from t_user where loginName=? and loginPwd=?";
ps=conn.prepareStatement(sql);
// 给占位符?传值(第1个问号下标是1,第二个问号下标是2,JDBC所有下标从1开始。
ps.setString(1,loginName);
ps.setString(2,loginPwd);
// 4.执行sql
rs=ps.executeQuery();
// 5.处理结果集
if (rs.next()){
// 登陆成功
loginSuccess=true;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 6.释放资源
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return loginSuccess;
}
/*
初始化用户界面
用户输入的用户名和密码等登陆信息
*/
private static Map<String, String> initUI() {
Scanner s=new Scanner(System.in);
System.out.println("用户名:");
String loginName=s.nextLine();
System.out.println("密码:");
String loginPwd=s.nextLine();
Map<String,String> userLoginInfo=new HashMap<>();
userLoginInfo.put("loginName",loginName);
userLoginInfo.put("loginPwd",loginPwd);
return userLoginInfo;
}
}
解决SQL注入问题
最新推荐文章于 2024-04-14 15:00:48 发布