防止跨站脚本攻击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 通常在创建它的线程ÿ…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...