zoukankan      html  css  js  c++  java
  • 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中方法的含义一致, 只不过不存在参数!
  • 相关阅读:
    HandlerThread
    handler原理
    死锁简析
    Android序列化
    AsyncTask原理
    【java线程池】
    java创建线程的三种方式
    service相关
    【hashMap】详谈
    【activity任务栈】浅析
  • 原文地址:https://www.cnblogs.com/itcainiao2521/p/10167818.html
Copyright © 2011-2022 走看看