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中方法的含义一致, 只不过不存在参数!
原文地址:https://www.cnblogs.com/itcainiao2521/p/10167818.html