一、需求
- 控制台输入姓名、id
- 查询数据库是否有这个用户
- 返回结果(登录成功 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("登录失败");
}
}
}
代码分析:
- 这里的代码我只是做了简单的封装,封装类为JdbcUtils
- JDBC知识不是很牢的,可以点它 JDBC快速上手-----(收藏就完事了,附工具类代码)
有问题,欢迎大家留言交流,我若懂的,有时间就会回复,分享快乐
五、分享交流
最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!
(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))
-
Java web从入门到精通电子书
-
Python机器学习电子书
-
Python400集(北京尚学堂)
-
JavaScript项目案例、经典面试题
-
Java300集(入门、精通)
-
Java后端培训机构录集(同事培训内部提供)
-
java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)