Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JDBC-防SQL注入

JDBC-防SQL注入

作者头像
闲花手札
发布于 2021-08-24 06:40:54
发布于 2021-08-24 06:40:54
1.7K00
代码可运行
举报
文章被收录于专栏:闲花手札闲花手札
运行总次数:0
代码可运行

JDBC-防SQL注入

SQL注入

SQL 注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息,甚至篡改数据库

正确账户密码案例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用正确的用户名和密码登录成功
@Test
public void testLogin() {
    String sql = "select * from account where username = '张三' and password = '123456';";

    ResultSet resultSet = JdbcUtils.executeQuery(sql);

    try {
        if (resultSet.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtils.close(resultSet);
    }
}

错误账户密码案例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过SQL注入使用异常的密码登录成功
    @Test
    public void testSqlInject() {
        String sql = "select * from account where username = '张三' and (password = 'iglrne' or 1 = 1);";

        ResultSet resultSet = JdbcUtils.executeQuery(sql);

        try {
            if (resultSet.next()) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(resultSet);
        }
    }

重点总结

【注意】Statement 存在 SQL 注入问题,而 PreparedStatement 可以有效的避免 SQL 注入! 以后只能使用 PreparedStatement ,因为操作性更强,并且安全性更高

通过 PreparedStatement 操作 SQL 语句

PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。

由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。

【注意】应该始终以PreparedStatement代替Statement,也就是说,在任何时候都不要使用Statement。

PreparedStatement 查询操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
    public void testPreparedStatement() {
        // 获取数据库连接
        Connection connection = JdbcUtils.getConnection();

        // 提取资源
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        // 准备SQL语句,? 是占位符
        String sql = "select * from account where username = ? and password = ?;";

        try {
            // 获取预处理搬运工对象,并对SQL语句进行预处理
            preparedStatement = connection.prepareStatement(sql);

            // 设置参数
            preparedStatement.setObject(1, "张三");
            preparedStatement.setObject(2, "123456");

            // 执行SQL语句
            resultSet = preparedStatement.executeQuery();

            // 判断是否还有数据
            if (resultSet.next()) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            JdbcUtils.close(resultSet, preparedStatement, connection);
        }
    }

PreparedStatement 增加操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
   public void testInsert() {
       // 准备SQL语句
       String sql = "insert into student(name, age, gender, info) values(?, ?, ?, ?)";

       // 获取连接
       Connection connection = JdbcUtils.getConnection();

       PreparedStatement preparedStatement = null;

       try {
           // 获取预处理对象
           preparedStatement = connection.prepareStatement(sql);

           // 设置参数
           preparedStatement.setObject(1, "赵四");
           preparedStatement.setObject(2, 17);
           preparedStatement.setObject(3, "男");
           preparedStatement.setObject(4, "你愁啥");

           // 执行SQL语句
           int affectedRows = preparedStatement.executeUpdate();

           System.out.println("受影响的行数:" + affectedRows);
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           // 关闭资源
           JdbcUtils.close(preparedStatement, connection);
       }
   }

PreparedStatement 修改操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
   public void testUpdate() {
       // 准备SQL语句
       String sql = "update student set age = ? where id = ?";

       // 获取连接
       Connection connection = JdbcUtils.getConnection();

       PreparedStatement preparedStatement = null;

       try {
           // 获取预处理对象
           preparedStatement = connection.prepareStatement(sql);

           // 设置参数
           preparedStatement.setObject(1, 61);
           preparedStatement.setObject(2, 6);

           // 执行SQL语句
           int affectedRows = preparedStatement.executeUpdate();

           System.out.println("受影响的行数:" + affectedRows);
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           // 关闭资源
           JdbcUtils.close(preparedStatement, connection);
       }
   }

PreparedStatement 删除操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
    public void testDelete() {
        // 准备SQL语句
        String sql = "delete from student where id = ?";

        // 获取连接
        Connection connection = JdbcUtils.getConnection();

        PreparedStatement preparedStatement = null;

        try {
            // 获取预处理对象
            preparedStatement = connection.prepareStatement(sql);

            // 设置参数
            preparedStatement.setObject(1, 3);

            // 执行SQL语句
            int affectedRows = preparedStatement.executeUpdate();

            System.out.println("受影响的行数:" + affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            JdbcUtils.close(preparedStatement, connection);
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JDBC
连接数据库的方式: 第一种方式:ODBC:开放数据库连接是微软公司开放服务结构中有关数据库的一个组成部分,是数据库访问接口标准。ODBC是基于C语言实现的。提供了语言和数据库进行交互的一致性的接口,便于语言和数据库通信以及语言对数据库的各种操作。 第二种方式:JDBC(本章重点)
Java廖志伟
2022/08/01
1.9K0
JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】
1.PreparedStatement对象 PreparedStatement对象继承Statement对象,它比Statement对象更强大,使用起来更简单 Statement对象编译SQL语句时,如果SQL语句有变量,就需要使用分隔符来隔开,如果变量非常多,就会使SQL变得非常复杂。PreparedStatement可以使用占位符,简化sql的编写 Statement会频繁编译SQL。PreparedStatement可对SQL进行预编译,提高效率,预编译的SQL存储在PreparedStatement
Java3y
2018/03/15
2.1K0
学JDBC,这一篇就够了
学JDBC,这一篇就够了
Java架构师必看
2021/05/14
6730
学JDBC,这一篇就够了
数据库技术:JDBC,预处理对象,事务控制
JDBC (Java Data Base Connectivity) 是 Java 访问数据库的标准规范。是一种用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。是 Java 访问数据库的标准规范。
RendaZhang
2020/09/08
7650
数据库技术:JDBC,预处理对象,事务控制
完整的JDBCUtils和登录案例,以及解决SQL注入问题。
一、JDBCUtils类 注释非常详细 /** * JDBC工具类 */ public class JDBCUtils { // 为什么是静态的呢,因为只有静态的变量才能被静态代码块所访问,被静态方法所访问 private static String url; private static String user; private static String password; private static String driver; /** * 文件的读取,只需要读取一次即可拿到这些值。 使用静
阿年、嗯啊
2021/04/27
7380
完整的JDBCUtils和登录案例,以及解决SQL注入问题。
大数据必学Java基础(一百):员工管理系统开发
​员工管理系统开发一、DAO接口package com.lanson.dao;import com.lanson.pojo.Emp;import java.util.List;/** * @Author: Lansonli * @Description: MircoMessage:Mark_7001 */public interface EmpDao { /** * 向数据库Emp表中增加一条数据的方法 * @param emp 要增加的数据封装成的Emp类的对象 * @ret
Lansonli
2022/12/16
6660
大数据必学Java基础(一百):员工管理系统开发
跟我一起写jdbc之sql注入
📦个人主页:楠慧 🏆简介:一个大二的科班出身的,主要研究Java后端开发 ⏰座右铭:成功之前我们要做应该做的事情,成功之后才能做我们喜欢的事 💕 过客的你,可以给博主留下一个小小的关注吗?这是给博主最大的支持。以后博主会更新大量的优质的作品!!!! SQL注入攻击 1.sql注入攻击的演示 在登录界面,输入一个错误的用户名或密码,也可以登录成功 2.sql注入攻击的原理 按照正常道理来说,我们在密码处输入的所有内容,都应该认为是密码的组成 但是现在Statement对象在执行sql语句时,将一部
楠羽
2022/11/18
2840
跟我一起写jdbc之sql注入
Java——数据库编程JDBC之快速入门吐血总结及各关键对象详解(提供了JDBCUtils工具类)
JDBC,Java Database Connectivity,Java数据库连接,Java语言操作数据库。JDBC的本质是SUN公司定义的一套操作所有关系型数据库的规则,即接口,各数据库厂商实现这套接口,提供数据库驱动jar包,用户可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
Winter_world
2020/09/25
5220
Java——数据库编程JDBC之快速入门吐血总结及各关键对象详解(提供了JDBCUtils工具类)
JDBC和数据库连接池
说明:JDBC是Java提供一套用于数据库操作的接口APl, Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。
timerring
2023/05/24
9260
JDBC和数据库连接池
Java-JDBC
哈喽!大家好,我是小简。今天开始学习《Java-JDBC》,此系列是我做的一个 “Java 从 0 到 1 ” 实验,给自己一年左右时间,按照我自己总结的 Java-学习路线,从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!
小简
2023/01/04
1K0
Java-JDBC
Java中的JDBC详解
Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
共饮一杯无
2022/11/28
4800
Java JDBC和数据库连接池
//获取Driver实现类对象 Driver driver = new com.mysql.jdbc.Driver(); String url = "jdbcmysql://localhost:3306/jdbc_db"; Properties info = new Properties(); info.setProperty("user", "root"); info.setProperty("password", "hsp"); Connection conn = driver.connect(url, info); System.out.println(conn);
用户9615083
2022/12/25
1.3K0
Java JDBC和数据库连接池
JDBC课堂笔记
张哥编程
2024/12/19
790
JDK1.9-JDBC
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/11
4640
【愚公系列】2023年03月 Java教学课程 112-JDBC的(SQL注入和事务)
SQL注入攻击是一种利用Web应用程序中存在的安全漏洞,向应用程序的数据库中插入恶意的SQL语句的攻击方式。攻击者通过在Web应用程序中输入特定的恶意代码,从而获得对数据库的访问权限,可以对数据库进行修改、删除或者获取敏感信息等操作。
愚公搬代码
2023/04/01
2850
12. JDBC事务的处理 以及 转账案例
上一章节,我已经写了一篇数据库事务的章节。篇幅比较长,基本让我们知道了数据库事务操作、隔离级别等等知识。那么本章节我们再简化一下内容,再快速过一下事务处理 和 转账案例,加深印象。
Devops海洋的渔夫
2022/01/17
2970
12. JDBC事务的处理 以及 转账案例
JBDC的基础----学习笔记
JDBC-01-授课笔记 一、JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。 2.jdbc的本质 其实就是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接! 3.jdbc的快速入门程序 导入jar包 注册驱动 Class.forName("com.mysql.jdbc.Dri
楠羽
2022/11/18
7500
JBDC的基础----学习笔记
JDBC:【第一篇:入门知识介绍、工具类、PreparedStatment详解】
想要通过Java操作不同的数据库,应该根据数据库的不同而执行特定的API,而出于简化的想法,Sun公司,定义了一套面向所有关系型数据库的 API 即 JDBC ,其只提供接口,而具体实现去交给数据库厂商实现,而我们作为开发者,我们针对数据数据库的操作,只需要基于JDBC即可
BWH_Steven
2019/08/09
6180
java jdbc操作数据库通用代码
2》在项目中导入jdbc驱动,注意连接不同的数据库,所用到的驱动是不一样的,这些在网上都能找到
lin_zone
2018/08/15
8680
java jdbc操作数据库通用代码
Java工具集-JDBCUtils
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/10
1K0
相关推荐
JDBC
更多 >
LV.1
这个人很懒,什么都没有留下~
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档