JDBC学习之控制台模拟登录-----(顺道演示SQL注入问题哟)

一、需求

  1. 控制台输入姓名、id
  2. 查询数据库是否有这个用户
  3. 返回结果(登录成功 or 登录失败)

二、什么是SQL注入问题

废话不多逼逼,看度娘解释

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中 事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息

以下通过Statement语句对象进行演示:
数据库的表
在这里插入图片描述
控制台输入情况:
在这里插入图片描述
运行结果:
在这里插入图片描述
名字、id都不对也能够登录成功,你骗谁呢!!!哈哈哈,这是真的哟!
是不是很不可思议呢!其实也没那么难懂,自己运行下就能够分析出哪里出问题了。

三、如何避免注入问题

  • 要解决 SQL 注入就不能让用户输入的密码和我们的 SQL 语句进
    行简单的字符串拼接
  • 可以用PreparedStatement语句对象来解决这个问题
  • 例子和操作还是跟上面一样,结果是:登录失败(自己试试呀呀)

四、代码出行

package jdbc_study01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;



/**
 * 需求:用控制台来模拟用户登录
 * @author 1710269824
 *
 */

public class jdbc04 {
	/**
	 * 用户登录,Statement会出现SQL注入问题
	 * @param name
	 * @param pwd
	 * @return
	 */
	public static boolean login(String name, String pwd)
	{
		Connection con = null;
		Statement stm = null;
		ResultSet rst = null;
		PreparedStatement pstm = null;
		JdbcUtils jdbcUtils = new JdbcUtils();
		
		try
		{
			//1.获取connection连接
			con = jdbcUtils.getConnection();
			//2.获取Statement语句对象
			stm = jdbcUtils.getStatement(con);
			String sql = "select * from test where name='"+name+"'and id='"+pwd+"'";
			rst = stm.executeQuery(sql);
			if(rst.next())
			{
				return true;
			}
			else
			{
				return false;
			}
			
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			jdbcUtils.close(con, pstm, rst);
			jdbcUtils.close(con, pstm);
		}
		return true;
	}
	
	//可以解决SQL注解问题
	public static boolean login2(String name, String pwd)
	{
		Connection con = null;
		ResultSet rst = null;
		PreparedStatement pstm = null;
		JdbcUtils jdbcUtils = new JdbcUtils();
		
		try
		{
			//1.获取connection连接
			con = jdbcUtils.getConnection();
			//2.获取PreparedStatement语句对象
			String sql = "select * from test where name= ? and id= ?";
			pstm = jdbcUtils.getPstatement(con, sql);
			pstm.setString(1, name);
			pstm.setString(2, pwd);
			rst = jdbcUtils.query(pstm, sql);
			if(rst.next())
			{
				return true;
			}
			else
			{
				return false;
			}
			
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			jdbcUtils.close(con, pstm, rst);
		}
		return true;
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输入你的名字");
		String name = br.readLine();
		System.out.println("请输入你的密码");
		String pwd = br.readLine();
		if(login(name, pwd))
		{
			System.out.println("登录成功");
		}
		else
		{
			System.out.println("登录失败");
		}
	}
}

代码分析:

  1. 这里的代码我只是做了简单的封装,封装类为JdbcUtils
  2. JDBC知识不是很牢的,可以点它 JDBC快速上手-----(收藏就完事了,附工具类代码)

有问题,欢迎大家留言交流,我若懂的,有时间就会回复,分享快乐

五、分享交流

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!

(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))

  1. Java web从入门到精通电子书

  2. Python机器学习电子书

  3. Python400集(北京尚学堂)

  4. JavaScript项目案例、经典面试题

  5. Java300集(入门、精通)

  6. Java后端培训机构录集(同事培训内部提供)

  7. java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)

在这里插入图片描述

发布了39 篇原创文章 · 获赞 13 · 访问量 4835

猜你喜欢

转载自blog.csdn.net/qiukui111/article/details/104614727