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的方法实现预编译处理
最终提升系统的安全性