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

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

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

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

jdbc 中 Statement 不能避免注入式漏洞(SQL注入漏洞)_第1张图片

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

你可能感兴趣的:(#,JDBC,java,jdbc,反射,sql,注入式漏洞,SQL注入漏洞)