当前位置: 首页 > 科技观察

mybatis如何防止SQL注入?

时间:2023-03-11 20:43:21 科技观察

1、使用jdbc操作数据时,Stringsql="updateft_proposalsetid="+id;PreparedStatementprepareStatement=conn.prepareStatement(sql);prepareStatement.executeUpdate();preparedStatement预编译对象会对传入的sql进行预编译,然后当传入输入id字符串为“updateft_proposalsetid=3;droptableft_proposal;”在这种情况下,SQL注入将导致ft_proposal表被删除。如何防止sql注入,先执行sql预编译,然后替换占位符Stringsql="updateft_proposalsetid=?"PreparedStatementps=conn.preparedStatement(sql);ps.setString(1,"2");ps。执行更新();除了使用预编译语句外,另一种实现方法可以使用存储过程。存储过程实际上是预编译的。存储过程是sql语句的集合。将所有预编译的sql语句编译完成后,存储到数据库上,由于存储过程比较死板,一般不采用这种方式进行处理。2、mybatis是如何处理sql注入的?假设mapper.xml文件中的SQL查询语句为:selectnamefromuserwhereid=#{userid};对应的接口为:publicStringfindById(@param("userId")StringuserId);传入参数为3时;droptableuser;我们执行的时候可以看到打印出来的sql语句是:selectnamefromusrewhereid=?;不管输入什么参数,都可以防止sql注入,因为mybatis底层实现了预编译,底层通过prepareStatement预编译实现类对当前传入的sql进行预编译,这样就可以防止sql注入。如果将查询语句改写为:selectnamefromuserwhereid=${userid}当入参为3时;删除表用户;执行sql语句为selectnamefromuserwhereid=3;droptableuser;mybatis没有预编译语句,它做的是字符串拼接,然后预编译。这个过程就是sql注入生效的过程。因此,在编写mybatis的映射语句时,尽量使用“#{xxx}”的格式。如果一定要使用“${xxx}”等参数,必须手动过滤,防止SQL注入攻击。