zoukankan      html  css  js  c++  java
  • JAVA 基础之SQL注入防范

    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的方法实现预编译处理

    最终提升系统的安全性

  • 相关阅读:
    软件工程第三次作业-需求分析-第八组(秃头特工队)
    软工第一次作业
    《机器学习》第一次作业——第一至三章学习记录和心得
    软工第一次作业
    《机器学习》第一次作业——第一至三章学习记录和心得
    20201116 新小组 2019南京icpc重现 总结(3小时)
    软工第一次作业
    网络流
    软工实践个人总结
    2020软工实践第二次结对作业
  • 原文地址:https://www.cnblogs.com/a986771570/p/7153827.html
Copyright © 2011-2022 走看看