防止跨站脚本攻击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),这种方式不仅减少了代码量,还提高了开发和维护的效率。

希望本次分享的内容能够为您在文本处理方面提供一些新的思路和方法。感谢您的阅读,期待与您共同探讨更多有趣的技术话题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368042.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年上半年典型网络攻击事件汇总

文章目录 前言一、Ivanti VPN 的0 Day攻击(2024年1月)二、微软公司高管账户泄露攻击(2024年1月)三、Change Healthcare网络攻击(2024年2月)四、ConnectWise ScreenConnect漏洞利用攻击(2024年2月)五、XZ Utils软件供应链攻击(2024年3月)六、AT&T数据泄露攻击(20…

【产品经理】订单处理11-订单修改场景梳理

为了应对订单修改的场景&#xff0c;电商ERP系统应该如何设计相应模块&#xff1f; 电商ERP系统&#xff0c;经常遇到需要修改订单的情况&#xff0c;修改订单主要以下几种场景&#xff1a; 一、修改商品 修改商品&#xff0c;包括对正常商品的换货、以及对赠品的增删改。 1…

docker安装ElasticSearchKibana

本文参考以下两篇文章 ✅ElasticSearch&Kibana 部署 云效 Thoughts 企业级知识库 (aliyun.com) docker安装ElasticSearch&Kibana - 飞书 安装elasticsearch 使用docker下载es&#xff1a; docker pull elasticsearch:8.13.0 挂载配置 创建挂在文件目录 mkdir…

无人机企业需要什么资质?

无人机企业所需的资质主要可以分为几大类&#xff0c;以确保其合法、安全、高效地进行相关业务活动。以下是对这些资质的详细解释和归纳&#xff1a; 1. 基础企业资质&#xff1a; - 工商营业执照&#xff1a;这是企业合法经营的基本证书&#xff0c;所有企业都需要取得。无人…

是霍尼韦尔还是柏曼啊??书客、霍尼、柏曼三款护眼大路灯横向PK!

是霍尼韦尔还是柏曼啊&#xff1f;&#xff1f;近年来市面上的劣质护眼大路灯越来越多&#xff0c;很容易使我们选到劣质产品。为了解决这一问题&#xff0c;我自费购买了多个品牌的护眼大路灯进行测评。经过深入研究&#xff0c;我发现市面上确实存在一些光线不稳定、选材做工…

指挥中心操作台的形状及空间布局

在现代化的指挥中心&#xff0c;操作台的形状设计至关重要&#xff0c;它不仅影响着操作人员的工作效率和舒适度&#xff0c;还关系到整个指挥系统的运行效果。常见的指挥中心操作台形状多种多样&#xff0c;以满足不同的功能需求和空间布局。 直线型操作台 直线型操作台是最为…

用python画蜡笔小新

代码地址: https://pan.quark.cn/s/6ae646d2fef3

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域&#xff0c;随着技术的飞速发展和智能设备的普及&#xff0c;将先进的计算机视觉技术集成到移动平台&#xff0c;特别是Android系统中&#xff0c;已成为提升用户体验、拓展应用功能的关键。其中&#xff0c;目标检测与人脸识别作为计算机视…

Panmnesia发布CXL协议 允许AI GPU以最小的延迟利用各类内存

韩国 科学技术院&#xff08;KAIST&#xff09;的一家初创公司Panmnesia推出了一种尖端 IP&#xff0c;可通过 PCIe 上的 CXL 协议为人工智能 GPU 添加外部存储器&#xff0c;从而打破了存储器容量的障碍&#xff0c;提供有效的基础设施来解决 HBM 的局限性。 目前的人工智能加…

超快的 Python 包管理工具「GitHub 热点速览」

天下武功&#xff0c;无坚不破&#xff0c;唯快不破&#xff01; 要想赢得程序员的欢心&#xff0c;工具的速度至关重要。仅需这一优势&#xff0c;即可使其在众多竞争对手中脱颖而出&#xff0c;迅速赢得开发者的偏爱。以这款号称下一代极速 Python 包管理工具——uv 为例&…

利用DeepFlow解决APISIX故障诊断中的方向偏差问题

概要&#xff1a;随着APISIX作为IT应用系统入口的普及&#xff0c;其故障定位能力的不足导致了在业务故障诊断中&#xff0c;APISIX常常成为首要的“嫌疑对象”。这不仅导致了“兴师动众”式的资源投入&#xff0c;还可能使诊断方向“背道而驰”&#xff0c;从而导致业务故障“…

网站显示不安全怎么解决

网站显示不安全通常表现为浏览器地址栏中出现“不安全”字样或红色感叹号&#xff0c;这意味着用户的个人信息、登录凭证和其他敏感数据可能面临风险。以下是一些步骤和建议&#xff1a; 1、检查URL是否以HTTPS开头&#xff1a; 确保你访问的网址是以https://开头&#xff0c;而…

go-redis源码解析:cluster模式如何选择节点

1. 如何选择节点 1.1. 确定slot 1.1.1. 通过cmdSlot方法确定在哪个槽上, 这一步只是本地计算 首先入口方法_process&#xff0c;先通过cmdSlot方法用key计算此次应该落在哪个槽上 通过crc16sum算法计算key应该属于哪个槽&#xff0c;slotNumber为16384 func Slot(key strin…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母&#xff0c;回显 evil input 查看源码&#xff0c;发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz&#xff1a; 发现过滤掉了数字和小写字母以及一些符号&#xff0c;下面框起来的部分是可用的 结合题目提…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

Facebook:数字社交的引领者与创新者

自2004年诞生以来&#xff0c;Facebook从一个校园网络项目迅速成长为全球最大的社交媒体平台&#xff0c;彻底改变了我们与世界互动的方式。作为数字社交的引领者和创新者&#xff0c;Facebook不仅在技术层面上不断突破&#xff0c;也在社会和文化领域留下了深刻的印记。本文将…

如何对GD32 MCU进行加密?

GD32 MCU有哪些加密方法呢&#xff1f;大家在平时项目开发的过程中&#xff0c;最后都可能会面临如何对出厂产品的MCU代码进行加密&#xff0c;避免产品流向市场被别人读取复制。 下面为大家介绍GD32 MCU所支持的几种常用的加密方法&#xff1a; 首先GD32 MCU本身支持防硬开盖…

Flutter第十五弹 Flutter插件

目标&#xff1a; 1.Flutter插件是什么&#xff1f;有什么作用&#xff1f; 插件 (plugin) 是 package 的一种&#xff0c;全称是 plugin package&#xff0c;我们简称为 plugin&#xff0c;中文叫插件。 2.怎么创建Flutter插件&#xff1f; 一、什么是插件 在flutter中&am…

mysql逗号分割字符串“1,2,3”实现in查询

数据示例 前台单值参数实现in查询 主要函数FIND_IN_SET 该函数的作用是查询字段(strlist) 中是否包含(str)的结果&#xff0c;返回结果为 null或记录 select id,recommend_position_id from t_stk_task where FIND_IN_SET(359919,recommend_position_id)查询效果 前台集…

vue3单个页面进行防抖节流

防抖 <template><button id"submitButton" ref"submitButton">GET</button> </template><script lang"ts" setup> import { ref, onMounted } from vue;// 防抖函数 function debounce(func: () > void, dela…