JDBC系列--解决简单的SQL注入问题

203 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Preparedstatement :执行sql的对象

1. SQL注入问题

用户随便输入密码:a' or 'a' = 'a

 String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";
 System.out.println(sql);

拼接后的sql:select * from user where username = 'dafsdfda' and password = 'a' or 'a' = 'a'

请输入username: fassag 请输入password a' or 'a' = 'a Success!!!!!!

解决方案

通过Preparedstatement :执行sql

它是预编译的SQL( 一次编译、多次运行,省去了解析优化等过程,此外预编译语句能防止sql注入 。)

参数使用?作为占位符

全部的流程为:

步骠: 1.导入驱动jar包mysql-connector-java-5.1.37-bin.jar

2.注册驱动

3.获取数据库连接对象connection

4.定义sql 注意:sql的参数使用?作为占位符。如: select * from user where username ? and password ?;

5.获取执行sql语句的对象preparedstatement Connection.preparestatement(string sql) 6.给?赋值: *方法: setXXX(参数1,参数2) 参数1:?的位置编号 从1开始

参数2:?的值

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

8.处理结果

9.释放资源

小实例:

package cn.caq.jdbc;

import cn.caq.utils.JDBCutils;

import java.sql.*;
import java.util.Scanner;

/**
 * 需求:
 * 1.通过键盘录入用户名和密码
 * 2.判断用户是否登录成功
 */

public class JDBCDemo09 {

    public static void main(String[]args){
        //1.键盘录入,接受用户名和密码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入username:");
        String username = scanner.nextLine();
        System.out.println("请输入password");
        String password = scanner.nextLine();

        //2.调用方法
//        JDBCDemo08 jdbcDemo08 = new JDBCDemo08();
//        boolean login = jdbcDemo08.login(username, password);
        boolean flag = new JDBCDemo09().login2(username, password);

        //3.判断结果,输出不同语句
        if (flag){
            System.out.println("Success!!!!!!");
        }else {
            System.out.println("username or passwd False!!!!!!!!");
        }

    }

    //登录方法
    public boolean login2(String username,String password){
        if (username == null || password == null){
            return false;
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        //1.连接数据库
        try {
            conn = JDBCutils.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 throwables) {
            throwables.printStackTrace();
        } finally {
            JDBCutils.close(rs,pstmt,conn);
        }
        return false;//如果出现异常返回false
    }
}

SQL注入一般是通过利用SQL语句的规则使条件成立 它是

预编译的SQL( 一次编译、多次运行,省去了解析优化等过程,此外预编译语句能防止sql注入 。)

参数使用?作为占位符

能够解决简单的SQL注入的问题!!!