網站首頁 編程語言 正文
1. SQL盲注、SQL注入
??風險:可能會查看、修改或刪除數據庫條目和表。
??原因:未對用戶輸入正確執行危險字符清理。
??固定值:查看危險字符注入的可能解決方案。
2、添加SQL注入包裝類?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* SQL注入包裝類
*
* @author zzg
*
*/
public class SqlInjectHttpServletRequestWrapper extends HttpServletRequestWrapper {
public static final Logger log = LoggerFactory.getLogger(SqlInjectHttpServletRequestWrapper .class);
/**
* 構造請求對象
*
* @param request
*/
public SqlInjectHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
/**
* 獲取頭部參數
*
* @param v 參數值
*/
@Override
public String getHeader(String v) {
String header = super.getHeader(v);
if (header == null || "".equals(header)) {
return header;
}
return sqlFilter(header);
}
/**
* 獲取參數
*
* @param v 參數值
*/
@Override
public String getParameter(String v) {
String param = super.getParameter(v);
if (param == null || "".equals(param)) {
return param;
}
return sqlFilter(param);
}
/**
* 獲取參數值
*
* @param v 參數值
*/
@Override
public String[] getParameterValues(String v) {
String[] values = super.getParameterValues(v);
if (values == null) {
return values;
}
int length = values.length;
String[] resultValues = new String[length];
for (int i = 0; i < length; i++) {
// 過濾特殊字符
resultValues[i] = sqlFilter(values[i]);
if (!(resultValues[i]).equals(values[i])) {
log.debug("SQL注入過濾器 => 過濾前:{} => 過濾后:{}", values[i], resultValues[i]);
}
}
return resultValues;
}
/**
* 預編譯SQL過濾正則表達式
*/
private Pattern sqlPattern = Pattern.compile(
"(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)",
Pattern.CASE_INSENSITIVE);
/**
* SQL過濾
*
* @param v 參數值
* @return
*/
private String sqlFilter(String v) {
if (v != null) {
String resultVal = v;
Matcher matcher = sqlPattern.matcher(resultVal);
if (matcher.find()) {
resultVal = matcher.replaceAll("");
}
if (!resultVal.equals(v)) {
return "";
}
return resultVal;
}
return null;
}
}
3、配置文件添加配置
# sql 注入過濾url地址
security.sql.excludes=/images/*, /jquery/*, /layui/*
4、添加SQL注入過濾器
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Value;
/**
* SQL注入過濾器
*
* @author zzg
*
*/
@Component
@WebFilter(filterName = "SqlInjectFilter", urlPatterns = "/*")
public class SqlInjectFilter implements Filter {
/**
* 過濾器配置對象
*/
FilterConfig filterConfig = null;
/**
* 是否啟用(默認啟用)
*/
private boolean enable = true;
/**
* 忽略的URL
*/
@Value("${security.sql.excludes}")
private String excludes;
/**
* 初始化
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
/**
* 攔截
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
// 不啟用或者已忽略的URL不攔截
if (!enable || isExcludeUrl(request.getServletPath())) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
SqlInjectHttpServletRequestWrapper sqlInjectHttpServletRequestWrapper = new SqlInjectHttpServletRequestWrapper(
request);
filterChain.doFilter(sqlInjectHttpServletRequestWrapper, servletResponse);
}
/**
* 銷毀
*/
@Override
public void destroy() {
this.filterConfig = null;
}
/**
* 判斷是否為忽略的URL
*
* @param urlPath URL路徑
* @return true-忽略,false-過濾
*/
private boolean isExcludeUrl(String url) {
if (excludes == null || excludes.isEmpty()) {
return false;
}
List urls = Arrays.asList(excludes.split(","));
return urls .stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(url))
.anyMatch(Matcher::find);
}
}
涉及知識點:Spring Boot 讀取配置文件的五種方式
原文鏈接:https://blog.csdn.net/zhouzhiwengang/article/details/121139349
相關推薦
- 2021-12-09 android藍牙簡單開發示例教程_Android
- 2023-05-06 react中axios結合后端實現GET和POST請求方式_React
- 2022-12-23 C++中關于getchar()的使用方法_C 語言
- 2022-11-01 Go語言框架快速集成限流中間件詳解_Golang
- 2022-11-07 Docker鏡像多架構構建介紹_docker
- 2022-01-30 使用ref手動改變antd的搜索框Input.Search的搜索內容
- 2022-10-26 C++賦值函數+移動賦值函數+移動構造函數詳解_C 語言
- 2022-04-09 詳解Docker下nginx外掛配置和文件_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支