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

    最终提升系统的安全性

  • 相关阅读:
    python 用 matplotlib 的 basemap 绘制简单世界地图
    python 安装 basemap
    python 茎叶图
    python 用 matplotlib 绘制复合饼图(子母图)
    python 分析世界高收入数据集
    python 用 matplotlib 绘制 南丁格玫瑰图步骤详解
    python 用 matplotlib 中的 patch 模块绘制几何形状(圆,椭圆,圆弧,锲形块,矩形),组装一个机器人图
    python 用 matplotlib 的 patch 模块绘制矩形,画一所房子
    国家统计局数据下载
    python 用 matplotlib 的 patch 模块绘制椭圆详解
  • 原文地址:https://www.cnblogs.com/a986771570/p/7153827.html
Copyright © 2020-2023  润新知