Mehrere Möglichkeiten, XSS-Angriffe in Springboot2.0 zu verhindern

Mehrere Möglichkeiten, XSS-Angriffe in Springboot 2.0 zu verhindern
Bei der Entwicklung von Projektcode ist es leicht, den Schutz vor XSS-Angriffen zu ignorieren.Es gibt viele benutzerdefinierte globale Abfangprogramme im Internet, um eine XSS-Filterung zu erreichen.Tatsächlich muss dies nicht der Fall sein SpringBoot hat viele Weniger Hooks (Erweiterungspunkte), sodass wir eine globale XSS-Filterung geschickt implementieren können

Grundsätzlich gibt es zwei Möglichkeiten, XSS-Angriffe zu verhindern:

1. Flucht

Verwenden Sie die Toolklasse HtmlUtils, um dies zu erreichen

2. filtern

Sensible Tags entfernen
jsoup implementiert eine sehr leistungsfähige Funktion zum Reinigen sensibler Tags

Drei Implementierungen von Fluchtpraktiken:

Escape-Methode 1: Registrieren Sie einen benutzerdefinierten Konverter

Benutzerdefinierter Konverter, integrierte PropertyEditorSupport-Klassenimplementierung, der Konverter kann auch Datenformatkonvertierung realisieren, wie z. B.: Datumskonvertierung;

@Component
public class DateEditor extends PropertyEditorSupport {Pattern pattern = Pattern.compile("[^0-9]");@Overridepublic void setAsText(String text) throws IllegalArgumentException {if (StrUtil.isBlank(text)) {return;}text = text.trim();Matcher matcher = pattern.matcher(text);text = matcher.replaceAll("");int length = text.length();Date date;switch (length) {case 14:date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMddHHmmss")).toDate();break;case 12:date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMddHHmm")).toDate();break;case 10:date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMddHH")).toDate();break;case 8:date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMdd")).toDate();break;case 6:date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMM")).toDate();break;case 4:date = DateTime.parse(text, DateTimeFormat.forPattern("yyyy")).toDate();break;default:return;}setValue(date);}
}
@Component
public class StringEscapeEditor extends PropertyEditorSupport {public StringEscapeEditor() {super();}@Overridepublic String getAsText() {Object value = getValue();return value != null ? value.toString() : "";}@Overridepublic void setAsText(String text) {if (text == null) {setValue(null);} else {String value = text;value = value.trim();setValue(value);}}
}
@Slf4j
@Component
public class CommentWebBindingInitializer extends ConfigurableWebBindingInitializer {private final StringEscapeEditor stringEscapeEditor;private final DateEditor dateEditor;@Autowiredpublic CommentWebBindingInitializer(StringEscapeEditor stringEscapeEditor, DateEditor dateEditor) {this.stringEscapeEditor = stringEscapeEditor;this.dateEditor = dateEditor;}@Overridepublic void initBinder(WebDataBinder binder) {log.info("init bind editor");super.initBinder(binder);// 注册自定义的类型转换器binder.registerCustomEditor(Date.class, dateEditor);binder.registerCustomEditor(String.class, stringEscapeEditor);}
}

Escape-Methode zwei: BaseController

Der Controller, der XSS-Schutz benötigt, muss den BaseController erben

public class BaseController {@Autowiredprivate StringEscapeEditor stringEscapeEditor;@InitBinderpublic void initBinder(ServletRequestDataBinder binder) {binder.registerCustomEditor(String.class, stringEscapeEditor);}
}

Fluchtmethode drei: Konverter

@Component
public class StringEscapeEditor implements Converter<String, String> {@Overridepublic String convert(String s) {return StringUtils.isEmpty(s) ? s : HtmlUtils.htmlEscape(s);}}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Autowiredprivate StringEscapeEditor stringEscapeEditor;/*** 在参数绑定时,自定义String->String的转换器,* 在转换逻辑中对参数值进行转义,从而达到防XSS的效果** @param registry*/@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(StringEscapeEditor);}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**")// 路径不包括contextPath部分.excludePathPatterns("/user/login", "/user/logout", "/index/test1");}/*** 前后端分离需要解决跨域问题** @param registry*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH").allowCredentials(true).maxAge(3600);}
}

Referenzlink für Filtermethode:
jsoup-Methode verwenden: jsoup

Link zum Nachdruck: https://blog.csdn.net/changzhi9421/article/details/121693397

Guess you like

Origin blog.csdn.net/listeningdu/article/details/129834068