JDBC sql注入风险以及preparedStatement的使用

所谓sql注入就是所谓,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

步骤:

        创建集合或者实体类对象(可选-查询)    
        加载驱动
        获取连接对象
        设置手动数据提交(可选--增删改)
        创建sql命令
        获取sql命令对象
        给占位符赋值
        执行sql语句
        遍历执行结果(可选--查询)
        提交数据(可选--增删改)
        回滚数据(可选-增删改)
        关闭资源
        返回结果
 

为了解决这个问题,我们使用preparedStatement来执行sql命令,它的使用跟之前的Statement不太一样,它不能使用字符串拼接,未知的参数用“?”(占位符)代替,后面可以进行赋值,并且它在执行executeQuery和executeUpdate方法时不用传递参数。

示例代码(注意操作顺序):

public class UserDaoImpl {	




	//查询用户信息
	public User getUserInfo(String uname,String upwd) throws ClassNotFoundException, SQLException{
		//声明User对象
		User u=null;
		//加载驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");
		//创建连接对象
		Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "oracle");
		//创建sql命令
		String sql="select * from t_user where uname=? and upwd=?";
		//创建sql命令对象
		PreparedStatement ps=conn.prepareStatement(sql);
		//给占位符赋值(占位符从左到右角标从1开始)
		ps.setString(1, uname);
		ps.setString(2, upwd);
	
		//执行sql命令
		ResultSet rs=ps.executeQuery();
		//遍历查询结果
		while(rs.next()){
			u=new User();
			u.setUnum(rs.getInt("unum"));
			u.setUname(rs.getString("uname"));
			u.setUpwd(rs.getString("upwd"));
			return u;
		}
		//关闭资源
		rs.close();
		ps.close();
		conn.close();
		//返回执行结果
		return u;
	}






	//新增--preparedStatement
		public int insUser2() throws ClassNotFoundException, SQLException{
			//加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//创建连接对象
			Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "oracle");
			//创建sql命令
			String sql="insert into t_user values(?,?,?)";
			//创建sql命令对象
			PreparedStatement ps=conn.prepareStatement(sql);
			//给占位符赋值
				ps.setInt(1, 7);
				ps.setString(2,"赵六");
				ps.setString(3,"666");
				//执行sql命令
				int i=ps.executeUpdate();
			//关闭资源
				ps.close();
				conn.close();
			//返回结果
				return i;
		}	





	//更新
		public int upUser(String uname,int unum) throws ClassNotFoundException, SQLException{
			//加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//获取连接对象
			Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "oracle");
			//创建sql命令
			String sql="update t_user set uname=? where unum=?";
			//获取sql命令对象
			PreparedStatement ps=conn.prepareStatement(sql);
			//给占位符赋值
			ps.setString(1, uname);
			ps.setInt(2, unum);
			//执行sql命令
			int i=ps.executeUpdate();
			//关闭资源
			ps.close();
			conn.close();
			//返回结果	
			return i;
		}	





	//删除
		public int delUser(int unum) throws ClassNotFoundException, SQLException{
			
			//加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//获取连接对象
			Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "oracle");
			//创建sql命令
			String sql="delete from t_user where unum=?";
			//获取sql命令对象
			PreparedStatement ps=conn.prepareStatement(sql);
			//给占位符赋值
			ps.setObject(1, unum);
			//执行sql命令
			int i=ps.executeUpdate();
			//关闭资源
			ps.close();
			conn.close();
			//返回结果	
			return i;
			
		}		
}

猜你喜欢

转载自blog.csdn.net/mengxianglong123/article/details/89101923