XSS攻击

简介: XSS攻击利用网站对用户输入过滤不足,将恶意脚本注入网页,用户访问时执行,可盗取cookie、数据或劫持操作。主要分反射型(通过URL注入)和存储型(存入数据库)。防御方法包括转义字符、白名单过滤富文本、使用CSP策略限制资源加载,有效降低风险。

XSS攻击

  1. 介绍一下XSS攻击的原理和危害?
    1.1 基本原理
    Note
    XSS ( Cross Site Scripting ) 是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
    1.2 XSS攻击的危害
    获取页面数据
    获取cookie
    劫持前端逻辑
    发送请求
    偷取网站任意数据
    偷取用户资料
    偷取用户密码和登陆态
    欺骗用户
    1.3 XSS攻击分类
    1.3.1 反射型
    通过url参数直接注入。
    发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务端解析后返回,XSS代码随响应内容一起传回给浏览器,最后浏览器执行XSS代码。这个过程像一次反射,故叫做反射型XSS。
    举个例子
    一个链接,里面的query字段中包含一个script标签,这个标签的src就是恶意代码,用户点击了这个链接后会先向服务器发送请求,服务器返回时也携带了这个XSS代码,然后浏览器将查询的结果写入Html,这时恶意代码就被执行了。
    并不是在url中没有包含script标签的网址都是安全的,可以使用短网址来让网址变得很短。
    1.3.2 存储型
    Note
    存储型XSS会被保存到数据库,在其他用户访问(前端)到这条数据时,这个代码会在访问用户的浏览器端执行。
    举个例子
    比如攻击者在一篇文章的评论中写入了script标签,这个评论被保存数据库,当其他用户看到这篇文章时就会执行这个脚本。
    1.4 XSS攻击注入点
    HTML节点内容
    如果一个节点内容是动态生成的,而这个内容中包含用户输入。
    HTML属性
    某些节点属性值是由用户输入的内容生成的。那么可能会被封闭标签后添加script标签。
    Javascript代码
    JS中包含由后台注入的变量或用户输入的信息。
    富文本
  2. XSS 防御方法有哪些?
    Note
    对于 XSS 攻击来说,通常有两种方式可以用来防御。
    转义字符
    CSP 内容安全策略
    2.1 转义字符
    普通的输入 - 编码
    对用户输入数据进行HTML Entity编码(使用转义字符)
    "
    &
    <
    >
    空格
    富文本 - 过滤(黑名单、白名单)
    移除上传的DOM属性,如onerror等
    移除用户上传的style节点、script节点、iframe节点等
    较正
    避免直接对HTML Entity解码
    使用DOM Parse转换,校正不配对的DOM标签和属性
    2.1.1 对于会在DOM中出现的字符串(用户数据)
    < 转义为 \<
    转义为 >
    2.1.2 对于可能出现在DOM元素属性上的数据
    " 转义为 \" ' 转义为 \&9039; 空格转义为 \ 但这可能造成多个连续的空格,也可以不对空格转义,但是一定要为属性加双引号
    & 这个字符如果要转义,那么一定要放在转移函数的第一个来做
    2.1.3 避免JS中的插入
    因为是用引号将变量包裹起来的,而且被攻击也因为引号被提前结束,所以要做的就是将引号转义
    2.2 富文本
    2.2.1 按照黑名单过滤script等
    Note
    但是html标签中能执行html代码的属性太多了,比如onclick, onhover,onerror,
    2.2.1.1 按照白名单过滤
    Note
    只允许某些标签和属性存在
    做法:将HTML解析成树状结构,对于这个DOM树,一个一个的去看是否存在合法的标签和属性,如果不是就去掉。
    使用cheerio就可以快速的解析DOM
    Plain Text
    复制代码

function xssFilter (html) {

const cheerio = require('cheerio');
const $ = cheerio.load(html);

//白名单
const whiteList = {'img': ['src']}

$('').each((index, elem) => {
if(!whiteList[elem.name]) {
$(elem).remove();
return;
}
for(let attr in elem.attribs) {
if(whiteList[elem.name].indexOf(attr) === -1) {
$(elem).attr(attr, null);
}
}
})
return html;
}
2.2.1.2 使用npm包来简化操作
xss文档
2.3 CSP 内容安全策略
Note
CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。
通常可以通过两种方式来开启 CSP:
设置 HTTP Header 中的 Content-Security-Policy
设置 meta 标签的方式


以设置 HTTP Header 来举例
只允许加载本站资源
Plain Text
复制代码
1
Content-Security-Policy: default-src ‘self’
图片只允许加载 HTTPS 协议
Plain Text
复制代码
1
Content-Security-Policy: img-src https://

允许加载任何来源框架
Plain Text
复制代码
1
Content-Security-Policy: child-src 'none'
参考文章
CSP ( Content Security Policy )
相关文章
|
2月前
|
Web App开发 JavaScript 安全
跨域处理
跨域指不同域名、协议或端口间请求受阻。通过CORS(跨域资源共享)可在HTTP头中设置Access-Control-Allow-Origin,实现安全跨域。Spring Boot可通过@CrossOrigin注解、WebMvcConfigurer全局配置或自定义Filter等方式解决跨域问题,支持细粒度控制允许的域名与请求方式,确保应用安全与灵活通信。
|
NoSQL Java Redis
Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster
Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster
348 0
|
Java 测试技术 容器
SpringBoot单元测试报空指针异常解决方案
java.lang.NullPointerException空指针异常 1.测试类中产生空指针异常,可能不是你的逻辑代码写错了,而是因为获取容器失败,即没有使用正确的测试方法 2.在SpringBoot项目中我们一般可以使用两种Junit进行测试,在导入@Test包时,会出现两个选项
1845 0
SpringBoot单元测试报空指针异常解决方案
|
1月前
|
存储 安全 前端开发
浅谈前端安全领域的XSS攻击
本文由喵喵侠撰写,介绍前端安全中的XSS(跨站脚本攻击)基本概念与防范。涵盖反射型、存储型和DOM型XSS原理,并通过一个留言板案例演示攻击过程。文章还提供防御建议,如避免使用innerHTML、采用DOMPurify过滤恶意脚本,帮助开发者提升安全意识,防范常见前端漏洞。
130 0
|
JSON Java 数据格式
一文彻底搞懂 @RequestBody 和 @RequestParam 的区别(附实战示例)
本文深入解析Spring Boot中@RequestBody和@RequestParam的区别,通过实战示例详解两者在数据来源、格式、使用场景及验证处理上的差异,帮助开发者正确选择参数绑定方式,提升开发效率与系统安全性。
965 0
|
负载均衡 安全 网络协议
DDoS攻击(Distributed Denial of Service)
【8月更文挑战第11天】
1120 4
|
SQL 监控 安全
sql注入场景与危害
sql注入场景与危害
|
消息中间件 负载均衡 Java
常见的负载均衡策略有哪些?
常见的负载均衡策略有哪些?
2132 3
|
前端开发 JavaScript Java
解决Spring Boot文件上传问题:`MultipartException` 和 `FileUploadException`
解决Spring Boot文件上传问题:`MultipartException` 和 `FileUploadException`
1154 0
|
监控 Java Nacos
Java微服务框架面试总结(全面,实时更新)
Java微服务框架面试总结(全面,实时更新)