广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文搞懂Java JDBC中的SQL注入问题
  • 336
分享到

一文搞懂Java JDBC中的SQL注入问题

jdbc sql 注入 2022-11-13 18:11:53 336人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录?sql注入✨什么是SQL注入✨SQL注入的效果的演示?SQL注入代码?SQL注入效果✨如何避免SQL注入?PrepareStatement解决SQL注入✨PreparedSta

?SQL注入

✨什么是SQL注入

在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译。导致SQL语句编译后的条件为true,一直得到正确的结果。这种现象就是SQL注入

✨SQL注入的效果的演示

?SQL注入代码

package cn.bdqn.demo03;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
​
public class Login {
​
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        
        //创建Scanner类对象,从控制台获取用户名和密码数据
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String user = sc.nextLine();//使用nextLine()方法获取字符串
        System.out.println("请输入密码:");
        String pwd = sc.nextLine();//使用nextLine()方法获取字符串
        
        //1、注册驱动
        Class.forName("com.Mysql.jdbc.Driver");
        //2、获取连接对象
        String url = "jdbc:mysql://127.0.0.1:3306/java221804";
        String dbuser = "root";
        String pssWord = "123456";
        Connection connection = DriverManager.getConnection(url, dbuser, pssword);
        //3、获取发送SQL语句的对象
        Statement statement =connection.createStatement();
        //编写SQL语句
        String sql = "SELECT * FROM user WHERE username='"+user+"' AND pssword = '"+pwd+"';";
        //4、执行SQL语句
        ResultSet resultSet=statement.executeQuery(sql);
        if(resultSet.next()){
            System.out.println("用户名和密码正确,登录成功");
        }else{
            System.out.println("用户名或密码不正确,登录失败");
        }
        //6、关闭资源
        resultSet.close();
        statement.close();
        connection.close();
        sc.close();
    }
}

?SQL注入效果

输入错误的用户名和密码,提示登录失败:

输入错误的用户名和密码,提示登录成功:产生了SQL注入

上面案例代码中,当你的用户名为 abc' or 1=1;# 密码为123,拼接到SQL语句中,变成如下效果:

SELECT * FROM user WHERE username='abc' or 1=1;#' AND pssword = '123';

此SQL语句or 后面1=1永远正确,#后面的成了注释,所以这条语句会将表中所有的数据查询出来,然后再做数据判断的时候,就会得到正确结果,从而说用户名和密码正确,登录成功。

✨如何避免SQL注入

使用PreparedStatement代替Statement可以有效防止SQL注入的发生。由于SQL注入产生的原因是在用户输入数据对SQL整合,整合后再发送到数据库进行编译产生的。

所以为了避免SQL注入,就需要SQL语句在用户输入数据前就进行编译,成为完整的SQL语句,编译完成后再进行数据填充。这个操作需要使用PrepareStatement实现。

PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题。

?PrepareStatement解决SQL注入

PreparedStatement接口继承了Statement接口,执行SQL语句的方法与Statement执行SQL语句的方法相同。

✨PreparedStatement的应用

PreparedStatement的作用:

  • 预编译SQL语句,效率高
  • 安全,避免SQL注入
  • 可以动态的填充数据,执行多个同结构的SQL语句

?参数标记

//预编译SQL语句,SQL中的所有参数由?符号占位,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。

String sql = "select * from user where userName = ? and pssword=?;";

PreparedStatement preparedStatement = connection.prepareStatement(sql);

?动态参数绑定

preparedStatement.sexXxx(下标,值):参数下标从1开始,为指定参数下标绑定值。Xxx表示数据类型。

//绑定参数,有多少个?绑定多少个参数值

preparedStatement.setString(1, userName);

preparedStatement.setString(2, pwd);

✨综合案例

package cn.bdqn.demo02;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
​
public class PreparedStatementDemo01 {
​
    public static void main(String[] args) throws ClassNotFoundException,SQLException {
​
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String userName = sc.nextLine();
        System.out.println("请输入密码:");
        String pwd = sc.nextLine();
​
        // 1、注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2、获得连接
        String url = "jdbc:mysql://localhost:3306/java2217";
        String user = "root";
        String pssword = "123456";
        Connection connection = DriverManager.getConnection(url, user, pssword);
        // 3、获取发送SQL对象
        String sql = "select * from user where userName = ? and pssword=?;";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        // 4、绑定参数,有多少个?绑定多少个参数值
        preparedStatement.setString(1, userName);
        preparedStatement.setString(2, pwd);
        // 5、执行SQL语句,并处理结果
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) {
            System.out.println("用户名和密码正确,登录成功");
        } else {
            System.out.println("用户名或密码错误,登录失败");
        }
        // 6、释放资源:与关闭流的方式一样,先开的后关,后开的先关
        resultSet.close();
        preparedStatement.close();
        connection.close();
        sc.close();
    }
}

✨PreparedStatement总结

PreparedStatement主要有如下的三个优点:

可以防止sql注入
由于使用了预编译机制,执行的效率要高于Statement
sql语句使用?形式替代参数,然后再用方法设置?的值,比起拼接字符串,代码更加优雅.

PreparedStatement 与Statment比较:

语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
效率不同: PreparedStatement可以使用sql缓存区,效率比Statment高
安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。

?必须使用Statement的情况

当sql语句中必须用到字符串拼接时,则必须使用Statement

public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.print("升序输入asc,降序输入desc:");
        String order = s.nextLine();
        // 定义变量
        Connection connection = null;
        Statement statement = null;
        ResultSet rs = null;
 
 
        try {
            // 注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 获取连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/MyTest","root", "********");
            // 获取数据库操作对象
            statement = connection.createStatement();
            // 执行sql
            String sql = "select * from emp order by sal " + order;
            rs = statement.executeQuery(sql);
            // 处理查询结果集
            while(rs.next()){
                String ename = rs.getString("ename");
                double sal = rs.getDouble("sal");
                System.out.println("姓名:" + ename + ",薪资:" + sal);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

到此这篇关于一文搞懂Java JDBC中的SQL注入问题的文章就介绍到这了,更多相关jdbc sql 注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文搞懂Java JDBC中的SQL注入问题

本文链接: https://www.lsjlt.com/news/170278.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文搞懂Java JDBC中的SQL注入问题
    目录SQL注入✨什么是SQL注入✨SQL注入的效果的演示SQL注入代码SQL注入效果✨如何避免SQL注入PrepareStatement解决SQL注入✨PreparedStateme...
    99+
    2022-11-13
    jdbc sql 注入
  • 一文搞懂SQL注入攻击
    目录1. 前言2. SQL注入简介(1)SQL语言(2)SQL注入3. SQL注入步骤(1)发现漏洞(2)信息收集(3)攻击Web系统(猜解用户名和密码)(4)获取管理员权限4. 防范SQL注入(1)使用参数化查询或存储...
    99+
    2023-04-19
    SQL注入攻击 SQL注入
  • 一文搞懂PHP中的DI依赖注入
    目录什么是 DI / 依赖注入依赖注入出现的原因简单的依赖注入高阶的依赖注入依赖注入的应用依赖注入高阶优化什么是 DI / 依赖注入 依赖注入DI 其实本质上是指对类的依赖通过构造器...
    99+
    2022-11-13
    PHP DI依赖注入 PHP 依赖注入 PHP DI
  • 一文搞懂 php 中的 DI 依赖注入
    ✨ 目录 🎈 什么是 DI / 依赖注入🎈 依赖注入出现的原因🎈 简单的依赖注入🎈 高阶的依赖注入🎈 ...
    99+
    2023-09-07
    PHP 依赖注入 经验分享 开发模式 高级编程
  • 一文搞懂Java中的注解和反射
    目录1、注解(Annotation)1.1 什么是注解(Annotation)1.2 内置注解1.3 元注解(meta-annotation)1.4 自定义注解2、反射(Reflec...
    99+
    2022-11-13
  • 一文搞懂JavaScript中的this指向问题
    一、全局环境下的this指向在全局作用域下,this始终指向全局对象window,无论是否是严格模式!congsole.log()完整的写法是window.console.log(),window可以省略,window调用了console....
    99+
    2023-05-14
    javascript
  • 一文搞懂JMeter engine中HashTree的配置问题
    目录一、前言二、HashTree的用法三、JMeter源码导出jmx脚本文件介绍四、自定义HashTree生成JMeter脚本一、前言 之前介绍了JMeter engine...
    99+
    2022-11-12
  • 一文彻底搞懂Java和JDK的版本命名问题
    Java是面向对象的编程语言,在我们开发Java应用的程序员的专业术语里,Java这个单词其实指的是Java开发工具,也就是JDK(Java Development Kit)。所以我...
    99+
    2022-11-12
  • 一文搞懂Java中的日期类
    目录一、日期类1.1 第一代日期类1.2 第二代日期类Calendar1.3 第三代日期类一、日期类 在程序的开发中我们经常会遇到日期类型的操作,Java对日期类型的操作提供了很好的...
    99+
    2022-11-13
  • 一文搞懂Spring中的注解与反射
    目录前言一、内置(常用)注解1.1@Overrode1.2@RequestMapping1.3@RequestBody1.4@GetMapping1.5@PathVariable1....
    99+
    2022-11-13
  • 一文搞懂SpringMVC中@InitBinder注解的使用
    目录简介应用示例原理解读环境:Springboot2.4.12 简介 ​@Controller或@ControllerAdvice类可以有@InitBinder方法来初始化WebDa...
    99+
    2022-11-13
  • 一文带你搞懂Java中的递归
    目录概述递归累加求和计算1 ~ n的和代码执行图解递归求阶乘递归打印多级目录综合案例文件搜索文件过滤器优化Lambda优化概述 递归:指在当前方法内调用自己的这种现象。 递归的分类:...
    99+
    2022-11-13
    Java 递归
  • 一文搞懂Java中的反射机制
    目录一. 反射的概念二. 为什么需要反射三. 反射的基石四. 反射的实现1. 获取字节码文件对象 2. 反射的使用 反射的优缺点 一. 反射的概念 Ja...
    99+
    2022-11-13
  • Java中应该搞懂的问题有哪些
    本篇内容介绍了“Java中应该搞懂的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题一:我声明了什么!String s = &q...
    99+
    2023-06-03
  • 一篇文章搞懂Python反斜杠的相关问题
    大家在开发Python的过程中,一定会遇到很多反斜杠的问题,很多人被反斜杠的数量搞得头大。 首先我们写一段非常简单的Python代码,它的作用是把一个字段先转换为JSON格式的字符串...
    99+
    2022-11-11
  • 一文搞懂Java中对象池的实现
    目录1. 什么是对象池2. 为什么需要对象池3. 对象池的实现4. 开源的对象池工具5. JedisPool 对象池实现分析6. 对象池总结最近在分析一个应用中的某个接口的耗时情况时...
    99+
    2022-11-13
  • 一文带你搞懂Golang依赖注入的设计与实现
    目录依赖注入要解决的问题inject 依赖注入模型/设计injector 的依赖注入实现例子在现代的 web 框架里面,基本都有实现了依赖注入的功能,可以让我们很方便地对应用的依赖进...
    99+
    2023-01-05
    Golang依赖注入实现 Golang依赖注入 Go 依赖注入
  • PHP中的SQL注入问题
    在现代互联网应用的开发中,使用PHP开发应用是非常流行的一个选择。但是,PHP中的SQL注入问题一直是开发者们需要关注和解决的一个重要问题。SQL注入的定义是指通过在应用程序中输入恶意的SQL代码来篡改、插入或删除数据库中的数据,从而导致应...
    99+
    2023-05-24
    sql注入 PHP安全 数据过滤
  • 一文搞懂Java中的序列化与反序列化
    目录序列化和反序列化的概念应用场景序列化实现的方式继承Serializable接口,普通序列化继承Externalizable接口,强制自定义序列化serialVersionUID的...
    99+
    2022-11-13
  • 一文带你搞懂Java中的泛型和通配符
    目录概述泛型介绍和使用泛型类泛型方法类型变量的限定通配符使用无边界通配符通配符上界通配符下界概述 泛型机制在项目中一直都在使用,比如在集合中ArrayList<String, ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作