[实践总结] Java 防止SQL注入的四种方案

您所在的位置:网站首页 sql防止注入写法错误怎么办解决 [实践总结] Java 防止SQL注入的四种方案

[实践总结] Java 防止SQL注入的四种方案

2024-07-13 23:33| 来源: 网络整理| 查看: 265

原文链接: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