目录
【项目问题解决】% sql注入问题
文章所属专区 项目问题解决
1.问题描述
在处理接口入参的一些sql注入问题,虽然通过MyBatis框架的一些特点处理了大部分sql注入问题,但还有一些是没法处理,比如这种 param LIKE CONCAT(CONCAT('%','%'),'%') 这种情况,%无法预编译或者转义成%导致去数据库查询了全表。
2.问题原因
MyBatis转义失败;
前端没有现值特殊字符;
后端没有过滤特殊字符;
3.解决思路
1.前端限制禁止传入特殊字符
2.后端限制禁止传入特殊字符,例如swagger限制字符传入,但似乎只在POST请求有效
3.后端拦截特殊字符
4.解决方案
1.前端限制传入特殊字符
2.后端拦截特殊字符-正则表达式
java
public static void main(String[] args) {
String text = "Hello%World";
boolean hasSpecialChar = text.matches(".*[%].*");
if (hasSpecialChar) {
System.out.println("字符串中包含特殊字符%");
} else {
System.out.println("字符串中不包含特殊字符%");
}
}
.*表示匹配0个或多个字符
[%]表示匹配字符 %
3.后端拦截特殊字符-拦截器
java
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class SpecialCharacterFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 获取请求参数
String parameter = servletRequest.getParameter("param");
// 检查参数中是否带有特殊字符 %
if (parameter != null && parameter.contains("%")) {
// 拦截请求
servletResponse.getWriter().write("请求参数中含有特殊字符 %");
return;
}
// 继续处理请求
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
// 销毁操作
}
}
5.总结
6.参考
给个三连吧 谢谢谢谢谢谢了