jdbc 中 Statement 不能避免注入式漏洞(SQL注入漏洞)

news/2024/5/18 23:27:33 标签: java, jdbc, 反射, sql, 注入式漏洞, SQL注入漏洞

      注入式漏洞 也称为 SQL注入漏洞,是一种常见的应用程序安全漏洞。当应用程序将用户输入的数据直接 拼接 到SQL查询语句中,而未对输入进行有效的过滤和转义时,攻击者可通过构造恶意的输入来执行非法的SQL语句,从而实现对应用程序的攻击。

       攻击者通过注入SQL语句,可以执行各种恶意操作,例如删除、修改、篡改或获取敏感信息,甚至完全控制被攻击的系统。因此,应用程序开发人员应该在编写应用程序时,采取一系列安全措施来减轻这种漏洞的风险,例如使用参数化查询、数据过滤和转义等技术。

java">package com.csdn.jdbc;
import java.sql.*;
import java.util.Scanner;
//演示注入式漏洞
/**
 *  Statement:执行SQL命令
 *  PreparedStatement:执行预处理SQL命令
 *  CallableStatement:执行存储过程
 */
public class InjectionHole {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Class.forName("com.mysql.cj.jdbc.Driver");

        Connection conn = DriverManager.getConnection("jdbc:mysql:///fruitdb", "root", "123456");

        Scanner input = new Scanner(System.in);
        String fname = input.nextLine();
        //String sql = "select * from t_fruit where fname like ?";
        String sql = "select * from t_fruit where fname = '"+fname+"' " ;
        //String sql = "select * from t_fruit where fname = '苹果' or 1=1 or fname='a';

        Statement stmt = conn.createStatement();
        //Statement 不支持占位符 ? 想要查询某一条具体记录,只能用拼接字符串
        ResultSet rs = stmt.executeQuery(sql);

        while (rs.next()) {
            System.out.print(rs.getObject(1) + " ");
            System.out.print(rs.getObject(2) + " ");
            System.out.print(rs.getObject(3) + " ");
            System.out.print(rs.getObject(4) + " ");
            System.out.println(rs.getObject(5));
        }
        rs.close();
        stmt.close();
        conn.close();
    }
}
D:\Java\jdk-17\bin\java.exe
苹果' or 1=1 or fname='a
1 菠萝 12 450 酸的
2 西瓜 23 890 甜的
3 水蜜桃 21 123 美味
  •  苹果' or 1=1 or fname='a 
  • 输入上面的字符串,发现表中的数据全部查询出来,如果是一个银行账户的表,所有的用户信息都会被查询出来,这是很危险的,这就是注入式漏洞
  • 其中字符串中一定有一个恒成立的条件      例如:1=1,a=a

  • Statement:执行SQL命令,最早使用的
  • PreparedStatement:执行预处理SQL命令
  • CallableStatement:执行存储过程 

http://www.niftyadmin.cn/n/5125443.html

相关文章

DBeaver连接数据库报错:Public Key Retrieval is not allowed 的解决方案

写在前面: DBeaver是一款免费的数据库管理工具,安装也是傻瓜式一键安装,比较推荐。 DBeaver官网(加载有点慢,耐心等待):DBeaver Community | Free Universal Database Tool 报错详情&#xff…

【机器学习】KNN算法-鸢尾花种类预测

KNN算法-鸢尾花种类预测 文章目录 KNN算法-鸢尾花种类预测1. 数据集介绍2. KNN优缺点: K最近邻(K-Nearest Neighbors,KNN)算法是一种用于模式识别和分类的简单但强大的机器学习算法。它的工作原理非常直观:给定一个新数…

Redis 命令 和 数据类型 您知道多少

文章目录 一、概述二、Redis 命令行客户端连接 Redis 服务器三、在 Redis 帮助命令的说明四、Redis 通用命令 generic4.1 通用命令说明4.1 keys 命令,列举出当前库的所有键4.2 type 命令,可以查看键对应值的类型4.3 object encoding 命令,查看…

Batch and Momentum(Tips for training)

roadmap of improving model 机器学习任务攻略roadmap of improving modelanalyze critical pointBatch and Momentum(Tips for training)Noisy Gradient Descent 有益于 Training 可得到更高准确率Noisy Update 有更高泛化能力?- Large Batc…

上市公司-托宾Q值数据集(2000-2022年)

本文数据为上市公司-托宾Q值数据。托宾Q值是由托宾(James Tobin)提出的一个指标,用以测量公司的投资机会与市场对其估值的比较。理论上,如果托宾Q值大于1,那么公司的市场价值超过了它的资产价值,这意味着公…

如何学习 Linux 内核内存管理

Linux内核内存管理部分是Linux内核中第二复杂的部分,但也非常有趣。学习它的最佳方法就是阅读代码。但在不了解术语和当前 mm 部分到底发生了什么的情况下,显然不能随意开始阅读代码。因此,我想这样开始学习比较好: 了解当前的 LS…

android10.0(Q) MTK 6765 user版本打开root权限

前言 相比较 Android8.1、9.0 而言,Android10.0 版本 的 root变得相当麻烦,10.0 中引入了动态分区机制,同样的要想完全 adb root,需要 fastboot 解锁,然后关闭 verity 才能 adb remount 成功。我尝试和之前一样修改 f…

解决错误代码0x0000011b的方法,教你一键修复0x0000011b

错误代码0x0000011b通常与操作系统或硬件驱动程序有关,可能导致电脑无法正常工作。今天我们就来说说这方面,如果你遇到了错误代码0x0000011b要怎么去解决?能一键修复0x0000011b么? 一.了解错误代码0x0000011b 错误代码0x0000011b…