自学内容网 自学内容网

如何防止SQL注入

目录

SQL注入

1、 什么是SQL注入

2、 避免SQL注入

PreparedStatement【重点】


SQL注入

1、 什么是SQL注入

select * from tb_user where username = '111' and password = '111'

select * from tb_user where username = '111' and password = '111' or '1=1'

用户输入的数据中有SQL关键词,导致在执行SQL语句时出现一些不正常的情况.这就是SQL注入!


出现SQL注入是很危险

image-20230322084643699

2、 避免SQL注入

问题出现在用户输入数据时,里面有关键词,再配合字符串拼接导致出现SQL注入.所以为了避免SQL注入,可以在用户输入数据到SQL之前,先把SQL语句预编译,预处理后,JDBC就会知道此SQL需要几个参数,后续再将用户输入的数据给参数填充.

这就是PreparedStatement

PreparedStatement【重点】

PreparedStatement是Statement的子接口,用来预处理SQL语句

PreparedStatement使用

  • 先写SQL语句,SQL语句中的参数不能直接拼接,而是使用?占位

  • 使用ps预处理SQL语句,处理的?号,ps内部就会知道此SQL语句需要几个参数

  • 再动态给?处填充值

  • 执行sql

image-20230322084657336

public class Demo3 {
​
    public static void main(String[] args) throws Exception {
​
        // 1加载驱动
        // 2获得连接
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");
​
        // 3获得[预处理语句]对象
        /**
         * 使用预处理对象有步骤
         * 1 先写sql,语句中需要拼接参数的地方用?占位
         * 2 通过连接对象,调用处理语句的方法,传入sql参数,对语句处理后
         *   获得一个含有处理过sql的语句对象
         * 3 给处理过的?处赋值
         * 4 执行
         */
        String sql = "select * from tb_user where username = ? and password = ?";
        System.out.println("处理前:" + sql );
        PreparedStatement ps = conn.prepareStatement(sql);
        System.out.println("处理后:" + ps );
        // 3 给?赋值
        ps.setString(1,"uzi");
        ps.setString(2,"123456");
        System.out.println("赋值后:" + ps );
​
        // 4执行sql语句
        ResultSet rs = ps.executeQuery( );// 【特别注意: 不需要再传参数】
        while(rs.next()) {
            User user = new User( );
            user.setId(rs.getInt("id"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
            user.setPhone(rs.getString("phone"));
            user.setCreateTime(rs.getDate("create_time"));
            user.setMoney(rs.getDouble("money"));
            user.setSex(rs.getInt("sex"));
​
            System.out.println(user );
        }
​
        // 5关流
        rs.close();
        ps.close();
        conn.close();
    }
}

使用预处理语句改造登录案例

public class Demo4_login_plus {
​
    public static void main(String[] args) {
        input();
    }
​
    // 设计方法完成输入
    public static void input() {
        System.out.println("欢迎登录LPL选手管理系统" );
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:" );
        String username = scanner.nextLine( );
        System.out.println("请输入密码:" );
        String password = scanner.nextLine( );
​
        User user = login(username, password);
​
        if (user != null) {
            System.out.println("欢迎进入系统:" + user );
        } else {
            System.out.println("用户名或密码错误!" );
        }
​
    }
​
​
    public static User login(String username,String password){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        User user = null; // 初始值
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");
            // 1 先写sql,条件写?
            String sql = "select * from tb_user where username = ? and password = ?";
            // 2 获得预处理语句对象
            ps = conn.prepareStatement(sql);
            // 3 给?赋值
            ps.setString(1,username);
            ps.setString(2,password);
            System.out.println(ps );
            // 4 执行
            rs = ps.executeQuery( );
            while (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setCreateTime(rs.getDate("create_time"));
                user.setMoney(rs.getDouble("money"));
                user.setSex(rs.getInt("sex"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        return user;
    }
}


原文地址:https://blog.csdn.net/weixin_61898502/article/details/142438719

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!