SQL注入
MySQL 数据库学习笔记(续)
十、JDBC 重点!!!
10.6 SQL注入问题
SQL存在漏洞,会被攻击导致数据泄露
SQL会被拼接
package com.guo.lesson02;
import com.guo.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SQL注入 {
public static void main(String[] args) {
//login("chenguo","123456"); // 正常登录
login(" 'or '1=1"," 'or '1=1"); // 技巧
}
//登录业务
public static void login(String username,String password){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
st = conn.createStatement();
//SQL
// SELECT * FROM users WHERE `NAME` = 'chenguo' AND `PASSWORD` = '123456'
// SELECT * FROM users WHERE `NAME` = ''or '1=1' AND `PASSWORD` = ''or '1=1'
String sql = "SELECT * FROM users WHERE `NAME` = '"+username+"' AND `PASSWORD` ='"+password+"'";
rs = st.executeQuery(sql); //查询完毕会返回一个结果集
while (rs.next()){
System.out.println(rs.getString("NAME"));
System.out.println(rs.getString("PASSWORD"));
System.out.println("==================================");
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.release(conn,st,rs);
}
}
}
总结
- SQL 注入本质:直接拼接字符串,攻击者通过构造特殊参数篡改 SQL 逻辑
- 漏洞危害:无需正确账号密码即可登录、查询全部数据
- 根本原因:使用
Statement+ 字符串拼接执行 SQL - 解决方案:使用
PreparedStatement(预处理对象)防止注入

浙公网安备 33010602011771号