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

防止跨站脚本攻击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

目录 一、什么是跨站脚本攻击&#xff08;XSS&#xff09; 二、通常有哪些解决方案 三、常见的XSS攻击例子有哪些 3.1 存储型XSS攻击&#xff08;黑产恶意截流&#xff0c;跳转不法网站&#xff09; 3.2反射型XSS攻击&#xff1a; 四、什么是跨站请求伪造&#xff1f; 五…...

Python爬虫实战案例——王者荣耀皮肤抓取

大家好&#xff0c;我是你们的老朋友——南枫&#xff0c;今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩&#xff0c;直接上代码&#xff1a; 导入我们需要使用到的&#xff0c;也是唯一用到的库&#xff1a; 我们要抓取皮肤其…...

PyTorch计算机视觉实战:目标检测、图像处理与深度学习

本书基于真实数据集&#xff0c;全面系统地阐述现代计算机视觉实用技术、方法和实践&#xff0c;涵盖50多个计算机视觉问题。全书分为四部分&#xff1a;一部分介绍神经网络和PyTorch的基础知识&#xff0c;以及如何使用PyTorch构建并训练神经网络&#xff0c;包括输入数据缩放…...

4D 生物打印:将时间维度融入,打造个性化动态组织

4D 生物打印技术将时间维度融入 3D 生物打印&#xff0c;赋予打印出的结构动态变化的能力&#xff0c;使其更接近于真实组织和器官的特性。要实现这一目标&#xff0c;需要使用智能生物材料和智能设计策略。 智能生物材料 目前用于 4D 生物打印的智能生物材料主要包括形状记忆…...

银行清算业务功能测试解析

银行清算业务是指银行间通过账户或有关货币当地清算系统&#xff0c;在办理结算和支付中用以清讫双边或多边债权债务的过程和方法。按地域划分&#xff0c;清算业务可分为国内联行清算和国际清算。常见的清算模式包括实时全额清算、净额批量清算、大额资金转账系统及小额定时清…...

CVE-2024-6387漏洞预警:尽快升级OpenSSH

OpenSSH维护者发布了安全更新&#xff0c;其中包含一个严重的安全漏洞&#xff0c;该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion&#xff0c;CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件&#xff08;也…...

学习整理在php中使用PHPExcel读取excel表列数大于Z时读取不到的解决方案

php读取excel列数大于Z时读取不到 背景解决方案关键代码 背景 表格数据超过26列&#xff0c; 也就是在Z列之前没有AA列及以后的情况&#xff0c; 测试一直都没有问题&#xff0c;超过&#xff0c;就会获取不到数据了 解决方案 private function getExcelData(){//获取excel文…...

python sklearn机械学习-数据预处理

&#x1f308;所属专栏&#xff1a;【机械学习】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您…...

搜索引擎常用语法

引号 (" "): 用双引号将词组括起来&#xff0c;搜索引擎将返回包含完全相同短语的结果。 示例&#xff1a;"人工智能发展趋势" 减号 (-): 在关键词前加上减号可以排除包含特定词语的结果。 示例&#xff1a;人工智能 -机器学习&#xff08;排除包含 “机器…...

华为智能驾驶方案剖析

华为ADS智驾方案始终坚持激光雷达毫米波雷达摄像头的多传感器融合路线&#xff0c;行业降本压力下硬件配置从超配逐步转向贴合实际需求&#xff0c;带动整体硬件成本下降。 1)单车传感器数量呈现下降趋势&#xff0c;包括激光雷达从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的基础&#xff0c;在学习DDR3之前&#xff0c;我们先来学习一下SDRAM的相关知识。 1 SDRAM …...

Eureka与Spring Cloud Bus的协同:打造智能服务发现新篇章

Eureka与Spring Cloud Bus的协同&#xff1a;打造智能服务发现新篇章 在微服务架构中&#xff0c;服务发现是实现服务间通信的关键机制。Eureka作为Netflix开源的服务发现框架&#xff0c;与Spring Cloud Bus的集成&#xff0c;提供了一种动态、响应式的服务治理解决方案。本文…...

Kafka入门到精通(三)-Kafka

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xf…...

高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中&#xff0c;教学质量是培养优秀人才的关键。为了提高教学质量&#xff0c;高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架&#xff0c;旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架&#xff0c;具…...

币界网讯,预计以太坊现货 ETF 将于 7 月中旬推出

刚刚 ETF Store 总裁 Nate Geraci 在 X &#xff08;前Twitter&#xff09;平台上宣布&#xff0c;备受数字货币市场期待的SEC以太坊现货 ETF提案&#xff0c;将于7 月中旬通过美国证券交易委员会&#xff08;SEC&#xff09;批准。Nate Geraci透露修订后的 S-1 文件将于 7 月 …...

【FFmpeg】avio_open2函数

【FFmpeg】avio_open2函数 1.avio_open21.1 创建URLContext&#xff08;ffurl_open_whitelist&#xff09;1.1.1 创建URLContext&#xff08;ffurl_alloc&#xff09;1.1.1.1 查找合适的protocol&#xff08;url_find_protocol&#xff09;1.1.1.2 为查找到的URLProtocol创建UR…...

技术成神之路:设计模式(二)建造者模式

1.定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你分步骤创建复杂对象&#xff0c;而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…...

基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

爬虫scrapy库精简使用大全

一、基本命令 创建项目 scrpay startproject myapp创建爬虫文件 scrapy genspider spider_name "https://www.baidu.com"运行爬虫文件 scrapy crawl spider_name一、使用代理ip 打开中间件middlewares.py&#xff0c;增加以下代码 class ProxyMiddleware:def process…...

Qt - 如何在新线程 (QThread)中使用一个进程 (QProcess)?

在Qt中&#xff0c;QThread 用于处理后台任务&#xff0c;而 QProcess 用于启动和管理外部程序。如果你想在一个新的 QThread 中使用 QProcess&#xff0c;你需要了解 QProcess 并不是专门为在特定线程中运行而设计的。实际上&#xff0c;QProcess 通常在创建它的线程&#xff…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...