• SQL注入问题及解决方案


    SQL注入

    用户输入的内容, 在SQL语句拼接过程中, 完成了一条逻辑发生变化的新的SQL语句 !
    
    
    例如:  
    
    原SQL语句拼接为: 
    
    	String sql = "select id from user15 where username='"+user.getUserName()+"' and password='"+user.getPassWord()+"'";
    	
    用户输入的帐号密码分别为:
    
    请输入您的帐号:
    suibian
    请输入您的密码:
    suibian' or '1'='1
    组成的SQL语句: 
    select id from user15 where username='suibian' and password='suibian' or '1'='1'
    

    解决SQL注入问题

    使用预编译SQL语句 进行参数的传递
    
    更改执行环境 Statement  
    
    使用新的环境: PreparedStatement
    
    
    在通过连接对象 获取一个预编译的SQL环境(PreparedStatement)时, 需要传递 一个SQL语句 ! 
    在这个语句中 可以出现? , ? 表示准备填充的参数值!
    
    
    使用步骤: 
    
    	1.	通过连接对象, 获得一个预编译的SQL执行环境
    
    		PreparedStatement state conn.prepareStatement(sql);
    
    		例如: 
    			String sql = "select id from user15 where username=? and password=?";
    	
    			PreparedStatement state  = conn.prepareStatement(sql);	
    			
    	2.    向预编译参数列表中 传递值: 
    
    		预编译的SQL语句中可以包含0-n个问号, 每一个问号表示一个需要传递的值 
    		我们通过PreparedStatement它的setXXX方法,来完成参数的传递
    		在传递参数时, 需要指定问号的索引, 问号的索引从1开始			
    
    		例如:
    			state.setString(1,user.getUserName());
    			state.setString(2,user.getPassWord());
    
    	3.	执行语句:
    			ResultSet result = state.executeQuery();
    

    PreparedStatement

    常用方法: 
    	
    	填充预编译的参数: 
    
    	-	setXXX(问号索引,值)
    		向预编译的SQL的?中传递值 
    		参数1. 问号的索引 ,从1开始
    		参数2. 填充到? 中的值
    
    	-	execute()
    	-	executeUpdate();
    	-	executeQuery();
    		上面的三个方法 与 Statement中方法的含义一致, 只不过不存在参数!
  • 相关阅读:
    TS的一些小东西
    关于Vue懒加载问题
    react子传父
    MYSQL存储过程以及结果集
    MYSQL视图 事务 游标 索引及其使用
    MYSQL数据库的修复方法MAC
    MYSQL用户授权以及SQL语句
    MySQL数据库基础知识
    JavaScript对象
    JavaScript控制语句
  • 原文地址:https://www.cnblogs.com/itcainiao2521/p/10167818.html
Copyright © 2020-2023  润新知