web程序防止xss攻击和跨域

devtools/2025/1/17 20:28:01/

什么是XSS攻击?

xss攻击是指有人恶意编写了一段脚本链接,当用户点击的时候就会向用户所在的服务器发送一个请求,这个请求包含了一段js代码,如果不防止xss那么这段js代码会被执行,这样子后果十分严重,容易被篡改数据和像数据库插入一条恶意数据。

package com.ktjy.ktds.common.config.xss;import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONUtil;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
import java.util.LinkedHashMap;
import java.util.Map;/*** XSS攻击防护请求包装类* 该类继承自HttpServletRequestWrapper,用于过滤请求参数、头部等中的HTML标签,* 以防止跨站脚本(XSS)攻击。通过移除或清理输入中的HTML标签,可以有效减少恶意脚本注入的风险。*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {/*** 构造方法,初始化父类并包装传入的HttpServletRequest对象。** @param request 被包装的HttpServletRequest对象*/public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}/*** 重写getParameter方法,过滤单个输入参数中的HTML标签。* 如果参数值不为空,则使用HtmlUtil.cleanHtmlTag方法清除其中的HTML标签。** @param name 参数名* @return 过滤后的参数值*/@Overridepublic String getParameter(String name) {String value = super.getParameter(name);if (!StrUtil.hasEmpty(value)) {// 清除HTML标签value = HtmlUtil.cleanHtmlTag(value);}return value;}/*** 重写getParameterValues方法,过滤多个输入参数中的HTML标签。* 对于非空的参数值数组,逐个元素进行HTML标签清除。** @param name 参数名* @return 过滤后的参数值数组*/@Overridepublic String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);if (values != null) {for (int i = 0; i < values.length; i++) {String value = values[i];if (!StrUtil.hasEmpty(value)) {// 清除HTML标签value = HtmlUtil.cleanHtmlTag(value);}values[i] = value;}}return values;}/*** 重写getParameterMap方法,过滤整个参数映射中的HTML标签。* 遍历所有参数键值对,对非空的字符串值进行HTML标签清除,并返回新的参数映射。** @return 过滤后的参数映射*/@Overridepublic Map<String, String[]> getParameterMap() {Map<String, String[]> parameters = super.getParameterMap();LinkedHashMap<String, String[]> map = new LinkedHashMap<>();if (parameters != null) {for (String key : parameters.keySet()) {String[] values = parameters.get(key);for (int i = 0; i < values.length; i++) {String value = values[i];if (!StrUtil.hasEmpty(value)) {// 清除HTML标签value = HtmlUtil.cleanHtmlTag(value);}values[i] = value;}map.put(key, values);}}return map;}/*** 重写getHeader方法,过滤请求头中的HTML标签。* 如果请求头值不为空,则使用HtmlUtil.cleanHtmlTag方法清除其中的HTML标签。** @param name 请求头名* @return 过滤后的请求头值*/@Overridepublic String getHeader(String name) {String value = super.getHeader(name);if (!StrUtil.hasEmpty(value)) {// 清除HTML标签value = HtmlUtil.cleanHtmlTag(value);}return value;}/*** 重写getInputStream方法,用于过滤请求体中的HTML标签。* 读取请求体内容,解析为JSON对象,对其中的字符串值进行HTML标签清除,再转换回JSON字符串并返回新的输入流。** @return 过滤后的请求体输入流* @throws IOException 当读取请求体时发生I/O错误*/@Overridepublic ServletInputStream getInputStream() throws IOException {// 读取原始请求体内容InputStream in = super.getInputStream();InputStreamReader reader = new InputStreamReader(in, Charset.forName("UTF-8"));BufferedReader buffer = new BufferedReader(reader);StringBuffer body = new StringBuffer();String line = buffer.readLine();while (line != null) {body.append(line);line = buffer.readLine();}buffer.close();reader.close();in.close();// 解析请求体为JSON对象Map<String, Object> map = JSONUtil.parseObj(body.toString());Map<String, Object> result = new LinkedHashMap<>();// 对JSON对象中的字符串值进行HTML标签清除for (String key : map.keySet()) {Object val = map.get(key);if (val instanceof String) {if (!StrUtil.hasEmpty(val.toString())) {result.put(key, HtmlUtil.cleanHtmlTag(val.toString()));} else {result.put(key, val);}} else {result.put(key, val);}}// 将处理后的JSON对象转换为字符串并创建新的输入流String json = JSONUtil.toJsonStr(result);ByteArrayInputStream bain = new ByteArrayInputStream(json.getBytes());// 返回新的ServletInputStream实现return new ServletInputStream() {@Overridepublic int read() throws IOException {return bain.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {// 不需要实现}};}
}

允许跨域

package com.ktjy.ktds.common.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 跨域请求配置类* 通过实现WebMvcConfigurer接口,自定义Spring MVC的配置* 主要用于解决前后端分离项目中的跨域请求问题*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {/*** 添加跨域映射配置* 该方法用于配置跨域请求的规则,使得指定的URL路径支持跨域请求* * @param registry CorsRegistry对象,用于注册跨域映射规则*/@Overridepublic void addCorsMappings(CorsRegistry registry) {// 配置跨域请求的映射路径,"/**"表示所有路径都支持跨域请求// allowedOrigins("*")表示允许所有来源的跨域请求// allowCredentials(true)表示支持携带凭据的跨域请求// allowedMethods指定允许的跨域请求方法// maxAge(3600)表示预检请求的缓存时间(秒)registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH").maxAge(3600);}
}


http://www.ppmy.cn/devtools/151351.html

相关文章

Jenkins-简介/安装!

一. 关于持续集成&#xff1a; 持续集成(CI ) [ Continuous Integration ]&#xff0c;通俗来讲&#xff0c;就是一个能监控版本控制系统变化的工具&#xff0c;可以自动编译和测试集成的应用程序。出现问题&#xff0c;能够及时的通知相应人员。持续集成是一种思维工具集&…

【Flink系列】4. Flink运行时架构

4. Flink运行时架构 4.1 系统架构 Flink运行时架构——Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager是一个Flink集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。也就是说&#xff0c;每个应用都应该被…

【Uniapp-Vue3】pages设置页面路径及窗口表现

在pages.json中可以看到创建的页面的信息&#xff1a; 数组中的每一个对象就是一个页面的信息&#xff0c;每个页面的信息设置可以在style中设置&#xff0c;常用的样式设置&#xff1a;

计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 领域介绍✨✨ 实时车辆检测和分类是计算机视觉中的一个重要应用领域&#xff0c;旨在从视频流或…

思科—网络安全笔记

漏洞 漏洞的分类 软件漏洞 硬件漏洞 1.缓冲器溢出&#xff1a;软件写数据的时候&#xff0c;超出数据区的边界 范围&#xff0c;导致访问到其他软件的内存数据&#xff0c;可能产生的后果有&#xff1a;系统崩溃&#xff0c;权限提升&#xff0c;数据受损等。 2.未验证输入&…

docker hello world

引言 Docker是一个容器化平台&#xff0c;能够把应用程序及其依赖打包在一个容器中&#xff0c;让容器在任意地方运行。最近刚了解了Docker&#xff0c;自己动手操作了下&#xff0c;做个记录&#xff0c;也希望可以帮助到刚学习Docker的小伙伴。 本文中已使用管理员模式&…

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <3>5分钟集成好druid并使用druid自带监控工具监控sql请求

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…

【Python】-- 趣味代码 - 发牌游戏

文章目录 文章目录 01 发牌游戏设计框架定义`Card`类定义`Hand`类定义`Poke`类(继承自`Hand`类)主程序02 发牌游戏程序代码01 发牌游戏设计框架 这段代码是一个简单的发牌游戏程序,使用面向对象的方式实现了扑克牌的发牌过程。以下是各部分的介绍: 定义Card类 属性: ra…