SQL注入漏洞及解决方案
什么是SQL注入漏洞?
在早期互联网上SQL注入的漏洞是普遍存在的。有一个网站,用户注册以后根据用户名和密码可以完成登录,假设现在用户名被其他人知道了,但是其他人不知道密码,他也可以登录到网站上进行相应的操作。
演示SQL注入的漏洞
这里有用到 前面文章所提到的自己写的JDBC连接数据库的工具类!!!
数据库查询文件:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCdemo03 {
/*
用户登录功能
*/
public boolean login(String username, int password) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//定义一个变量
boolean flag = false;
try {
//获得连接
conn = JDBCUtils.getConnection();//JDBCUtils自己的数据库连接工具类
//完成登录功能
//创建执行SQL语句的对象
stmt = conn.createStatement();
//编写SQL语句
String sql = "select * from student where name = '" + username + "' and cno = '" + password + "'";
//执行SQL语句
rs = stmt.executeQuery(sql);
if (rs.next()) {
//说明根据用户名和密码可以查询到当前这条记录
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt, conn);
}
return flag;
}
}
数据库登录文件:
public class JDBCdemo04 {
/*
漏洞演示
*/
public static void main(String[] args) {
JDBCdemo03 userDao = new JDBCdemo03();
boolean flag = userDao.login("张三","1990-09-01");//登录成功!!!
//boolean flag = userDao.login("张三' or '1=1'","asmdasjdlsa");//登录成功
//boolean flag = userDao.login("张三' --","asmdasjdlsa");//登录成功
if (flag){
System.out.println("登陆成功!!!");
}else{
System.out.println("登录失败!!!");
}
}
}
SQL注入漏洞分析:
SQL注入漏洞解决:
需要采用Preparedstatement对象解决SQL注入漏洞。这个对象将SQL预先进行编译,使用?作为占位符。?所代表的内容是SQL所固定的。再次传入变量(包含SQL的关键字),这时候也不会再识别这些关键字了。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBCdemo03 {
public boolean login(String username,int password){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//定义一个变量
boolean flag = false;
try{
//获得连接
conn = JDBCUtils.getConnection();
//编写SQL语句
String sql ="select * from student where name = ? and cno = ?";
//预编译SQL
pstmt = conn.prepareStatement(sql);
//设置参数
pstmt.setString(1,username);
pstmt.setInt(2,password);
//执行SQL语句
rs = pstmt.executeQuery();
if(rs.next()){
//说明根据用户名和密码可以直接查询到这条记录
flag = true;
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,pstmt,conn);
}
return flag;
}
}
用上面的测试类来测试,发现SQL注入的问题已经解决了!