欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

JDBCSQL注入问题

时间:2023-07-01

1、SQL注入问题:
在拼接sql语句时,有一些sql的特殊关键字与字符串的拼接,会造成安全性的问题
输入用户名随便
密码输入:a’ or ‘a’ = 'a
sql : select * from user where username=‘asdfg’ and password =‘a’ or ‘a’ = ‘a’;

2、解决SQL注入问题:
使用PreparedStatement来解决

3、预编译的SQL:
参数使用?作为占位符

4、步骤
1、导入驱动jar包 mysql-connector-java-8.0.16.jar
复制mysql-connector-java-8.0.16.jar到libs目录下
右键–>Add As Library

2、注册驱动

3、获取数据库的连接对象 Connection

4、定义Sql语句
select * from user where username= ? and password = ?;

5、获取执行sql语句的对象 PreparedStatement
Connection.preparedStatement(String sql);

6、给 ? 赋值
方法: setXXX(参数1,参数2)
参数1:?的位置编号,从1开始
参数2:?的值

7、执行sql,接收返回结果,不需要传递sql语句

8、处理结果

9、释放资源

代码示例

public boolean login2(String username, String password) { if (username == null || password == null) { return false; } //连接数据库来判断是否登录成功 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //获取连接 try { //获取连接 conn = JDBCUtils2.getConnection(); //2、定义sql String sql = "select * from user where username=? and password =?"; //3、获取执行sql的对象 pstmt = conn.prepareStatement(sql); //给?赋值 pstmt.setString(1,username); pstmt.setString(2,password); //4、执行查询,不需要传递sql rs = pstmt.executeQuery(); //5、判断:判断结果集是否有数据 return rs.next();//如果有下一行,返回true } catch (SQLException e) { e.printStackTrace(); }finally { //释放资源 JDBCUtils2.close(rs, pstmt, conn); } return false; }

使用PreparedStatement实现的登录方法也时写在JDBCDemo9 项目工程里,与main()方法的类同级


测试类

import java.sql.*;import java.util.Scanner;public class JDBCDemo9 {public static void main(String[] args) { //1、键盘录入,接收用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名"); String username = sc.nextLine(); System.out.println("请输入密码"); String password = sc.nextLine(); //2、调用方法 boolean flag = new JDBCDemo9().login2(username, password); //3、判断结果,输出不同语句 if (flag) { //登录成功 System.out.println("登录成功"); } else { System.out.println("用户名或密码错误"); } }}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。