[实践总结] Java 防止SQL注入的四种方案 |
您所在的位置:网站首页 › sql防止注入写法错误怎么办解决 › [实践总结] Java 防止SQL注入的四种方案 |
原文链接:https://mp.weixin.qq.com/s/_iQ2Cb__QOQoRMLmcGebaA 大佬写的特别好,担心大佬文章搬家,这里做个备份 什么是SQL注入? String sql = "delete from table1 where id = " + "id"; 当 id 传值为 1001 or 1 = 1 String sql = "delete from table1 where id = 1001 or 1 = 1"; 此时,数据库的数据都会被清空掉,后果非常严重 Java项目防止SQL注入方式 方案1:PreparedStatement防止SQL注入PreparedStatement具有 预编译 功能,以上述SQL为例 delete from table1 where id = ?此时SQL语句结构已固定,无论"?"被替换为任何参数,SQL语句只认为where后面只有一个条件,当再传入 1001 or 1 = 1时,语句会报错,从而达到防止SQL注入效果。 方案2:mybatis中#{}防止SQL注入mybatis中#{}表达式对SQL语句进行 预编译 处理 注意: #{} 是 参数占位符 ${} 是 拼接替换符 ${} 不能防止SQL注入,一般用于 1、传入数据库对象(如:数据库名称、表名) 2、order by,group by 等后的条件[Q&A] 为什么预编译可以避免SQL注入? SQL预编译后,占位符表示的内容被视为参数的一部分,而不是SQL的一部分 [Ref] 什么预编译可以避免SQL注入? 方案3:对 请求参数的敏感词汇 进行过滤这里是springboot的写法,如下代码是 黑名单思路,采取 白名单思路 也可以。 import org.springframework.context.annotation.Configuration; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; import java.util.Enumeration; @WebFilter(urlPatterns = "/*",filterName = "sqlFilter") @Configuration public class SqlFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} /** * @description sql注入过滤 */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ServletRequest request = servletRequest; ServletResponse response = servletResponse; // 获得所有请求参数名 Enumeration names = request.getParameterNames(); String sql = ""; while (names.hasMoreElements()){ // 得到参数名 String name = names.nextElement().toString(); // 得到参数对应值 String[] values = request.getParameterValues(name); for (int i = 0; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |