当前位置: 首页 > news >正文

XSS攻击以及java应对措施

文章目录

  • 一. XSS攻击介绍
    • 1. 前端安全
    • 2. xss攻击简介
    • 3. xss的攻击方式
  • 二. java应对xss攻击的解决方案
    • 1. 强制修改html敏感标签内容
    • 2. 利用过滤器过滤非法html标签

一. XSS攻击介绍

1. 前端安全

随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点。在移动互联网时代,前端人员除了传统的 XSS、CSRF 等安全问题之外,又时常遭遇网络劫持、非法调用 Hybrid API 等新型安全问题。当然,浏览器自身也在不断在进化和发展,不断引入 CSP、Same-Site Cookies 等新技术来增强安全性,但是仍存在很多潜在的威胁,这需要前端技术人员不断进行 “查漏补缺”。

2. xss攻击简介

XSS 全称 Cross Site Scripting,跨站脚本攻击。XSS攻击是指黑客往HTML文件中或者DOM中注入恶意脚本,从而在用户浏览页面时利用注入的恶意脚本对用户实施攻击的一种手段。
恶意脚本能够做事情有:
● 窃取Cookie信息。通过document.cookie获取Cookie信息。
● 监听用户行为。通过addEventListener接口监听事件。
● 修改DOM。如通过修改DOM伪造登录窗口,用来欺骗用户输入账号、密码等信息。
● 在页面内生成浮窗广告等

3. xss的攻击方式

XSS 攻击方式可以分为三种:存储型XSS攻击、反射型XSS攻击和基于DOM的XSS攻击。

  • 存储型xss攻击

黑客利用网站漏洞将恶意脚本提交并存储到网站服务器上。当用户浏览访问包含恶意脚本的页面时,恶意脚本就可以用户浏览器上执行,如将用户的Cookie信息等数据上传到服务器。

在这里插入图片描述

  • 反射型xss攻击

在一个反射型XSS攻击过程中,恶意脚本属于用户发送给服务器请求的一部分,随后网站又把恶意脚本返回给用户。当恶意脚本在用户页面中被执行时,就可以利用该脚本做恶意操作。相比存储型XSS攻击,Web服务器是不会存储反射型XSS攻击的恶意脚本。

在这里插入图片描述

  • 基于DOM的Xss攻击

基于 DOM 的 XSS 攻击是不牵涉到页面 Web 服务器的。具体来讲,黑客通过各种手段将恶意脚本注入用户的页面中,比如通过网络劫持在页面传输过程中修改 HTML 页面的内容,这种劫持类型很多,有通过 WiFi 路由器劫持的,有通过本地恶意软件来劫持的,它们的共同点是在 Web 资源传输过程或者在用户使用页面的过程中修改 Web 页面的数据。原始页面内容是没有问题的,黑客是通过各种手段在资源传输过程中或者用户使用页面过程中修改HTML的内容注入恶意脚本。

二. java应对xss攻击的解决方案

1. 强制修改html敏感标签内容

这是一种相对容易理解的方式,解决思路就是,当恶意注入的字段中,包含了类似这种html标签时,后台程序代码中强制替换或更改标签内容,这样存入数据库的内容再次返回至页面时,就不会以html的形式进行执行了

/*** xss特殊字符拦截与过滤** @author zhangcy* @date 2021-04016*/
public class XssStrUtils {/*** 滤除content中的危险 HTML 代码, 主要是脚本代码, 滚动字幕代码以及脚本事件处理代码* @param content 需要滤除的字符串* @return 过滤的结果*/public static String replaceHtmlCode(String content) {if (null == content) return null;if (0 == content.length()) return "";// 需要滤除的脚本事件关键字String[] eventKeywords = {"onmouseover", "onmouseout", "onmousedown", "onmouseup", "onmousemove", "onclick", "ondblclick","onkeypress", "onkeydown", "onkeyup", "ondragstart", "onerrorupdate", "onhelp", "onreadystatechange","onrowenter", "onrowexit", "onselectstart", "onload", "onunload", "onbeforeunload", "onblur","onerror", "onfocus", "onresize", "onscroll", "oncontextmenu", "alert"};content = replace(content, "<script", "<script", false);content = replace(content, "</script", "</script", false);content = replace(content, "<marquee", "<marquee", false);content = replace(content, "</marquee", "</marquee", false);content = replace(content, "'", "_", false);// 将单引号替换成下划线content = replace(content, "\"", "_", false);// 将双引号替换成下划线// 滤除脚本事件代码for (int i = 0; i < eventKeywords.length; i++) {content = replace(content, eventKeywords[i], "_" + eventKeywords[i], false); // 添加一个"_", 使事件代码无效}return content;}/*** 将字符串 source 中的 oldStr 替换为 newStr, 并以大小写敏感方式进行查找** @param source 需要替换的源字符串* @param oldStr 需要被替换的老字符串* @param newStr 替换为的新字符串*/private static String replace(String source, String oldStr, String newStr) {return replace(source, oldStr, newStr, true);}/*** 将字符串 source 中的 oldStr 替换为 newStr, matchCase 为是否设置大小写敏感查找** @param source    需要替换的源字符串* @param oldStr    需要被替换的老字符串* @param newStr    替换为的新字符串* @param matchCase 是否需要按照大小写敏感方式查找*/private static String replace(String source, String oldStr, String newStr,boolean matchCase) {if (source == null) return null;// 首先检查旧字符串是否存在, 不存在就不进行替换if (source.toLowerCase().indexOf(oldStr.toLowerCase()) == -1) return source;int findStartPos = 0;int a = 0;while (a > -1) {int b = 0;String str1, str2, str3, str4, strA, strB;str1 = source;str2 = str1.toLowerCase();str3 = oldStr;str4 = str3.toLowerCase();if (matchCase) {strA = str1;strB = str3;} else {strA = str2;strB = str4;}a = strA.indexOf(strB, findStartPos);if (a > -1) {b = oldStr.length();findStartPos = a + b;StringBuffer bbuf = new StringBuffer(source);source = bbuf.replace(a, a + b, newStr) + "";// 新的查找开始点位于替换后的字符串的结尾findStartPos = findStartPos + newStr.length() - b;}}return source;}}

使用这种方式,即使前端恶意注入了某些非法的html标签,经过后端的过滤处理,返回的内容就不会执行html的相关操作事件了

2. 利用过滤器过滤非法html标签

第二种思路,考虑在过滤器中添加对所有请求接口的参数进行参数的拦截过滤,即程序认为的不合法标签都会自动做过滤,至于过滤的规则,可以借助现有的第三方组件,比如spring框架的htmlUtil类,这里使用hutool工具集提供的相关API做处理

  • 导入依赖
	<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.9</version></dependency>
  • 添加自定义过滤器增强包装类
ublic class XssHttpRequestWrapper extends HttpServletRequestWrapper {public XssHttpRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {String value = super.getParameter(name);if(!StringUtils.isEmpty(value)){value = HtmlUtil.filter(value);}return value;}@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(!StringUtils.isEmpty(value)){value = HtmlUtil.filter(value);}values[i]=value;}}return values;}@Overridepublic Map<String, String[]> getParameterMap() {Map<String, String[]> parameters = super.getParameterMap();Map<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(!StringUtils.isEmpty(value)){value = HtmlUtil.filter(value);}values[i]=value;}map.put(key,values);}}return map;}@Overridepublic String getHeader(String name) {String value = super.getHeader(name);if(!StringUtils.isEmpty(value)){value = HtmlUtil.filter(value);}return value;}@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();Map<String,Object> map = JSONUtil.parseObj(body.toString());Map<String,Object> result = new LinkedHashMap<>();for(String key : map.keySet()){Object val = map.get(key);if(val instanceof String){if(!StringUtils.isEmpty(val.toString())){result.put(key,HtmlUtil.filter(val.toString()));}}else {result.put(key,val);}}String json = JSONUtil.toJsonStr(result);ByteArrayInputStream bain = new ByteArrayInputStream(json.getBytes());return new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return bain.read();}};}
}
  • 自定义过滤器并注入全局bean
ublic class XssFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;XssHttpRequestWrapper requestWrapper = new XssHttpRequestWrapper(request);filterChain.doFilter(requestWrapper,servletResponse);}@Overridepublic void destroy() {}
}
@Configuration
public class XSSFilterRegister {@Beanpublic FilterRegistrationBean<XssFilter> RegistTest1(){//通过FilterRegistrationBean实例设置优先级可以生效FilterRegistrationBean<XssFilter> bean = new FilterRegistrationBean<XssFilter>();bean.setFilter(new XssFilter());//注册自定义过滤器bean.setName("flilter");//过滤器名称bean.addUrlPatterns("/*");//过滤所有路径return bean;}}

通过这种方式,直接将注入的敏感标签符号去掉,这样确保了入库的数据的安全性,返回给页面的数据就不存在非法html标签问题了

相关文章:

XSS攻击以及java应对措施

文章目录 一. XSS攻击介绍1. 前端安全2. xss攻击简介3. xss的攻击方式 二. java应对xss攻击的解决方案1. 强制修改html敏感标签内容2. 利用过滤器过滤非法html标签 一. XSS攻击介绍 1. 前端安全 随着互联网的高速发展&#xff0c;信息安全问题已经成为企业最为关注的焦点之一…...

yolo 训练

这里写目录标题 分配训练集&Validation数量数据集读取读取全部文件夹替换路径 loss weightNMSBBox_IOUEIou Optimizer 分配训练集&Validation数量 validation_size training_size * validation_ratio / (1 - validation_ratio)training_size 219 validation_ratio …...

谷歌chrome浏览器升级新版后字体显示不清楚解决方案

谷歌chrome浏览器升级新版后字体显示不清楚解决方案 参考图片&#xff1a; Chrome更新至版本Chrome 109.0.5414.120 字体看不清 浏览器症状与表现 Chrome更新至版本Chrome 109.0.5414.120 字体看不清&#xff1b;会很细&#xff0c;在设置中选择自定义的字体&#xff0c;仍无法…...

在外包干了三年,我废了……不吹不黑!

没错&#xff0c;我也干过外包&#xff0c;一干就是三年&#xff0c;三年后&#xff0c;我废了…… 虽说废的不是很彻底&#xff0c;但那三年我几乎是出差了三年、玩了三年、荒废了三年&#xff0c;那三年&#xff0c;我的技术能力几乎是零成长的。 说起这段三年的外包经历&a…...

【Vue】学习笔记-消息的订阅与发布

消息的订阅与发布(基本不用) 消息订阅与发布(pubsub)消息订阅与发布是一种组件间的通信的方式&#xff0c;适用于任意组件间通信 消息订阅与发布 1.订阅消息∶消息名 2.发布消息︰消息内容 消息订阅与发布的工作流程&#xff1a; &#xff08;A是订阅者&#xff0c;B是发布…...

大疆无人机 MobileSDK(遥控器/手机端)开发 v5版<1>

文章目录 概要整体架构流程技术细节SDK 架构体系概述层级架构智能任务空白项目集成 MSDK新建空白项目新建 MyApplication.kt 文件修改 build.gradle(Module) 文件修改 AndroidManifest.xml 文件修改 MainActivity.kt 文件导入 UXSDK 开源框架4.X 和 5.X 版本差异说明DJIKey差异…...

azkaban介绍

目录 为什么需要工作流调度系统 什么是azkaban azkaban适用场景 azkaban特点 常见的工作流调度系统 azkaban和Ooize特性对比 azkaban的架构 azkaban调度的任务有可能有那些类型 总结 为什么需要工作流调度系统 一个完整的大数据分析系统&#xff0c;必然由很多任务单…...

自学黑客(网络安全)必学内容

随着时代的发展&#xff0c;经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起&#xff0c;线上线下已经打通&#xff0c;虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界&#xff0c;直接影响现实世界的安全。 …...

Java每日一练(20230518) 移除元素、跳跃游戏II、复原IP地址

目录 1. 移除链表元素 &#x1f31f; 2. 跳跃游戏 II &#x1f31f;&#x1f31f; 3. 复原 IP 地址 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 移…...

diff命令和vimdiff命令

文章目录 diff命令基本用法选项示例 vimdiff命令命令格式选项说明常用操作 diff命令 diff命令是一个文本比较工具&#xff0c;用于比较两个文件的内容&#xff0c;它会逐行比较两个文件的内容并输出它们之间的差异。下面是diff命令的常用选项和用法&#xff1a; 基本用法 比…...

AcWing 797.差分(C++)

目录 1.题目描述 2.AC 1.题目描述 797.差分 输入一个长度为 nn 的整数序列。 接下来输入 mm 个操作&#xff0c;每个操作包含三个整数 l,r,cl,r,c&#xff0c;表示将序列中 [l,r][l,r] 之间的每个数加上 cc。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两…...

Python每日一练(20230515) 只出现一次的数字 I\II\III

目录 1. 只出现一次的数字 Single Number 2. 只出现一次的数字 II Single Number II 3. 只出现一次的数字 III Single Number III &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 leetcod…...

基于【EasyDL】【图像分类】实现农作物病害识别小程序

内容、数据集来源:基于飞桨的农作物病害智能识别系统 - 飞桨AI Studio 项目背景 联合国粮食及农业组织的一份报告表明&#xff0c;每年农业生产的自然损失中有三分之一以上是由农业病虫害造成的&#xff0c;使这些成为当前影响农业生产和农业生产的最重要因素。需要考虑的农业…...

元宇宙又“死”了!Epic老板:你当6亿用户是摆设?

“扎克伯格花了数年时间试图让Metaverse成为现实&#xff0c;但现在它已被AI取代&#xff0c;并走向科技创意的坟墓。”一篇表达“元宇宙已死”的文章近期在推特上引发热议&#xff0c;而游戏制作公司Epic Games CEO Tim Sweeney的还击更是让这个话题热上加热。 “搞一次在线守…...

阶段小结2022

工作马上一年&#xff0c;对于一年工作能力提升可能逐步在提升&#xff0c;业务能力也在慢慢提升&#xff0c;虽然没有一年前想象的飞起状态&#xff0c;但是刚接触这一行&#xff0c;希望越来越好。 之前每次的遇到的问题其实都会在笔记或者博客中记录&#xff0c;但是没有整体…...

linux0.12-8-11-vsprintf.c

[383页] 1、 这一小节可以不看代码如何实现&#xff0c;因为标准的C库函数&#xff1b; 2、 等自己看完的这本书&#xff0c;有兴趣过来研究研究也是可以的。 8-11 vsprintf.c程序 8-11-1 功能描述 该程序主要包括vsprintf(),用于对参数产生格式化的输出。由于该函数是C函数…...

Node.js 与 WebAssembly

目录 1、简介 2、关键概念 3、生成WebAssembly模块 4、如何使用它 5、与操作系统交互 1、简介 首先&#xff0c;让我们了解为什么WebAssembly是一个很棒的工具&#xff0c;并学会自己使用它。 WebAssembly是一种类似汇编的高性能语言&#xff0c;可以从各种语言编译&…...

OpenCL编程指南-4.4矢量操作符

矢量操作符 如下描述了可用于矢量数据类型或矢量和标量数据类型组合的各类操作符。 算术操作符 算术操作符&#xff08;加&#xff08;)、减&#xff08;–)、乘&#xff08;*&#xff09;和除&#xff08;/)&#xff09;&#xff0c;可以作用于内置整数、浮点标量和矢量数…...

索洛模型(二)

索洛模型(二) 文章目录 索洛模型(二)[toc]1 事实2 假设2.1 对生产函数的假设2.2对投入要素的假设 3 索洛模型的动态学3.1 k k k的动态学3.2 平衡增长路径 4 储蓄率变化的影响4.1 对产出的影响4.2 对消费的影响 索罗经济增长模型&#xff08;Solow growth model&#xff09;&am…...

【多微电网】基于粒子群优化算法的面向配电网的多微电网协调运行与优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

[具身智能-365]:LeRobot 与 ROS2 的关系,正如 PyTorch 与 Linux 在 AI 系统中的关系。

虽然 ROS2 并非操作系统&#xff0c;但它在机器人领域的**“基础设施地位”与 Linux 在通用计算中的角色高度同构&#xff1b;LeRobot 与 PyTorch 同样都代表“数据驱动的智能生成范式”**。我们可以从四个维度拆解这一类比的深层逻辑&#xff0c;并指出其对具身智能工程实践的…...

YOLOv7实战指南:如何实现高精度与实时性的多任务目标检测

1. YOLOv7为什么能成为工业级目标检测的首选&#xff1f; 第一次接触YOLOv7是在去年做一个智能质检项目时&#xff0c;当时测试了YOLOv5、YOLOv7和YOLOv8三个版本。结果发现YOLOv7在检测微小电子元件缺陷时&#xff0c;准确率比v5高出12%&#xff0c;推理速度却比v8还要快15%。…...

【2026年最新600套毕设项目分享】微信小程序的校园外卖平台(30049)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…...

1414 - 期末考试成绩排名系统设计与实现

1. 为什么需要成绩排名系统 每次期末考试结束后&#xff0c;老师们最头疼的事情之一就是统计和排名学生成绩。想象一下&#xff0c;一个50人的班级&#xff0c;手动计算每个人的分数并排序&#xff0c;不仅耗时耗力&#xff0c;还容易出错。我见过不少老师用Excel表格处理&…...

GitHub新手避坑指南:从Fork到提交PR,手把手教你参与开源项目(含SSH配置全流程)

GitHub开源贡献实战&#xff1a;从零完成第一次PR的全流程解析 第一次参与开源项目就像踏入一个充满活力的开发者社区&#xff0c;既兴奋又忐忑。上周我帮助一位同事提交了他的首个GitHub PR&#xff0c;看着他成功合并代码时的那种成就感&#xff0c;让我决定写下这篇详尽的指…...

CSS如何处理移动端暗色模式适配_通过prefers-color-scheme查询

必须处理系统切换闪烁、颜色变量fallback、第三方组件覆盖三件事&#xff1a;用matchMedia检测初始值并设data-theme类防闪&#xff0c;CSS变量在媒体查询中定义并加默认值&#xff0c;第三方库通过[data-theme]类覆盖且注意选择器优先级。直接结论&#xff1a;用 media (prefe…...

你的终端神器之Oh My Zsh慈

1.安装环境准备 1.1.查看物理内存 [rootaiserver ~]# free -m 1.2.操作系统版本 [rootaiserver ~]# cat /etc/redhat-release 1.3.操作系统内存 [rootaiserver ~]# df -h /dev/shm/ 1.4.磁盘空间 [rootaiserver ~]# df -TH [rootaiserver ~]# df -h /tmp/ [rootaiserver ~]# d…...

DCNv4在YOLOv8中的性能对比实测:Windows环境下的速度提升技巧

DCNv4在YOLOv8中的性能对比实测&#xff1a;Windows环境下的速度提升技巧 最近在部署YOLOv8模型时&#xff0c;我发现DCNv4这个新版本的可变形卷积模块确实带来了显著的性能提升。作为一个长期在Windows平台工作的AI工程师&#xff0c;我想分享一些实战经验&#xff0c;特别是针…...

写段代码教会你什么是HOOK技术?HOOK技术能干什么?谛

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode&#xff0c;现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力&#xff0c;让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中&#xff0c;我们遇到了一个很现实的问…...

图图的嗨丝造相-Z-Image-Turbo部署案例:高校数字艺术课程AI绘图实验平台搭建实践

图图的嗨丝造相-Z-Image-Turbo部署案例&#xff1a;高校数字艺术课程AI绘图实验平台搭建实践 1. 引言&#xff1a;当AI绘图走进艺术课堂 想象一下&#xff0c;在高校的数字艺术设计课上&#xff0c;学生们不再仅仅学习传统的Photoshop或手绘板技巧。他们打开浏览器&#xff0…...