防止跨站脚本攻击XSS之Antisamy
目录
一、什么是跨站脚本攻击(XSS)
二、通常有哪些解决方案
三、常见的XSS攻击例子有哪些
3.1 存储型XSS攻击(黑产恶意截流,跳转不法网站)
3.2反射型XSS攻击:
四、什么是跨站请求伪造?
五、常用跨站请求伪造解决方案有哪些
六、Springboot3.x整合Antisamy解决存储型XSS攻击
6.0 需求描述
6.1 Antisamy和Jsoup选型
6.2 Antisamy整合Springboot3.x详细步骤
第一步:引入pom.xml
第二步:根据源码中的xml文件,自定义自己需要的
第三步:将xml文件加载进Spring容器中
第四步:因Antisamy处理过文本后,会默认在标签最后加入\n ,所以加入这步骤去除\n
第五步:方法调用
第六步:方法调用中的后处理
一、什么是跨站脚本攻击(XSS)
XSS攻击是指攻击者将恶意脚本注入到Web页面中,当用户访问被注入的页面时
恶意脚本会在用户浏览器中执行从而窃取用户的敏感信息或进行其他恶意操作。
二、通常有哪些解决方案
对用户输入进行有效的过滤和验证,特别是在展示用户输入内容时。
使用安全的编码机制,如HTML编码和URL编码。
对Cookie设置HttpOnly属性,限制脚本访问敏感信息。
阻止不受信任的域名或URL的内容插入到页面中
三、常见的XSS攻击例子有哪些
3.1 存储型XSS攻击(黑产恶意截流,跳转不法网站)
攻击者将恶意脚本存储在目标网站的数据库中,当其他用户访问包含该恶意脚本的页面时,脚本会被执行
这种攻击利用了网站对用户输入的不当处理,比如某个商品的评论列表,用户进入这个页面则自动跳去其他页面
<script>
var maliciousCode = 'alert("你的账户信息已被攻击,请输入密码并发送给攻击者:")';
// 假设这里是漏洞存在的页面,用户的输入没有进行过滤或转义
var userInput = 'Hello, ' + maliciousCode;
document.getElementById('content').innerHTML = userInput; // 恶意脚本被存储并执行
</script>
3.2反射型XSS攻击
攻击者通过诱使受害者点击包含恶意脚本的特制链接,将恶意脚本作为参数传递给目标网站
网站在返回响应时会将恶意脚本包含在其中,并被浏览器执行
<!-- 假设这里是漏洞存在的搜索页面,用户的输入没有进行过滤或转义 -->
<form action="/search" method="GET">
<input type="text" name="query" value="">
<button type="submit">搜索</button>
</form><!-- 攻击者构造的恶意链接 -->
<a href="/search?query=<script>alert('你的账户信息已被攻击,请输入密码并发送给攻击者:')</script>">点击此处获取免费礼品</a>
四、什么是跨站请求伪造?
跨站请求伪造(Cross-Site Request Forgery,CSRF),是一种利用受信任的用户身份执行未经授权的操作的攻击方式。
攻击者通过伪造请求,利用用户在目标网站中的登录状态来执行恶意操作或窃取用户的敏感信息
五、常用跨站请求伪造解决方案有哪些
引入CSRF令牌(token),并将其包含到表单或请求中,校验Referer头部,确保请求来自合法的来源。
String csrfToken = UUID.randomUUID().toString();
response.addCookie(CookieUtil.generateCookie("_csrf_", csrfToken));
使用验证码、双因素身份验证、HTTPS等也是增加安全性的有效措施,以确保用户与目标网站的交互是安全和可信的
启用SameSite属性,限制Cookie的发送,防止未经用户许可的跨站请求。
六、Springboot3.x整合Antisamy解决存储型XSS攻击
6.0 需求描述
支持对输入的文本内容支持自定义标签属性拦截(比如 输入的内容中不可以包含BUTTON、INPUT)
支持对输入内容进行正则过滤(比如 img标签中 文件地址只可以是jpg后缀结尾的)
6.1 Antisamy和Jsoup选型
Antisamy是什么?
AntiSamy是一个开源的Java库,主要用于防止跨站脚本攻击(XSS)和CSS注入攻击。它通过对用户输入的HTML和CSS进行验证和清理,确保其中不包含恶意代码
Jsoup是什么?
Jsoup是一个用于处理HTML的Java库,它提供了非常方便的API,允许用户解析、修改和清理HTML文档。Jsoup专注于HTML的解析和操作,而不直接涉及安全性验证。
单纯从标签的转义拦截上,2者都是可以的,当前需求中包含正则过滤等要求,使用Jsoup实现比较麻烦,需要二次代码覆盖开发,固调研后采用Antisamy。
6.2 Antisamy整合Springboot3.x详细步骤
Antisamy源码地址:https://github.com/nahsra/antisamy/tree/v1.7.5
第一步:引入pom.xml
<dependency><groupId>org.owasp.antisamy</groupId><artifactId>antisamy</artifactId><version>1.7.5</version></dependency>
第二步:根据源码中的xml文件,自定义自己需要的

本博文中的xml是最基础的,仅作参考样例使用,需要了解配置详情的可以去其它博文或者官网查看,本文重点在整合SpringBoot3.x
<?xml version="1.0" encoding="ISO-8859-1"?><!-- W3C rules retrieved from: http://www.w3.org/TR/html401/struct/global.html --><!-- Slashdot allowed tags taken from "Reply" page: <b> <i> <p> <br> <a> <ol> <ul> <li> <dl> <dt> <dd> <em> <strong> <tt> <blockquote> <div><ecode> <quote> --><anti-samy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="antisamy.xsd"><directives><directive name="omitXmlDeclaration" value="true" /><directive name="omitDoctypeDeclaration" value="true" /><directive name="maxInputSize" value="5000" /><directive name="formatOutput" value="true" /><directive name="embedStyleSheets" value="false" /></directives><common-regexps><regexp name="imgTypes"value="^.*\.(gif|jpg|jpeg|png)$" /><regexp name="anything" value=".*" /></common-regexps><common-attributes><attribute name="abbr"><regexp-list><regexp name="anything" /></regexp-list></attribute>//除了abbr属性之外,其余都会被转义删除</common-attributes><global-tag-attributes><attribute name="abbr" /></global-tag-attributes><tags-to-encode></tags-to-encode>
<!-- tag-rules The configured label is allowed to pass--><tag-rules><tag name="a" action="validate" />//除这里面配置的标签之外,其余都会被转义删除<tag name="img" action="validate"> //img标签的src中 文件后缀只能是gif|jpg|jpeg|png配置之一<attribute name="src"><regexp-list><regexp name="imgTypes" /></regexp-list></attribute></tag></tag-rules><css-rules></css-rules><!-- allowed-empty-tags Allow the tag to be empty, allow the tag inside the attribute does not belong to the tag, this case will not be escaped and deleted--><allowed-empty-tags><literal-list><literal value="a" /></literal-list></allowed-empty-tags></anti-samy-rules>
第三步:将xml文件加载进Spring容器中
@Configuration
public class AntiSamyConfig {@Beanpublic AntiSamyContent antiSamyBean() throws Exception{try (InputStream inputStream = getClass().getResourceAsStream("/antisamy175/antisamy_custom.xml")) {Policy policy = Policy.getInstance(inputStream);return new AntiSamyContent (policy);}}
}
注意文件存放路径,resources目录下建个 antisamy175 文件夹。再将xml放进去
第四步:因Antisamy处理过文本后,会默认在标签最后加入\n ,所以加入这步骤去除\n
public class AntiSamyOutputFormatter extends AntiSamySAXScanner {public AntiSamyOutputFormatter (Policy policy) {super(policy);}@Overrideprotected OutputFormat getOutputFormat() {OutputFormat format = super.getOutputFormat();format.setLineSeparator("");//这是为了去除antisamy处理后在每行结尾自动匹配的\nreturn format;}}public class AntiSamyContent extends AntiSamy {private Policy policy = null;public AntiSamyContent (Policy policy) {super(policy);this.policy = policy;}public CleanResults scanMeetingAgenda(String taintedHTML) throws ScanException {return (new AntiSamyOutputFormatter (this.policy)).scan(taintedHTML);}
}
第五步:方法调用
htmlSanitizerService.sanitizeHtml(str);
第六步:方法调用中的后处理
antisamy处理结果,在实际页面展示时,会存在换行 回车等问题,注重回显的需要对这块做额外的处理。
@Service
public class HtmlSanitizerService {private AntiSamyContent antiSamy;@Autowiredpublic HtmlSanitizerService(AntiSamyContent antiSamy) {this.antiSamy = antiSamy;}public String sanitizeHtml(String sourceStr) {String cleanStr = sourceStr;try{CleanResults cr = antiSamy.scanMeetingAgenda(sourceStr);cleanStr = cr.getCleanHTML();}catch (ScanException e){}return cleanStr;}
}
至此,本次分享已结束。提及的文本过滤方式,其最大的亮点在于其直观性和灵活性。我们无需编写冗长的Java代码逻辑,而是可以直接通过修改XML配置文件来实现文本内容的过滤。更值得一提的是,XML内部支持正则表达式的使用,这使得过滤规则的设置变得更加简洁高效。相较于传统的文本处理库(如jsoup),这种方式不仅减少了代码量,还提高了开发和维护的效率。
希望本次分享的内容能够为您在文本处理方面提供一些新的思路和方法。感谢您的阅读,期待与您共同探讨更多有趣的技术话题!
相关文章:
防止跨站脚本攻击XSS之Antisamy
目录 一、什么是跨站脚本攻击(XSS) 二、通常有哪些解决方案 三、常见的XSS攻击例子有哪些 3.1 存储型XSS攻击(黑产恶意截流,跳转不法网站) 3.2反射型XSS攻击: 四、什么是跨站请求伪造? 五…...
Python爬虫实战案例——王者荣耀皮肤抓取
大家好,我是你们的老朋友——南枫,今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩,直接上代码: 导入我们需要使用到的,也是唯一用到的库: 我们要抓取皮肤其…...
PyTorch计算机视觉实战:目标检测、图像处理与深度学习
本书基于真实数据集,全面系统地阐述现代计算机视觉实用技术、方法和实践,涵盖50多个计算机视觉问题。全书分为四部分:一部分介绍神经网络和PyTorch的基础知识,以及如何使用PyTorch构建并训练神经网络,包括输入数据缩放…...
4D 生物打印:将时间维度融入,打造个性化动态组织
4D 生物打印技术将时间维度融入 3D 生物打印,赋予打印出的结构动态变化的能力,使其更接近于真实组织和器官的特性。要实现这一目标,需要使用智能生物材料和智能设计策略。 智能生物材料 目前用于 4D 生物打印的智能生物材料主要包括形状记忆…...
银行清算业务功能测试解析
银行清算业务是指银行间通过账户或有关货币当地清算系统,在办理结算和支付中用以清讫双边或多边债权债务的过程和方法。按地域划分,清算业务可分为国内联行清算和国际清算。常见的清算模式包括实时全额清算、净额批量清算、大额资金转账系统及小额定时清…...
CVE-2024-6387漏洞预警:尽快升级OpenSSH
OpenSSH维护者发布了安全更新,其中包含一个严重的安全漏洞,该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion,CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件(也…...
学习整理在php中使用PHPExcel读取excel表列数大于Z时读取不到的解决方案
php读取excel列数大于Z时读取不到 背景解决方案关键代码 背景 表格数据超过26列, 也就是在Z列之前没有AA列及以后的情况, 测试一直都没有问题,超过,就会获取不到数据了 解决方案 private function getExcelData(){//获取excel文…...
python sklearn机械学习-数据预处理
🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…...
搜索引擎常用语法
引号 (" "): 用双引号将词组括起来,搜索引擎将返回包含完全相同短语的结果。 示例:"人工智能发展趋势" 减号 (-): 在关键词前加上减号可以排除包含特定词语的结果。 示例:人工智能 -机器学习(排除包含 “机器…...
华为智能驾驶方案剖析
华为ADS智驾方案始终坚持激光雷达毫米波雷达摄像头的多传感器融合路线,行业降本压力下硬件配置从超配逐步转向贴合实际需求,带动整体硬件成本下降。 1)单车传感器数量呈现下降趋势,包括激光雷达从3个减配至1个、毫米波雷达从6R减配至3R、摄像…...
DDR3(一)
目录 1 SDRAM1.1 同步动态随机存储器1.2 位宽1.3 SDRAM结构1.4 SDRAM引脚图 2 SDRAM操作指令2.1 读写指令2.2 刷新和预充电2.3 配置模式寄存器2.4 读/写突发2.5 数据屏蔽 SDRAM是DDR3的基础,在学习DDR3之前,我们先来学习一下SDRAM的相关知识。 1 SDRAM …...
Eureka与Spring Cloud Bus的协同:打造智能服务发现新篇章
Eureka与Spring Cloud Bus的协同:打造智能服务发现新篇章 在微服务架构中,服务发现是实现服务间通信的关键机制。Eureka作为Netflix开源的服务发现框架,与Spring Cloud Bus的集成,提供了一种动态、响应式的服务治理解决方案。本文…...
Kafka入门到精通(三)-Kafka
Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动…...
高校教师教学质量评估系统-计算机毕业设计源码03344
摘要 在高等教育中,教学质量是培养优秀人才的关键。为了提高教学质量,高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架,旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架,具…...
币界网讯,预计以太坊现货 ETF 将于 7 月中旬推出
刚刚 ETF Store 总裁 Nate Geraci 在 X (前Twitter)平台上宣布,备受数字货币市场期待的SEC以太坊现货 ETF提案,将于7 月中旬通过美国证券交易委员会(SEC)批准。Nate Geraci透露修订后的 S-1 文件将于 7 月 …...
【FFmpeg】avio_open2函数
【FFmpeg】avio_open2函数 1.avio_open21.1 创建URLContext(ffurl_open_whitelist)1.1.1 创建URLContext(ffurl_alloc)1.1.1.1 查找合适的protocol(url_find_protocol)1.1.1.2 为查找到的URLProtocol创建UR…...
技术成神之路:设计模式(二)建造者模式
1.定义 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…...
基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
爬虫scrapy库精简使用大全
一、基本命令 创建项目 scrpay startproject myapp创建爬虫文件 scrapy genspider spider_name "https://www.baidu.com"运行爬虫文件 scrapy crawl spider_name一、使用代理ip 打开中间件middlewares.py,增加以下代码 class ProxyMiddleware:def process…...
Qt - 如何在新线程 (QThread)中使用一个进程 (QProcess)?
在Qt中,QThread 用于处理后台任务,而 QProcess 用于启动和管理外部程序。如果你想在一个新的 QThread 中使用 QProcess,你需要了解 QProcess 并不是专门为在特定线程中运行而设计的。实际上,QProcess 通常在创建它的线程ÿ…...
量子计算中Loschmidt回声相位测量的创新方法
1. 量子计算中的Loschmidt回声相位测量方法概述Loschmidt回声是量子动力学中一个重要的概念,它描述了量子系统在时间反演演化后与初始状态的相似程度。在量子计算领域,精确测量Loschmidt回声的相位信息对于理解量子系统的非平衡态行为、计算能量本征值以…...
告别网盘客户端!用Alist+RaiDrive把百度云盘变成电脑本地文件夹(保姆级图文教程)
用AlistRaiDrive实现网盘本地化管理的终极方案 你是否厌倦了电脑上安装多个网盘客户端,不仅占用系统资源,操作还繁琐割裂?每次上传下载文件都要在不同客户端间切换,效率低下。现在,通过Alist和RaiDrive的组合…...
Transient、QuickEye、VerifyEye傻傻分不清?一文讲透Ansys里三种眼图仿真方法的适用场景与避坑指南
Transient、QuickEye、VerifyEye深度解析:Ansys眼图仿真技术选型实战指南 在高速数字系统设计中,眼图分析是评估信号完整性的黄金标准。面对Ansys工具链中三种截然不同的眼图生成方法,工程师常常陷入选择困境——是追求精确度的传统瞬态分析&…...
YOLOv8晶圆体缺识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)
摘要 晶圆制造过程中的缺陷检测是保证芯片良率的关键环节。本文基于YOLOv8目标检测算法,构建了一套针对晶圆表面9类典型缺陷的自动检测系统。所识别的缺陷类型包括:Center、Donut、Edge-Loc、Edge-Ring、Loc、Near-full、None、Random、Scratch。模型在…...
学习日志(三)【php语法学习,iscc校赛wp】
1. 任务 1.1.1.1.1.1. 知识部分 rce看【之前的笔记?】php的知识点学习继续jwt token好像是比赛的题目考察内容,我看看php伪协议 1.1.1.1.1.2. 题目 参加iscc比赛【五一】rce题目 1.1.1.1.1.3. 环境配置 把vscode搞好,上学期没有把Php配…...
JS中forEach与普通for
for就不用说了,最普通的循环函数forEach1. 只写 1 个参数只接收当前遍历元素let arr [10,20,30] arr.forEach(item > {console.log(item) // 依次 10、20、30 })2. 写 2 个参数依次接收元素值、下标索引let arr [10,20,30] arr.forEach((item, index) > {co…...
独立开发者利用taotoken模型广场为不同任务选择性价比最优模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者利用taotoken模型广场为不同任务选择性价比最优模型 对于独立开发者而言,在有限的预算内高效完成多样化的开…...
NPU跑LLM实战指南:KV Cache动态性如何突破硬件限制
NPU跑LLM实战指南:KV Cache动态性如何突破硬件限制 副标题: 从预分配+Attention Mask到三层软件栈,完整解析NPU推理架构 痛点:为什么NPU跑LLM这么难? LLM的生成机制和NPU的硬件特性存在根本冲突: LLM特性 NPU特性 冲突点 逐token生成 固定shape执行 KV Cache动态增长 动…...
具身智能的发展对人类社会的影响有哪些?
具身智能对人类社会影响一、经济产业层面产业重构:催生机器人、智能制造、自动驾驶新产业,重塑生产链条效率跃升:替代重复繁重劳作,工厂、农业、物流产能大幅提升就业结构变化:低端体力岗位缩减,运维、研发…...
红外信号逆向工程:破解电磁炉协议实现抽油烟机智能联动
1. 项目概述:当电磁炉与抽油烟机“对话”厨房里的自动化,听起来像是未来智能家居的专属,但其实很多乐趣和便利就藏在身边已有的设备里。我最近给家里的厨房换上了一台新的电磁炉,在翻阅说明书时,偶然发现了一个名为“h…...
