防止跨站脚本攻击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.mzph.cn/pingmian/37468.shtml

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

相关文章

这是我见过的大模型 RAG 优化方案与实践最全总结了

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

软件工程 例题

用例图 1. 某个学生成绩管理系统的部分参与者和用例总结如下。 教务管理人员: 登录系统教师、学生名单管理学期教学计划管理成绩管理。课程分配&#xff0c;每次课程分配时都必须打印任课通知书 学生&#xff1a; 登录系统选课。 教师: 登录系统成绩管理&#xff0c;并…

Query Rewriting for Retrieval-Augmented Large Language Models

文章目录 题目摘要方法实验 题目 检索增强大语言模型的查询重写 论文地址&#xff1a;https://arxiv.org/abs/2305.14283 项目地址&#xff1a;https://github.com/xbmxb/RAG-query-rewriting 摘要 大语言模型&#xff08;LLM&#xff09;在检索--然后阅读&#xff08;retriev…

百度智能云升级:接入33个大模型,Llama 2引领创新,103个Prompt模板上线

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

鉴源实验室·基于MQTT协议的模糊测试研究

作者 | 张渊策 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 随着物联网技术的快速发展&#xff0c;越来越多的设备加入到互联网中&#xff0c;形成了庞大的物联网系统。这些设备之间的通信…

2024年每个月有哪些数学建模和数学挖掘竞赛?

文章目录 2024年每个月有哪些竞赛&#xff1f;2024年32个数学建模和数据挖掘竞赛重磅来袭&#xff01;&#xff01;&#xff01;2024年数学建模和数学挖掘竞赛时间目录汇总数学建模助手使用一月二月三月四月五月六月七月八月九月十月十一月十二月 原文&#xff1a;https://blog…

最新!最全!元启发优化算法215个测试函数综述!【免费获取论文】

目录 1.摘要2.主要内容3.参考文献4.文章获取 1.摘要 这篇综述论文旨在利用对不同基准测试函数的研究&#xff0c;评估元启发优化算法(Metaheuristic optimization algorithms, MH)的性能。MH的性能是通过不同的数学基准测试函数和各种实际工程设计问题来评估&#xff0c;这些基…

[数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3316 标注数量(xml文件个数)&#xff1a;3316 标注数量(txt文件个数)&#xff1a;3316 标注…

stm32-hal库(5)--usart串口通信三种模式(主从通信)(关于通信失败和串口不断发送数据问题的解决)

问题&#xff1a; 最近发现&#xff0c;stm32cubemx最新版本f1系列的hal库&#xff08;1.85版本&#xff09;生成的hal库&#xff0c;其中stm32f1xx_hal_uart.c的库文件中&#xff0c;其串口发送接收存在一些问题&#xff1a; 1.没有使用 __HAL_LOCK 和 __HAL_UNLOCK 宏&…

开源大模型RAG企业本地知识库问答机器人-ChatWiki

ChatWiki ChatWiki是一款开源的知识库 AI 问答系统。系统基于大语言模型&#xff08;LLM &#xff09;和检索增强生成&#xff08;RAG&#xff09;技术构建&#xff0c;提供开箱即用的数据处理、模型调用等能力&#xff0c;可以帮助企业快速搭建自己的知识库 AI 问答系统。 开…

vue使用glide.js实现轮播图(可直接复制使用)

效果图 可以实现自动轮播&#xff0c;3种切换方式&#xff1a;直接滑动图片、点击两侧按钮、点击底部按钮 体验链接:http://website.livequeen.top 实现 一、引入依赖 1、控制台引入依赖 npm install glidejs/glide 2、在css中引用 <style scoped> import glidejs/g…

.net 项目中配置 Swagger

一、前言 二、Swagger 三、.net 项目中添加Swagger 1、准备工作 &#xff08;1&#xff09;.net项目 &#xff08;2&#xff09;SwaggerController &#xff08;3&#xff09;XML文档注释 2、安装Swagger包 3、 添加配置swagger中间件 &#xff08;1&#xff09;添加S…

uniapp, ‍[⁠TypeError⁠]‍ “Failed to fetch dynamically imported module“ 报错解决思路

文章目录 1. 背景2. 报错3. 解决思路4. 思考参考1. 背景 最近基于uniapp开发一款设备参数调试的APP软件,在使用第三方插件的过程中,出现下面的报错。 2. 报错 [plugin:vite:import-analysis] Cannot find module ‘D:/leaning/uniapp/demo/jk-uts-udp示例/uni_modules/uts-…

对于CDA一级考试该咋准备??!

一、了解考试内容和结构 CDA一级考试主要涉及的内容包括&#xff1a;数据分析概述与职业操守、数据结构、数据库基础与数据模型、数据可视化分析与报表制作、Power BI应用、业务数据分析与报告编写等。 CDA Level Ⅰ 认证考试大纲:https://edu.cda.cn/group/4/thread/174335 …

C++精解【9】

文章目录 大整数GMP概述GMP安装 [cygwin](https://cygwin.com/install.html)安装 gmpexample Eigen基本属性和运算 大整数GMP 概述 GMP GMP是一个用于任意精度算术的免费库&#xff0c;可对有符号整数、有理数和浮点数进行操作。除了运行GMP的机器的可用内存所暗示的精度外&…

expandtabs()方法——tab符号转为空格

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 expandtabs()方法把字符串中的tab&#xff08;\t&#xff09;符号转为空格&#xff0c;tab&#xff08;\t&#xff09;符号默认的空格数是…

简单科普-GPT到底是什么?

1.ChatGPT ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是OpenAI研发的一款聊天机器人程序 &#xff0c;于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见…

MATLAB2024a下的神经网络聚类工具箱聚类

1 打开神经网络聚类工具箱GUI界面 图1-1 2 导入训练数据 图2-1 导入训练集如图2-2&#xff0c;图2-3、图2-4所示 图2-2 图2-3 图2-4 如图2-4&#xff0c;确认无误点击确定 3 模型训练 如图3-1&#xff0c;调整验证集与测试集比例及映射大小后点击”训练“&#xff0c;开始训练…

uview文本框组件计数count报错u--textarea

报错内容&#xff1a; [Vue warn]: Error in render: “TypeError: Cannot read property ‘length’ of null” found in —> at uni_modules/uview-ui/components/u-textarea/u-textarea.vue at uni_modules/uview-ui/components/u–textarea/u–textarea.vue mp.runtime.…

浪潮信息AIStation与毕昇:让AI大模型开发变得更易用

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着世界。近日&#xff0c;毕昇大模型应用开发平台和浪潮信息AIStation智能业务生产创新平台完成兼容性互认证。二者的融合&#xff0c;不仅简化了大模型定制开发的流程&#xff…