java之sql注入漏洞
以及如何防范
所谓SQL注入,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力
首先创建一个数据库工具类
package zr;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class main2
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine();
try
{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e)
{
System.out.println("加载驱动失败"+e.getMessage());
}
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
conn = DriverManager.getConnection("jdbc:mysql://localhost/study1?seUnicode=true&characterEncoding=UTF8", "root", "root");
String sql = "select count(*) c from T_Users where UserName='"+username+"' and PassWord = '"+password+"'";
ps = conn.prepareStatement(sql);
/*
* 存在注入漏洞 a' or 'a'='a
* 需要对其过滤
*/
/*String sql ="select count(*) c from T_Users where UserName=? and PassWord =?";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);*/
rs = ps.executeQuery();
rs.next();
int c = rs.getInt("c");
System.out.println(c);
if(c<=0){
System.out.println("登录失败");
}
else{
System.out.println("登陆成功");
}
}catch(SQLException ex){
System.out.println("执行数据库出错"+ ex);
}
finally{
JDBCGB.closeQuiety(ps);
JDBCGB.closeQuiety(conn);
JDBCGB.closeQuiety(rs);
}
}
}
然后使用navicat工具在数据库里创建一个账号,再使用上面的代码进行登录
账号为任意值密码为
a' or 'a'='a
都可以登录成功原因是因为
password的值永远为真值
所以where整个的数据也为真
这样就可以成功执行sql语句
需要对sql语句进行过滤
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
这里采用的是setstring的方法实现预编译处理
最终提升系统的安全性