本文目的:身为安全人员在给开发人员进行网络安全培训时进行代码演示必不可少,本文为记录培训时为java开发人员提供的sql注入漏洞产生原理的演示与防御方法的代码演示。
代码简介:使用mysql-connector-java-8.0.28.jar(不必局限于此版本)实现jdbc,针对sql注入防御采用预编译处理的方式,使用mysql数据库。
数据库表设计:简单的user展示表
id | username | password | phone | address |
1 | zhangsan | zhangsan521 | 18866667777 | 中国 |
2 | lisi | lisi666 | 18899990000 | 中国 |
3 | test | test | 18899991111 | 中国 |
存在sql注入漏洞展示代码:
import java.sql.*;
public class SQLInjectionExample {
public static void main(String[] args) {
String username = "admin' OR '2'='2'-- qwe'";//万能密码注入
String password = "password123";
try {
Connection conn = DriverManager.getConnection("jdbc:mysql://10.16.106.18:3306/sqltest", "root", "look@1024");
Statement stmt = conn.createStatement();
// 构建SQL查询语句
String query = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'";
ResultSet rs = stmt.executeQuery(query);
if (rs.next()) {
System.out.println("登录成功!");
} else {
System.out.println("用户名或密码错误!");
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
sql注入预处理防御代码展示:
import java.sql.*;
public class SecureSQLExample {
public static void main(String[] args) {
String username = "lisi' or 1=1";
String password = "lisi666";
try {
Connection conn = DriverManager.getConnection("jdbc:mysql://10.16.106.18:3306/sqltest", "root", "look@1024");
// 使用PreparedStatement和参数化查询
String query = "SELECT * FROM user WHERE username=? AND password=?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
System.out.println(query);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
System.out.println("登录成功!");
} else {
System.out.println("用户名或密码错误!");
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}