Vue进阶(三十三)Content-Security-Policy(CSP)详解

news2024/11/26 1:31:37

文章目录

    • 一、前言
    • 二、XSS 攻击都有哪些类型?
    • 三、CSP介绍
      • 3.1 使用HTTP的 Content-Security-Policy头部
      • 3.2 使用 meta 标签
    • 四、CSP 实施策略
    • 五、Vue中可使用的防XSS攻击方式
    • 六、拓展阅读

一、前言

作为前端工程师你真的了解 XSS 吗?越来越多超级应用基于 Web 构建,如何系统的攻防 XSS 尤为重要。微软安全工程师 1999 年底披露了 XSS,22 年来 XSS 一直稳居 OWASP开放 Web 应用程序安全 ) 报告的前 TOP10。

跨域脚本攻击(XSSCross-Site Scripting)是最常见、危害最大的网页安全漏洞。XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。

为了防止它,要采取很多编程措施(比如大多数人都知道的转义、过滤HTML)。很多人提出,能不能根本上解决问题,即浏览器自动禁止外部注入恶意脚本?

这就是"内容安全策略"(Content Security Policy,缩写 CSP)的由来。

二、XSS 攻击都有哪些类型?

基于应用的 XSS 攻击主要有以下类型:

  • 反射 XSS (RXSS):当作为 HTTP 请求的⼀部分提供的恶意数据在未经过适当清理的情况下成为服务器响应的⼀部分时,就会发⽣ RXSS 攻击。因此,嵌⼊在 HTTP 响应中的恶意数据会返回客⼾端并在浏览器呈现时执⾏。RXSS 的典型⽬标是具有搜索功能的 Web 应⽤程序,其中嵌⼊的恶意数据成为搜索结果或错误消息的⼀部分。
  • 存储型 XSS (SXSS):当以输⼊形式提供的恶意数据未经清理就存储在服务器应⽤程序数据库或⽂件中时,就会出现 SXSS 攻击。SXSS 攻击的典型⽬标是在线社交⽹络应⽤程序和论坛,恶意数据可以在其中发布、存储在数据库中,从⽽感染访问它们的每个⽤⼾。SXSS 攻击也称为持久性攻击。
  • DOM XSS (DXSS):DXSS 攻击是渲染时攻击。DOM-based XSS攻击是一种与服务器没有直接交互的攻击,它利用客户端代码中的漏洞来实现攻击。攻击者通常会在页面上运行可执行代码,例如链接、表单等,来利用客户端脚本来注入恶意代码。与 RXSS 和 SXSS 相反, DXSS 攻击中使⽤的恶意数据⽤于动态更改浏览器在渲染阶段⽣成的 DOM 树。
  • JavaScript Mimicry XSSJSM-XSS):攻击者不是注⼊恶意脚本,⽽是利⽤ Web 应⽤程序中已经使⽤的脚本来发起 JSM-XSS 攻击。JSM-XSS 攻击很难被检测到并且很容易通过基于⽩名单的过滤器。
  • XSS 蠕⾍(WXSS):WXSS 攻击是具有⾃我复制能⼒的 XSS 攻击。RXSS 和 SXSS 攻击被归类为 WXSS。WXSS 攻击更加危险,因为它们在 Web 应⽤程序⽤⼾之间传播,并随着时间的推移逐渐感染其他⽤⼾。此类攻击的典型⽬标是在线社交⽹络应⽤程序。

三、CSP介绍

Content Security Policy (CSP) 是一种加固 Web 应用的安全性技术,通过在网站页面中设置 CSP Header 来限制页面中能够执行的脚本、样式、图片等资源。CSP 包括很多不同的策略,因此安全设置的具体值取决目标网站的需求和资源使用情况。一般而言,建议设置较为严格的 CSP,以避免 XSSCSRF 等安全问题。例如,可以配置以下 CSP:

Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; img-src 'self' data:; style-src 'self' 'unsafe-inline'; font-src 'self' https://example.com;

以上设置的 CSP 规则禁止所有来自第三方网站的资源,只允许本网站的资源加载。其中 script-src 只允许本网站和 example.com 的脚本加载,img-src 只允许本网站和 data: URI 的图片加载,style-src 只允许本网站和内联样式加载,font-src 只允许本网站和 example.com 的字体加载。请根据实际情况进行调整。

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

两种方法可以启用 CSP

  • 设置 HTTP 的 Content-Security-Policy 头部字段;
  • 设置网页的<meta>标签。

3.1 使用HTTP的 Content-Security-Policy头部

在服务器端使用 HTTP的 Content-Security-Policy响应头部来指定安全策略。

Content-Security-Policy: policypolicy参数是一个包含了各种描述CSP策略指令的字符串。

示例1:

// index.js
const http = require('http');
const fs = require('fs');
http.createServer((req, res) => {
   const html = fs.readFileSync('index.html', 'utf8');
   res.writeHead(200, {
       'Content-Type': 'text-html',
       'Content-Security-Policy': 'default-src http: https:' 
   });
   res.end(html);
}).listen(9000);

console.log('server listening on 9000');

以上代码使用原生nodejs起了个服务,然后设置响应头部'Content-Security-Policy': 'default-src http: https:'表示只能通过外联的方式来引用jscss,如果使用内联的将报错:
在这里插入图片描述
示例2

只能在指定的域下加载文件,这里表示只能从同域下加载,斜杠为转义符:'Content-Security-Policy': 'default-src \'self\''

<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>

在这里插入图片描述
打开控制台也可以看到请求在浏览器就已经被限制了:
在这里插入图片描述
如果要允许请求到这个域,添加进策略即可:

'Content-Security-Policy': 'default-src \'self\' https://cdn.bootcss.com/' 

示例3
上面的策略是无法限制form表单的提交的,如下列表单,点击后直接跳到了百度页面:

    <form action="https://baidu.com">
        <button>click me</button>
    </form>

这时候就要设置form-action策略:

'Content-Security-Policy': 'default-src \'self\' https://cdn.bootcss.com/; form-action \'self\''

在这里插入图片描述
其中,default-src设置的是全局,如果只想限制js的请求,可以将default-src改为script-src
启用违例报告
默认情况下,违规报告并不会发送。为启用发送违规报告,需要指定 report-uri策略指令,并提供至少一个URI地址去递交报告:

'Content-Security-Policy': 'script-src \'self\'; report-uri /report'

这里的报告我们可以直接在浏览器看到,它会自动发送一个请求出去:
在这里插入图片描述
如果只想收集报告,但是不真正的去限制请求,那怎么办?除了Content-Security-Policy,还有一个Content-Security-Policy-Report-Only字段,表示不执行限制选项,只是记录违反限制的行为。将头部改为这个即可。

如果 Content-Security-Policy-Report-Only 标头和 Content-Security-Policy 同时出现在一个响应中,两个策略均有效。在 Content-Security-Policy 标头中指定的策略有强制性,而 Content-Security-Policy-Report-Only 中的策略仅产生报告而不具有强制性。

3.2 使用 meta 标签

以上规则可以在浏览器端设置,如:

<meta http-equiv="Content-Security-Policy" content="form-action 'self';">

但与服务器端设置有点不同的是,meta无法使用report,只能在服务器端设置:
在这里插入图片描述

四、CSP 实施策略

限制方式

  • default-src: 限制全局,默认所有都会使用这种规则。
  • script-src: 限制JavaScript的源地址。
  • style-src:限制层叠样式表文件源。
  • img-src:限制图片和图标的源地址。
  • font-src:定义了字体加载的有效来源。
  • connect-src:定义了请求、XMLHttpRequestWebSocketEventSource 的连接来源
  • child-src: 指定定义了 web workers 以及嵌套的浏览上下文(如<frame><iframe>)的源。
  • media-src:限制通过 <audio><video><track> 标签加载的媒体文件的源地址。
  • object-src:限制 <object><embed> 标签的源地址。
  • manifest-src:限制应用声明文件的源地址。
  • prefetch-src:指定预加载或预渲染的允许源地址。
  • worker-src:限制 WorkerSharedWorkerServiceWorker 脚本源。
  • webrtc-src:指定WebRTC连接的合法源地址。

注⚠️: 被 object-src 控制的元素可能碰巧被当作遗留 HTML 元素,导致不支持新标准中的功能(例如 <iframe> 中的安全属性 sandboxallow)。因此建议限制该指令的使用(比如,如果可行,将 object-src 显式设置为 ‘none’)。
限制规则

  • self: 只允许同源下的资源。
  • unsafe-inline:允许使用内联资源,如内联的<script>元素、javascript: URL、内联的事件处理函数和内联的<style>元素。
  • unsafe-eval:允许使用 eval() 等通过字符串创建代码的方法。

注⚠️:设置多个限制条件,后面的会覆盖前面的!

一个CSP头由多组CSP策略组成,中间由分号分隔。其中每一组策略包含一个策略指令和一个内容源列表。例如:

Content-Security-Policy: default-src 'self' www.baidu.com; script-src 'unsafe-inline'

五、Vue中可使用的防XSS攻击方式

使用插值表达式

{{ message }}

使用双花括号语法来显示动态数据是 Vue 中最常用的方式。Vue 会将数据中的特殊字符进行转义,从而避免XSS攻击。变量 “message” 是一个安全的字符串,它不会受到攻击者的攻击。

使用指令

<div v-html="rawHtml"></div>

v-html 是一个常用指令,该指令使用原始HTML内容更新元素内容。但是,要注意使用该指令的危险性,因为它可以导致非常敏感的安全问题。Vue 会阻止注入恶意脚本,从而保护Web应用程序的安全性。

使用计算属性

<div>{{ reversedMessage }}</div>
...
computed: {
reversedMessage: function () {
	return this.message.split('').reverse().join('')
}
}

Vue的计算属性可以让我们从不同的数据源派生数据。这样,以非必要的方式显示数据来防止XSS攻击。在计算属性中的数据被认为是安全的,不会被攻击者利用。

六、拓展阅读

  • Content Security Policy 入门教程
  • 内容安全策略(CSP)
  • CSP 常用配置项

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

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

相关文章

预付费电表和断路器的连接方式及注意事项

随着智能电网技术的不断发展&#xff0c;预付费电表已经在我国得到了广泛应用。预付费电表不仅可以实现远程自动抄表、实时监控用电量等功能&#xff0c;还可以有效防止偷电行为&#xff0c;提高用电安全。断路器作为低压配电系统中的重要组成部分&#xff0c;具有保护电路、防…

详细介绍 弹性盒子(display:flex)

文章目录 什么是弹性盒子 如何使用弹性盒子flex系列flex-direction 对齐方向 水平对齐垂直对齐flex-wrap 换行flex-flowflex模型说明容器的属性 justify-content X轴对齐方式align-content Y轴对齐方式总结属性值Y轴对齐的另外一种&#xff1a;align-itemsalign-content和alig…

基于Springboot跟rabbitmq实现的死信队列

概述 RabbitMQ是流行的开源消息队列系统&#xff0c;使用erlang语言开发。为了保证订单业务的消息数据不丢失&#xff0c;需要使用到RabbitMQ的死信队列机制&#xff0c;当消息消费发生异常时&#xff0c;将消息投入死信队列中。但由于对死信队列的概念及配置不熟悉&#xff0…

自然语言处理实战项目17-基于多种NLP模型的诈骗电话识别方法研究与应用实战

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目17-基于NLP模型的诈骗电话识别方法研究与应用&#xff0c;相信最近小伙伴都都看过《孤注一掷》这部写实的诈骗电影吧&#xff0c;电影主要围绕跨境网络诈骗展开&#xff0c;电影取材自上万起真…

PPO代码研究(2)

好&#xff0c; 因为我没怎么看懂&#xff0c; 所以我决定再看一遍PPO的代码&#xff0c; 再研究一遍。 事实证明&#xff0c; 重复是一个非常好&#xff0c;非常好的方法。 学习方法。 世界上几乎没有任何新知识是你一遍就能学会的。 你只能学一遍&#xff0c;再来一遍&…

大剧院订座系统源码,大剧院订票,大剧院场馆租赁,大剧院订票系统完整源码

大剧院订座系统源码,大剧院订票&#xff0c;大剧院场馆租赁&#xff0c;大剧院订票系统完整源码 大剧院系统1、管理后台--系统说明2、订票小程序--系统说明3、验票端--系统说明4、系统源码说明 大剧院系统 1、管理后台–系统说明 项目管理&#xff1a;用于创建剧院演出项目 2…

【广州华锐互动】AR技术在配电系统运维中的应用

随着科技的不断发展&#xff0c;AR(增强现实)技术逐渐走进了我们的生活。在电力行业&#xff0c;AR技术的应用也为巡检工作带来了许多新突破&#xff0c;提高了巡检效率和安全性。本文将从以下几个方面探讨AR配电系统运维系统的新突破。 首先&#xff0c;AR技术可以实现虚拟巡检…

Qt应用开发(基础篇)——按钮基类 QAbstractButton

一、前言 QAbstractButton类&#xff0c;继承于QWidget&#xff0c;是Qt按钮小部件的抽象基类&#xff0c;提供按钮常用的功能。 QAbstractButton按钮基类&#xff0c;它的子类(pushbutton、checkbox、toolbutton等)处理用户操作&#xff0c;并指定按钮的绘制方式。QAbstractBu…

el-table中加图标文字提示

<el-table :data"tableData" style"width: 100%" max-height"250"><el-table-column fixed prop"aaa" label"日期" width"150" /><el-table-column prop"bbb" label"日期" wi…

英语语法基础--思维导图

思维导图通常用于可视化和整理信息&#xff0c;而英文语法非常广泛且复杂&#xff0c;无法在一个简单的思维导图中完整表示。然而&#xff0c;我可以提供一个简化版本的英文语法思维导图&#xff0c;列出一些主要的语法概念和部分示例。 请注意&#xff0c;这只是一个基本的概…

多个pdf怎么合并在一起?跟着我的步骤一起合并

多个pdf怎么合并在一起&#xff1f;利用PDF文档合并功能可以帮助您更有效地管理文件&#xff0c;将多个相关文件整合成一个文件&#xff0c;避免分散在多个文件中。此外&#xff0c;合并后的文件更便于共享和传输&#xff0c;因为只需共享一个文件而不是多个文件。虽然合并文件…

自学Python01-创建文件写入内容

此处省去安装和前言&#xff0c;需要两个东西 一个去下载安装python官方库 Welcome to Python.org 一个是编译器pycharm PyCharm 安装教程&#xff08;Windows&#xff09; | 菜鸟教程 PyCharm: the Python IDE for Professional Developers by JetBrains 第一节 练习print…

18--Elasticsearch

一 Elasticsearch介绍 1 全文检索 Elasticsearch是一个全文检索服务器 全文检索是一种非结构化数据的搜索方式 结构化数据&#xff1a;指具有固定格式固定长度的数据&#xff0c;如数据库中的字段。 非结构化数据&#xff1a;指格式和长度不固定的数据&#xff0c;如电商网站…

rocky(centos) 安装redis,并设置开机自启动

一、下载并安装 1、官网下载Redis 并安装 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/ 2、上传下载好的redis压缩包到 /…

电气工程中重要的测量术语:“kVRMS” | 百能云芯

在电气工程和电子领域&#xff0c;术语“kVRMS”至关重要。它是工程师和技术人员用来准确评估电气系统电压的关键测量方法。在这篇综合文章中&#xff0c;我们将深入探讨 kVRMS 的含义、其意义、应用。 kVRMS 代表“千伏均方根”。为了理解这个术语&#xff0c;我们来分解一下&…

【Java Web】统一处理异常

一个异常处理的ControllerAdvice类。它用于处理Controller注解的控制器中发生的异常。 具体代码功能如下&#xff1a; 导入相关类和方法。声明一个Logger对象&#xff0c;用于日志记录。使用ExceptionHandler注解标记handleException方法&#xff0c;用于处理所有异常。 -嘛在…

管网水位监测的必要性

城市燃气、桥梁、供水、排水、热力、电力、电梯、通信、轨道交通、综合管廊、输油管线等&#xff0c;担负着城市的信息传递、能源输送、排涝减灾等重要任务&#xff0c;是维系城市正常运行、满足群众生产生活需要的重要基础设施&#xff0c;是城市的生命线。基础设施生命线就像…

centos+jenkins+pycharm

思路&#xff1a;架构 一. 在centos上搭建jenkins环境 二. pycharm与gitee建立连接 三. 访问jenkins&#xff0c;添加任务 3.1 添加一个自由风格的任务 3.2 添加git项目路径及访问git的账号和密码 3.3 执行start.sh脚本 四. 浏览器访问jenkins执行任务

leetcode-779. 第K个语法符号(java)

第K个语法符号 题目描述递归代码演示 题目描述 难度 - 中等 LC- 779. 第K个语法符号 我们构建了一个包含 n 行( 索引从 1 开始 )的表。首先在第一行我们写上一个 0。接下来的每一行&#xff0c;将前一行中的0替换为01&#xff0c;1替换为10。 例如&#xff0c;对于 n 3 &#…

个人博客系统-测试用例+自动化测试

一、个人博客系统测试用例 二、自动化测试 使用selenium4 Junit5单元测试框架&#xff0c;来进行简单的自动化测试。 1. 准备工作 &#xff08;1&#xff09;引入依赖&#xff0c;此时的pom.xml文件&#xff1a; <?xml version"1.0" encoding"UTF-8&quo…