package jdbc;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/*
实现功能:
1、需求:
模拟用户登录功能的实现。
2、业务描述:
程序运行的时候,提供一个输入的入口,可以让用户输入用户名和密码
用户输入用户名和密码之后,提交信息,java程序收集到用户信息Java程序连接数据库验证用户名和密码是否合法
合法:显示登录成功
不合法:显示登录失败
3、数据的准备:
在实际开发中,表的设计会使用专业的建模工具,我们这里安装一个建模工具:PowerDesigner
使用PD工具来进行数据库表的设计。 (参见user-login.sq1脚本)
4、当前程序存在的问题:
输入用户名:fdsa
密码:fdsa' or '1'='1
登陆成功!
这种现象被称为SQL注入(安全隐患)。(黑客经常使用)
5、导致sQL注入的根本原因是什么?
用户输入的信息中含有sq1语句的关键字,并且这些关键字参与sq1语句的编译过程,
导致sql语句的原意被扭曲,进而达到sq1注入。
*/
public class JDBCTest06 {
public static void main(String[] args) {
// 初始化一个界面
Map<String,String> userLoginInfo=initializeUI();
// 验证用户名和密码
boolean loginSuccess=login(userLoginInfo);
// 最后输出结果
System.out.println(loginSuccess ? "登陆成功!" : "登陆失败!");
}
/**
* 用户登录
* @param userLoginInfo 用户登录信息
* @return false 表示失败 true表示成功
*/
private static boolean login(Map<String, String> userLoginInfo) {
// 打标记的意识
boolean loginSuccess=false;
// JDBC代码
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
// 创建驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");
// 获取数据库操作对象
stmt=conn.createStatement();
// 执行sql语句
String sql="select * from t_user where loginName= '"+userLoginInfo.get("loginName") +"' and loginPwd='"+userLoginInfo.get("loginPwd")+"'";
// 以上正好完成了sq1语句的拼接,以下代码的含义是,发送sq1语句给DBMS,DBMS进行sql编译。
// 正好将用户提供的“非法信息"编译进去。导致了原sq1语句的含义被扭曲了。
rs = stmt.executeQuery(sql);
// 处理查询结果集
if (rs.next()){
loginSuccess=true;
}
}catch (Exception e){
e.printStackTrace();
}finally{
// 释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return loginSuccess;
}
/**
* 初始化用户界面
* @return 用户输入的用户名和密码等登录信息
*/
private static Map<String, String> initializeUI() {
Scanner s=new Scanner(System.in);
System.out.print("输入用户名:");
String loginName=s.nextLine();
System.out.print("密码:");
String logiPwd=s.nextLine();
Map<String,String> userLoginInfo=new HashMap<>();
userLoginInfo.put("loginName",loginName);
userLoginInfo.put("loginPwd",logiPwd);
return userLoginInfo; //
}
}
1、用JDBC模拟用户登录功能,及SQL注入问题
于 2022-07-16 09:43:42 首次发布
该博客讨论了一个Java程序实现用户登录功能时遇到的SQL注入问题。通过模拟用户输入,展示了当用户输入特殊字符串如'fdsa'or'1'='1'时,导致登录成功,揭示了SQL注入的安全隐患。问题的根本原因是用户输入的SQL关键字参与到了SQL语句的编译过程,扭曲了原本的查询意图。博客还提出了SQL注入的风险,并提醒开发者注意防止此类攻击。
摘要由CSDN通过智能技术生成