SQL注入问题
SQL注入攻击:
- SQL注入攻击是指利用SQL漏洞越权获取数据的黑客行为
- SQL注入攻击根源是为对原始SQL中的敏感字符作特殊处理
- 解决方法:放弃Statement改用PreparedStatement处理SQL
实例代码:
package com.imooc.jdbc.hrapp.command;
import java.sql.*;
import java.util.Scanner;
/**
* @author CubeMonkey
* @create 2020-10-09 13:59
*/
public class QueryCommand implements Command {
@Override
public void execute() {
System.out.println("请输入部门名称:");
Scanner in = new Scanner(System.in);
String pdname = in.nextLine();
Connection connection = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1.加载并注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
String username = "root";
String password = "root";
//2.创建数据库连接
connection = DriverManager.getConnection(url, username, password);
//创建Statement对象
stmt = connection.createStatement();
//结果集
rs = stmt.executeQuery("select * from employee where dname = '" + pdname + "'");
System.out.println("select * from employee where dname = '" + pdname + "'");
//4.遍历查询结果
/**
* rs.next()返回布尔值,代表是否存在下一条记录
* 如果有,返回true,同时结果集提取下一条记录
* 如果没有,返回false,循环停止
*/
while(rs.next()){
int eno = rs.getInt("eno");
String ename = rs.getString("ename");
float salary = rs.getFloat("salary");
String dname = rs.getString("dname");
System.out.println(dname + "-" + eno + "-" + ename + "-" +salary);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//5.关闭连接,释放资源
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
if (connection != null && !connection.isClosed()){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
执行结果:
案例原理:
再输入’ or 1=1 or 1=‘后,查询的语句就变成了select * from employee where dname = ‘’ or 1=1 or 1=’’ ,这里的where条件dname = “” or 1 = 1 or 1 = ""是很成立的,所以再查询的结果中会输出所有的信息。出现这种情况的根本原因在于没有对单引号这样的特殊字符进行处理,单引号会作为sql语句的一部分出现,MySQL也会对其进行解析