概述
什么是SQL注入漏洞?
在早期互联网上SQL注入漏洞普遍存在。比如有一个网站,用户需要进行注册,用户注册以后根据用户名和密码完成登录。假设现在用户名已经被其他人知道了,但是其他人不知道你的密码,也可以登录到网站上进行相应的操作。
这里以登录为案例:
package demo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
public class UserDao {
//以登录功能为例
public boolean login(String username,String password) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
boolean flag = false;
try {
conn = JDBCUtils.getConnection();
String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if(rs.next()) {
flag = true;
}
}catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(rs, stmt, conn);
}
return flag;
}
}
package demo;
import org.junit.Test;
//输入用户名 aaa
//aaa’ or ‘1=1 密码随意
//aaa’ --
密码随意
public class LoginDemo {
@Test
public void test() {
UserDao userdao = new UserDao();
boolean flag = false;
flag = userdao.login("aaa", "123");//success成功
flag = userdao.login("aaa", "ghjmnbvg");//fail失败
flag = userdao.login("aaa' or '1=1", "ghjmnbhj");//success成功
flag = userdao.login("aaa' -- ", "ghjnb");//success成功
if(flag) {
System.out.println("success");
}else {
System.out.println("fail");
}
}
}
原因分析:在变量中存在sql关键字。
如:在userdao.login()中存在sql 的关键字,如("aaa' or '1=1","ghjmnbhj")的or,因为and比or的优先级高,所以调用参数后sql语句就变成:select * from user where username = 'aaa' or '1=1' and password = 'ghjmnbhj‘;结果就为真了; (--)在sql语句中是注释符的意思。
如何解决漏洞呢?
需要采用PreparedStatement对象解决SQL注入漏洞。这个对象将SQL预先进行编译,使用?作为占位符。?所代表内容是SQL所固定。再次传入变量(包含SQL的关键字)。这个时候也不会识别这些关键字(or、and等不会被当作sql关键字而是只是单纯的内容)。
解决:修改sql语句,将Statement类换成PreparedStatement类。
package demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
public class UserDao {
//以登录功能为例
public boolean login(String username,String password) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
boolean flag = false;
try {
conn = JDBCUtils.getConnection();
String sql = "select * from user where username = ? and password = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,username);//这里的1指的是sql语句的第一个问号
pstmt.setString(2,password);//这里的2指的是sql语句的第二个问号
rs = pstmt.executeQuery();
if(rs.next()) {
flag = true;
}
}catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(rs, pstmt, conn);
}
return flag;
}
}
最后
以上就是单纯金鱼为你收集整理的JDBC——SQL注入漏洞的全部内容,希望文章能够帮你解决JDBC——SQL注入漏洞所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复