注入式漏洞 也称为 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
- Statement:执行SQL命令,最早使用的
- PreparedStatement:执行预处理SQL命令
- CallableStatement:执行存储过程