SQL注入漏洞的分析及解决(java)

1,SQL注入漏洞的演示

2,SQL注入漏洞产生的原因

3,SQL注入漏洞的解决方案(Java)

一,SQL注入漏洞演示

1),数据库中用户和密码 2),验证登陆和sql拼接 模拟登陆验证页面 内联代码片。

package jdbcTest.jdbc.demo4;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

import jdbcTest.jdbc.util.jdbcUtil;

/*
 * 
 * sql注入漏洞演示
 * 
 * 
 * */

public class userDao {
          
   

	private Connection conn = null;
	private Statement statement = null;
	private ResultSet rs = null;
	/*
	 * sql注入漏洞
	 * 
	 * */
	//注册登陆
	public boolean login(String username,String password) {
          
   
		boolean flag = false;
		try {
          
   
			jdbcUtil.loadDriver();
			conn = jdbcUtil.getConnection();
			statement = conn.createStatement();
			String sql = "select * from user where username = "+username+" and password = "+password+"";
			rs = statement.executeQuery(sql);
			
			//判断数据库是否存在
			
			if(rs.next()) {
          
   
				
				flag = true;
				
			}
		} catch (Exception e) {
          
   
			e.printStackTrace();
		}finally {
          
   
			//释放资源
			jdbcUtil.release(conn, statement, rs);
			
		}
		
		return flag;
		
	}
	
}

模拟用户登陆页面 内联代码片。

package jdbcTest.jdbc.demo4;

import org.junit.Test;
/*
 * sql 注入登陆演示
 * 
 * */
public class demo4 {
          
   

	@Test
	public void demotest() {
          
   

		userDao us = new userDao();
		boolean boll = us.login("aaa+or1=1", "111");
		if(boll) {
          
   
			System.out.println("登陆成功!");
		}else {
          
   
			System.out.println("登陆失败!");

		}
	}
}

3),登陆结果展示

二,SQL注入漏洞原因分析

造成sql注入漏洞:因为用户名或者密码中有SQL语句中 的关键字,在和SQL执行语句拼接后出现漏洞(错误密码可登陆的情况)

三,SQL注入漏洞解决

采用PreparedStatement对象解决SQL注入漏洞。这个对象将SQL预先进行编译,使用?作为占位符。?所代表内容是SQL所固定。再次传入变量(包含SQL的关键字)。这个时候也不会识别这些关键字。

下面展示一些 内联代码片。

// PreparedStatement 预处理来解决SQL注入漏洞的问题;
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();
			// 编写SQL语句:
			String sql = "select * from user where username = ? and password = ?";
			// 预编译SQL
			pstmt = conn.prepareStatement(sql);
			// 设置参数:
			pstmt.setString(1, username);
			pstmt.setString(2, password);
			// 执行SQL语句:
			rs = pstmt.executeQuery();
			if(rs.next()){
          
   
				// 说明根据用户名和密码可以查询到这条记录
				flag = true;
			}
		}catch(Exception e){
          
   
			e.printStackTrace();
		}finally{
          
   
			JDBCUtils.release(rs, pstmt, conn);
		}
		return flag;
	}

###小编:啊薇的憨宝

经验分享 程序员 微信小程序 职场和发展