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; }
###小编:啊薇的憨宝
下一篇:
重装系统后无法启动连接 mysql