網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1. SQL盲注、SQL注入
??風(fēng)險(xiǎn):可能會(huì)查看、修改或刪除數(shù)據(jù)庫(kù)條目和表。
??原因:未對(duì)用戶輸入正確執(zhí)行危險(xiǎn)字符清理。
??固定值:查看危險(xiǎn)字符注入的可能解決方案。
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);
/**
* 構(gòu)造請(qǐng)求對(duì)象
*
* @param request
*/
public SqlInjectHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
/**
* 獲取頭部參數(shù)
*
* @param v 參數(shù)值
*/
@Override
public String getHeader(String v) {
String header = super.getHeader(v);
if (header == null || "".equals(header)) {
return header;
}
return sqlFilter(header);
}
/**
* 獲取參數(shù)
*
* @param v 參數(shù)值
*/
@Override
public String getParameter(String v) {
String param = super.getParameter(v);
if (param == null || "".equals(param)) {
return param;
}
return sqlFilter(param);
}
/**
* 獲取參數(shù)值
*
* @param v 參數(shù)值
*/
@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++) {
// 過(guò)濾特殊字符
resultValues[i] = sqlFilter(values[i]);
if (!(resultValues[i]).equals(values[i])) {
log.debug("SQL注入過(guò)濾器 => 過(guò)濾前:{} => 過(guò)濾后:{}", values[i], resultValues[i]);
}
}
return resultValues;
}
/**
* 預(yù)編譯SQL過(guò)濾正則表達(dá)式
*/
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過(guò)濾
*
* @param v 參數(shù)值
* @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 注入過(guò)濾url地址
security.sql.excludes=/images/*, /jquery/*, /layui/*
4、添加SQL注入過(guò)濾器
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注入過(guò)濾器
*
* @author zzg
*
*/
@Component
@WebFilter(filterName = "SqlInjectFilter", urlPatterns = "/*")
public class SqlInjectFilter implements Filter {
/**
* 過(guò)濾器配置對(duì)象
*/
FilterConfig filterConfig = null;
/**
* 是否啟用(默認(rèn)啟用)
*/
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-過(guò)濾
*/
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);
}
}
涉及知識(shí)點(diǎn):Spring Boot 讀取配置文件的五種方式
原文鏈接:https://blog.csdn.net/zhouzhiwengang/article/details/121139349
相關(guān)推薦
- 2022-06-07 Jenkins?腳本命令行應(yīng)用小結(jié)_相關(guān)技巧
- 2022-12-15 Go字典使用詳解_Golang
- 2023-01-10 Go?Slice進(jìn)行參數(shù)傳遞如何實(shí)現(xiàn)詳解_Golang
- 2022-02-09 QT5實(shí)現(xiàn)UDP通信的示例代碼_C 語(yǔ)言
- 2022-05-24 Matplotlib實(shí)現(xiàn)各種條形圖繪制_python
- 2022-08-15 Python包裝異常處理方法_python
- 2022-06-23 Windows下批處理(BAT)修改文件名的一些整理_DOS/BAT
- 2022-09-13 Golang優(yōu)雅保持main函數(shù)不退出的辦法_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支