Spirit带你了解如何安全引入第三方资源
Spirit带你了解如何安全的引入第三方资源
本文介绍一下如何安全的引入第三方资源
同源策略(SOP)
首先我们来了解一下什么是同源策略,下面的是wiki百科的定义
同源策略是指Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的协议号(protocol),主机号(host name)和端口号(port),一旦两个网站满足上述条件,这两个网站被认定为具有相同来源.
而同源策略主要表现在三个方面 DOM,Web数据和网络
- DOM:限制了来自不同源的JavaScript脚本对当前的DOM对象读和写的操作
- Web数据: 限制了不同源的站点读取当前站点的Cookie,indexDB,LocalStorage等数据
- 网络:限制了通过XMLHttpRequest等方式将站点的数据发送给不同源的站点
但是如果都按同源策略来的话,便利性其实是大打折扣的,所以为了便利,Web让出了一些安全性,推出了一系列举措,使得我们的网站能够引入第三方资源为用户提供更加丰富的功能
措施
跨域资源共享 - 维基百科(CORS)
我们先看下wiki百科的定义,方便理解
- 跨域资源共享:用于让网页的受限资源能够被其他域名的页面访问的一种机制.
- 通过该机制,页面能够自由地使用不同源(英语:cross-origin)的图片、样式、脚本、iframes以及视频。一些跨域的请求(特别是Ajax)常常会被同源策略(英语:Same-origin policy)所禁止的。
- 跨源资源共享定义了一种方式,为的是浏览器和服务器之间能互相确认是否足够安全以至于能使用跨源请求(英语:cross-origin requests)。比起纯粹的同源请求,这将更为自由和功能性的(functionality),但比纯粹的跨源请求更为安全。
- 跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略
通过wiki百科的定义,我们可以得到以下的3点
- 页面可以通过该机制,自由的嵌入不同源的图片,样式没脚本,iframes和videos
- 可以绕过同源策略,发送跨域请求
- 我们可以这么理解,同源策略相当于是把所有第三方的源列上黑名单,而CORS则是把第三方的源选择性的列成白名单,仿佛那些在白名单上的源和自己的源是在一起的
白名单通过服务器的指令传递给客户端,该指令在HTTP响应头中传递给客户端,它包含两个重要的headers
- Access-control-allow-origin:用于定义允许哪些源可以访问受限的资源的
- Access-control-allow-credentials:确定是否允许使用cookies验证请求
大家可能注意到了,CORS提供的白名单实际上是为该域提供内容的源所维护的,并不是客户端所提供的.并不能由客户端自己决定,接下来所介绍的CSP则很好的解决了这个问题
内容安全策略(CSP)
老规矩,我们先看下wiki百科的定义
内容安全策略(英语:Content Security Policy,简称CSP)是一种计算机安全标准,旨在防御跨站脚本、点击劫持等代码注入攻击,阻止恶意内容在受信网页环境中执行。
我们可以知道,CSP主要是为了抵御攻击手段所发明出来的
但wiki百科对于这一块定义非常的少,接下来介绍的是从MDN上所看到的东西
CSP的主要作用
- 减少和报告XSS攻击
- CSP可以指定有效域,即客户端浏览器这边认可的可执行的脚本来源
使用CSP
通过Content-Security-Policy设定策略,以下是MDN中介绍的常见的安全策略方案实例
网站管理者想要所有内容均来自站点的同一个源(不包括其子域名)
Content-Security-Policy: default-src 'self'
一个网站管理者允许内容来自信任的域名及其子域名 (域名不必须与CSP设置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
一个网站管理者允许网页应用的用户在他们自己的内容中包含来自任何源的图片, 但是限制音频或视频需从信任的资源提供者(获得),所有脚本必须从特定主机服务器获取可信的代码.
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
在这里,各种内容默认仅允许从文档所在的源获取, 但存在如下例外:
- 图片可以从任何地方加载(注意 "*" 通配符)。
- 多媒体文件仅允许从 media1.com 和 media2.com 加载(不允许从这些站点的子域名)。
- 可运行脚本仅允许来自于userscripts.example.com。
一个线上银行网站的管理者想要确保网站的所有内容都要通过SSL方式获取,以避免攻击者窃听用户发出的请求。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
一个在线邮箱的管理者想要允许在邮件里包含HTML,同样图片允许从任何地方加载,但不允许JavaScript或者其他潜在的危险内容(从任意位置加载)。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
注意这个示例并未指定script-src (en-US)。在此CSP示例中,站点通过
default-src指令的对其进行配置,这也同样意味着脚本文件仅允许从原始服务器获取。
从上述五个常见例子可以看到,通过自己指定策略,客户端可以自己管理可以从哪加载外部源,相比之前更加安全了,等同于可以自己设置防火墙,抵御外部的恶意攻击,同时也解决了跨域资源共享只能由服务器端来决定白名单的问题,Web的灵活性大大提高了
子资源完整性Subresource Integrity(SRI)
先来看看mdn的定义吧
子资源完整性(SRI)是允许浏览器检查其获得的资源是否被篡改的一项安全特性.它是通过验证获取文件的哈希值是否和你提供的哈希值一样来判断资源是否被篡改
我来给大家讲下SRI的应用场景
我们使用cdn分发脚本和样式表等文件时,并不是完全安全的,如果攻击者获得对CDN的控制权,则可以将任意恶意内容注入到CDN的文件上,因此有可能潜在的攻击所有从该CDN上获取文件的站点.而SRI可以极大限度的来降低这种损害
注意:SRI并不能规避所有的风险.第三方库经常会自己请求额外的信息,有可能会携带用户的账号密码等关键信息.这些经常需要JS功能的支持,比如一个地图库会需要取<svg>数据来渲染,但是包含点击事件.通过点击事件就有可能对你的网站造成损害的
使用方法
- 使用base64编码过后的文件哈希值写入你所引用的
<script>和<link>标签的integrity就可以启用子资源完整性功能 - 更为详细的用法 请大家到MDN上浏览,本文不做过多介绍
浏览器处理SRI
- 当浏览器在
<script>或者<link>标签中遇到 integrity 属性之后,会在执行脚本或者应用样式表之前对比所加载文件的哈希值和期望的哈希值。 - 当脚本或者样式表的哈希值和期望的不一致时,浏览器必须拒绝执行脚本或者应用样式脚本,并且返回一个网络
引入第三方资源小结
从上面的讲述,我们可以看到为了引入第三方资源,其实是做了很多努力的
我们在此也可以总结出一些内容
- 同源策略相当于密不透风的防火墙,任何第三方资源都进不来
- 跨域资源共享(CORS)和内容安全策略相当于是白名单,告诉同源策略,我们是安全的,让它放行他们进去
- 子资源完整性(SRI)则是镇守防火墙内的一个尖兵,启动它的时候,能检查出这些第三方资源是否是伪装的恶意进攻
- 他们相互结合,能极大限度的保护我们的网站不受侵害,同时还能很好的为用户提供更加丰富的功能
Spirit带你了解如何安全引入第三方资源的更多相关文章
- Android NDK编程,引入第三方.so库
android自带的编译工具NDK进行编译时(非单纯的调用第三方.so而是进行ndk编程),armeabi以及armeabi-v7a文件夹下的第三方so文件将会被删除,只会产生编译后的so文件,其他的 ...
- 小程序使用npm模块(引入第三方UI),报错的多种解决办法。
前言引入第三方模块时,我遇到了很多坑. 首先是微信.第三方模块的文档描述不清楚.其次.搜索到的博客,大部分是抄的文档 / 相互转载抄袭.作用有限. 于是,我自己做了各种条件下的测试.解决各种情况的引入 ...
- Swift项目引入第三方库的方法
以下,将创建一个Swift项目,然后引入3个库: Snappy 简化autolayout代码的库 Alamofire HTTP网络库,AFNetworking作者写的 SDWebImage 图片加载, ...
- vue-cli项目中引入第三方插件
前言 最近有小伙伴问道如何在vue-cli项目中引入第三方插件或者库,例如如果想在项目中使用jQuery中的Ajax请求数据呢?或者我想使用Bootstrap框架呢?等等这些问题,本篇博客将带你学习如 ...
- 使用.NET 6开发TodoList应用(3)——引入第三方日志库
需求 在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选 ...
- laravel5.3引入第三方类库的方法
laravel版本:5.3 今天做的是引入第三方的phpquery类库,方法: 在laravel的app目录下自定义一个文件夹,我用的名字是:Libs 然后直接将phpquery类库扔进这个目录 在c ...
- xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误
xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误 一:场景 xcode 同时引入了 libA.a, libB.a 两个静态类库,如果 这两个静态类库之中 ...
- Laravel Controller中引入第三方类库
Laravel 引入第三方类库 在Controller中引入自定义的php文件,先在app目录下创建一个新的文件夹,命名Tools(可自定义),接着创建一个MyTest.php: <?php c ...
- 【JMeter】Jmeter引入第三方jar包
Jmeter做remoteService,里面用到一个实体:clickEntity,是在一个第三方jar包定义的:com.bj58.opt.ad_logparser-0.0.18-SNAPSHOT.j ...
随机推荐
- 在Raspberry Pi 3B+上安装Windows 10 IoT
下载 进入树莓派下载页面,当前网址https://www.raspberrypi.org/downloads/ 选择Windows 10 IoT Core,当前网址https://docs.micro ...
- SSD算法原理
Paper: https://arxiv.org/pdf/1512.02325.pdf SSD用神经网络(VGG)提取多层feature map ,来实现对不同大小物体的检测.如下图所示: We us ...
- Python中的私有属性私有方法、类属性类方法以及单例设计模式
私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法.在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线) 公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只 ...
- python实现分水岭算法分割遥感图像
1. 定义 分水岭算法(watershed algorithm)可以将图像中的边缘转化为"山脉",将均匀区域转化为"山谷",在这方面有助于分割目标. 分水岭算法 ...
- C# Equals方法和==有什么区别
开发工具:VS2019 一.关于这两个比较,需要从值类型和引用类型两方面来说 (A)先说值类型 上图: 因为在对值类型进行比较时候,不管 .Equals() 方法还是 == 方法,都是对值类型变量(图 ...
- Flask - 解决 app.run() 添加 host、port、debug 参数后运行不生效的问题
问题背景 app.run() 添加了 host.port.debug 参数,运行后发现没有生效,咋肥事! 解决方案 要打开 debug 模式的话,勾选 FLASK_DEBUG 就好啦 再次运行,发现已 ...
- 源码编译安装LAMP
LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境.LAMP是一个缩写词,具体包括Linux操作系统.Apache网站服务器 ...
- 【第九篇】- Git 标签之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 标签 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我们想为我们的 xxx 项目发布一个"1.0"版本. ...
- jsPlumb开发流程设计器
前言 jsPlumb是一款开源软件,但jsPlumb toolkit是收费的. 本文主要使用jsPlumb实现一些简单的流程设计功能. 基础学习 首先引入jsplumb.min.js. <scr ...
- 学习PHP中的信息格式化操作
在国际化组件的学习过程中,我们已经接触过了 NumberFormatter 这种数字的格式化操作,它可以让我们将数字转换成标准格式.货币.本地语言等形式.今天我们来学习的是另一种专门用于信息格式化的类 ...