JDBC SQL注入问题

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、释放资源

代码示例

	/**
     * 登录方法,使用PreparedStatement实现
     *
     * @param username
     * @param password
     * @return
     */
     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("用户名或密码错误");
        }

    }
}

你可能感兴趣的:(MySQL数据库,javaWeb,sql,数据库,mysql)