SQL Injection - JDBC
SQLI(SQL Injection) SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句。
运行
漏洞代码 - 语句拼接
Connection conn = DriverManager.getConnection(db_url, db_user, db_pass); Statement stmt = conn.createStatement(); String sql = "select * from users where id = '" + id + "'"; System.out.println("[*] 执行SQL语句:" + sql); ResultSet rs = stmt.executeQuery(sql);
运行
安全代码 - 预编译方法
Connection conn = DriverManager.getConnection(db_url, db_user, db_pass); Statement stmt = conn.createStatement(); String sql = "select * from users where id = ?"; PreparedStatement st = conn.prepareStatement(sql); st.setString(1, id); ResultSet rs = st.executeQuery();
编码建议
【必须】SQL语句默认使用预编译并绑定变量 Web后台系统应默认使用预编译绑定变量的形式创建sql语句,保持查询语句和数据相分离。以从本质上避免SQL注入风险。
运行
安全代码 - 过滤方法
public static boolean check_sql(String content) { String black = "'|;|--|+|,|%|=|*|(|)|like|xor|and|or|exec|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare"; String[] black_list = black.split("|"); for (int i=0 ; i < black_list.length ; i++ ){ if (content.contains(black_list[i])){ return true; } } return false; }