“不关心⚠️Warning”的代价:http自动升级https导致免费的存储服务扣费

背景

7 月 12 日的时候我手机突然收到一条短信:显示我在 LeanCloud 平台的账户欠费了。虽然只是欠费 0.01 元,但还是有些疑惑,怎么免费的存储服务突然扣费了
然而这只是个开始。起初我并没有很在意这扣费的 0.01 元(毕竟就这 1 分钱),因为我在赶着开发博客且服务也没有受到实质影响,所以直接忽视了它。但是在我接连使用几天后开始发现图片无法访问了,此时我才又回想起那条扣费短信。
image.png
LeanCloud 是我开发个人博客期间使用的一个 Serverless 云平台,提供数据存储、云引擎、即时通讯、推送、短信等服务。然而除了使用 LeanCloud 提供的文件存储服务,我就没用其他的,况且我记得是有免费 10 GB 的存储空间和每日一定额度数据流量的。

难道是我的图片被刷流量了?我赶紧去查账单,上去一看:竟然全是文件存储 HTTPS 流量扣费!并且可以看到费用产生时间是从 “2024-07-09” 开始,直到服务停止,总计扣费 0.1 元。此时我还真应该庆幸我没有预充值,要不还不知道扣费了!
image.png
但是还是要深入分析一下,从数据流量上看并没有被攻击的迹象,但是是哪里来的 https 访问?我的图片全是用 http 访问的,并且特地用的 http,就是避免产生 https 流量。
image.png
此时我忽然回想起之前忽略掉的那些黄色警告,赶紧打开开发者工具查看控制台,一连串的黄色警告⚠️,仔细检阅后发现问题正是出在这里。

Mixed Content: The page at 'https://2remtj18-ugbjdc3g-0qm4basfzl11.nxc1.mcprev.cn/home’ was loaded over HTTPS, but requested an insecure element 'http://lc-3sdxes8b.cn-n1.lcfile.com/kJmTER4zbgJTGxp4fbRzKeS9ICXUE4Pd/IMG_20200518_235830.jpg’. This request was automatically upgraded to HTTPS, For more information see https://blog.chromium.org/2019/10/no-more-mixed-messages-about-https.html

image.png
就是说产生了混合内容:网页是通过 HTTPS 加载的,但是请求了一个不安全的元素,也就是 HTTP 图片请求,因此这个请求自动升级成了 HTTPS
看来这就是根源了,此时我想起了在程序员之间流传的一个梗:我们只关心 Error,从来不关心什么叫 Warning…谁说不用关心 Warning 的?这就是 “不关心⚠️Warning” 的代价:http 自动升级 https 导致免费的存储服务扣费!

一、Mixed Content(混合内容)

1.1 什么是混合内容?

混合内容的定义是:通过安全方式加载的网页使用通过 HTTP 或其他不安全协议获取的资源。简言之就是:在 HTTPS 页面中加载了 HTTP 子资源。
混合内容分为两类:upgradable content(可升级内容)和blockable content(可阻止内容)。

1.1.1 Upgradable content

Note:此前也称为 “被动混合内容”,指那些不能修改网页中其他内容的,例如图像、视频和音频资源。

“可升级内容” 就是会自动将不安全的 http 请求将自动升级为 https 安全请求的资源。远程服务器要么返回资源,要么返回一个 “not found” 状态码。
以下是 “可升级内容”(除了 URL host 被指定为 IP):

  • <img>,通过src属性设置资源。
  • CSS 图片样式如:background-imageborder-image等等。
  • <audio>,通过src属性设置资源。
  • <video>,通过src属性设置资源。

1.1.2 Blockable content

Note:此前也被称为 “主动混合内容”,指那些可以修改网页其他部分的内容,例如脚本。

“可阻止内容” 被定义为 “所有不可升级的混合内容”,就是这类资源不会通过自动将请求升级为 https,而是直接阻止资源请求。
以下是 “可阻止内容”:

  • <script>,通过src属性设置资源。
  • <link>,通过href属性设置资源。
  • <iframe>,通过src属性设置资源。
  • fetch()请求。
  • XMLHttpRequest请求。
  • CSS 样式中使用url()
  • <img>,通过srcset属性设置资源。
  • “可升级内容” 请求的 URL host 是 IP 而不是域名。

1.2 混合内容的风险

混合内容的风险本质上是明文传输带来的风险:

  • 隐私泄露:不安全的连接可能导致用户的敏感信息被攻击者窃取。例如攻击者可能在混合资源加载中注入跟踪 cookie
  • 数据篡改:攻击者可以修改通过不安全协议传输的资源,从而提供错误或误导性的信息。例如攻击者可能篡改股票图表的混合图像以误导投资者。

二、Chrome 对混合内容的措施

2.1 Chrome 79 之前

在 Chrome 79 之前,浏览器默认会阻止许多类型的混合内容,如script(脚本)和 iframe,但仍然允许加载image(图像)、audio(音频)和video(视频)。

2.2 Chrome 79

从 Chrome 79 开始,逐步将混合内容资源自动升级到 https。因此,如果网站的子资源可以通过 https 正常访问,那么网站将继续正常工作。对于用户则将能够启用一个设置,选择在特定网站上不阻止混合内容。
例如用户可以在地址栏的左侧设置按钮中,点击 “网络设置” 跳转到设置页面,然后对 “不安全内容” 设置为 “允许”。
image.png
image.png
当设置好之后,需要注意地址栏左侧会明显地提示 “不安全” 以警示用户。用户可以点击 “不安全” 查看相关的信息。
image.png
且当打开开发者工具查看控制台时,可以看到不安全资源的黄色警告信息:页面通过 HTTPS 加载,但是请求了一个不安全的 HTTP 图片资源,此资源内容也应当通过 HTTPS 访问。
image.png

2.3 Chrome 80

在 Chrome 80 中,混合的audio(音频)和vedio(视频)资源将自动升级到 https,如果它们无法通过 https 加载,Chrome 将默认阻止它们;混合image(图像)仍将被允许加载,但它们会导致 Chrome 在地址栏中显示 “不安全” 标识。
image.png

2.4 Chrome 81

在 Chrome 81 中,混合image(图像)将自动升级到 https,如果它们无法通过 https 加载,Chrome 将默认阻止这些资源。

三、HTTPS 升级指南

3.1 CSP: upgrade-insecure-requests

HTTP 内容安全策略(CSP)upgrade-insecure-requests用于指示浏览器将网站的所有不安全 HTTP URL 视作为安全的 HTTPS URL。该指令主要用于具有大量需要重写的不安全遗留 HTTP URL 的网站。

3.1.1 HTTP header

通过在 HTTP header 设置 CSP upgrade-insecure-requests,不安全的 HTTP 资源请求会自动升级为 HTTPS。

Content-Security-Policy: upgrade-insecure-requests;

3.1.2 HTML meta

在 HTML <meta>中设置 CSP upgrade-insecure-requests,同样可以将不安全的 HTTP 资源请求自动升级为 HTTPS。这些 HTTP URL 在请求发出之前就会被重写,这意味着不会有不安全的请求到达网络。注意,如果所请求的资源实际上无法通过 HTTPS 获得,请求将失败,并且不会回退到 HTTP。

<metahttp-equiv="Content-Security-Policy"content="upgrade-insecure-requests" />

3.1.3 导航性资源

CSP upgrade-insecure-requests的设置对于指向第三方的 HTTP 导航性资源不会自动升级为 HTTPS,因为导航性资源如果是第三方资源那么可能会带来错误的结果。导航性资源就是例如<a>中在href属性设置的资源。

<a href="https://my-website.com/">Home</a>
<a href="http://third-party-website.com/">Home</a>

3.2 Nginx 配置 SSL 证书

除了在客户端设置 CSP upgrade-insecure-requests将 HTTP 升级为 HTTPS 请求,服务器也需要升级为 HTTPS 服务,避免出现请求错误。
如果服务器使用 Nginx 作为网关,可以按如下示例配置。

  • ssl_certificate:SSL 证书文件在服务器中的绝对路径。
  • ssl_certificate_key:SSL 密钥文件在服务器中的绝对路径。
server {listen  443  ssl;server_name my-website.com;ssl_certificate "/data/ssl/xxx.crt";ssl_certificate_key "/data/ssl/xxx.key";ssl_session_cache shared:SSL:1m;ssl_session_timeout  10m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {proxy_pass http://127.0.0.1:8080;break;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}
}
  • 301 重定向,将 HTTP 请求永久重定向到 HTTPS 请求
server {listen       80;server_name  my-website.cn;return 301 https://$host$request_uri;
}

四、个人解决

回归到最初的问题,由于我是用的第三方的文件服务,不可避免地最终都会产生 HTTPS 流量,因此个人主要解决的是第三方服务费用问题。经过一番调研,最后我选择了 Vercel Blob 作为最终解决方案。
Vercel Blob 是一个对象存储服务,用于存储静态资源如图片、视频、音频等文件。它提供了基础版的免费额度,有 250MB 的存储空间和每月 5GB 的数据流量。

在安全性上,Vercel Blob 设置了一些安全的 HTTP header 来防止未经授权的下载,阻止嵌入外部内容以及防范恶意的文件类型操作,如下:

  • content-security-policy: default-src "none"
  • x-frame-options: DENY
  • x-content-type-options: nosniff
  • content-disposition: attachment/inline; filename="filename.extension"

参考

[1] Mixed content
[2] No More Mixed Messages About HTTPS
[3] Vercel Blob - Security

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

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

相关文章

【微服务即时通讯系统】——brpc远程过程调用、百度开源的RPC框架、brpc的介绍、brpc的安装、brpc使用和功能测试

文章目录 brpc1. brpc的介绍1.1 rpc的介绍1.2 rpc的原理1.3 grpc和brpc 2. brpc的安装3. brpc使用3.1 brpc接口介绍 4. brpc使用测试4.1 brpc同步和异步调用 brpc 1. brpc的介绍 1.1 rpc的介绍 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;是一…

指纹定位的原理与应用场景

目录 原理 1. 信号特征收集 2. 定位算法 推导公式 距离估算公式 定位算法公式 使用场景 发展前景 指纹定位是一种基于无线信号强度(如Wi-Fi、RFID、蓝牙等)来实现室内定位的技术。它借助于环境中多个基站的信号特征来推断用户的位置。以下是对指纹定位的详细讲解,包…

节点分类、链路预测和社区检测的评价指标

文章目录 前言一、节点分类的评价指标1. 混淆矩阵 (Confusion Matrix)2. 准确率 (Accuracy)3. 精确率 (Precision)4. 召回率 (Recall)5. F1分数 (F1 Score)6. ROC曲线和AUC值 (Receiver Operating Characteristic and Area Under Curve) 二、链路预测的评价指标1. **AUC (Area …

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …

WMware安装WMware Tools(Linux~Ubuntu)

1、这里终端里面输入sudo apt upgrade用于更新最新的包 sudo apt upgrade 2、安装 open-vm-tools-desktop 包&#xff0c; Ps&#xff1a;这里是以为我已经安装好了。 udo apt install open-vm-tools-desktop -y3、最后重启就大功告成了 reboot 4、测试是否成功&#xff1a…

2024网安周 | 百度安全深度参与,探索人工智能与数字安全的融合发展之路

9月9日-15日&#xff0c;2024年国家网络安全宣传周在全国范围内统一举行&#xff0c;本届网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题&#xff0c;由中央宣传部、中央网信办、教育部、工业和信息化部、公安部、中国人民银行、国家广播电视总局、全国总工会…

0108 Spring Boot启动过程

Spring Boot 的启动过程可以分为以下几个关键步骤&#xff1a; 1. SpringApplication 初始化 Spring Boot 应用的启动是通过调用 SpringApplication.run() 方法完成的。在这个过程中&#xff0c;Spring Boot 会通过 SpringApplication 类对应用进行初始化&#xff0c;包括设置…

0708-指针和字符数组(上)(下)

一、计算字符串的大小&#xff1a; int main() {char C[20];C[0] J;C[1] O;C[2] H;C[3] N;C[4] \0;int len strlen(C);printf("Length %d\n", len); } 二、打印一个"Hello"字符串&#xff1a; 这部分可以看视频&#xff0c; char C[20] "H…

LabVIEW回转支承间隙自动化检测系统

开发了一种基于LabVIEW软件的回转支承间隙检测系统&#xff0c;通过高精度传感器和数据采集卡&#xff0c;自动化、高效地测量回转支承的轴向间隙和径向间隙&#xff0c;提高了检测精度和生产质量。以下是对系统的详细描述与应用案例分析&#xff0c;希望能为有类似需求的开发者…

【深度学习】—线性回归 线性回归的基本元素 线性模型 损失函数 解析解 随机梯度下降

【深度学习】— 线性回归 线性回归的基本元素 线性模型 损失函数 解析解 随机梯度下降 线性回归线性回归的基本元素 线性模型损失函数解析解随机梯度下降小批量随机梯度下降梯度下降算法的详细步骤解释公式 线性回归 回归&#xff08;regression&#xff09;是能为⼀个或多个⾃…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-01

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-01 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-01目录1. Beyond Text-to-Text: An Overview of Multimodal and Generative Artificial Intelligence for Education Using Topi…

QT-MySQL QSqlDatabase: QMYSQL driver not loaded

文章目录 问题解决操作&#xff1a;自己尝试编译&#xff0c;各种错误层出不穷&#xff1a; 解决问题检查总结&#xff1a; 问题 使用Qt连接mysql数据库&#xff0c;遇到了一个问题&#xff0c;就是QT5.14.1版本在连接MySQL数据库时候&#xff0c;提示驱动加载失败&#xff0c…

麒麟操作系统部分目录介绍

图形系统目录 文字系统目录 &#xff08;1&#xff09;/bin&#xff1a;存放普通用户可以使用的命令文件。 &#xff08;2&#xff09;/boot&#xff1a;包含内核和其它系统程序启动时使用的文件。 &#xff08;3&#xff09;/dev&#xff1a;设备文件所在目录。在操作系统中…

数据结构 ——— 单链表oj题:返回链表的中间节点

目录 题目要求 手搓简易单链表 代码实现 题目要求 给你单链表的头节点 head &#xff0c;请你找出并返回链表的中间节点 如果有两个中间节点&#xff0c;则返回第二个中间节点 要求算法的时间复杂度为&#xff1a;O(N) 手搓简易单链表 代码演示&#xff1a; // 单链表中…

Java Web应用升级故障案例解析

在一次Java Web应用程序的优化升级过程中&#xff0c;从Tomcat 7.0.109版本升级至8.5.93版本后&#xff0c;尽管在预发布环境中验证无误&#xff0c;但在灰度环境中却发现了一个令人困惑的问题&#xff1a;新日志记录神秘“失踪”。本文深入探讨了这一问题的排查与解决过程&…

【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构

一、html5 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><script type"text/javascript" src"http://51.onelink.ynwlzc.net/o2o/tpl/Merchant/static/js…

onload_tcpdump命令抓包报错Onload stack [7,] already has tcpdump process

最近碰到Onload 不支持同时运行多个 tcpdump 进程的报错&#xff0c;实际上使用了ps查询当时系统中并没有tcpdump相关进程存在。需要重启服务器本机使用onload加速的相关进程后才能使用onload_tcpdump正常抓包&#xff0c;很奇怪&#xff0c;之前确实没遇到这样的问题&#xff…

Golang | Leetcode Golang题解之第450题删除二叉搜索树的节点

题目&#xff1a; 题解&#xff1a; func deleteNode(root *TreeNode, key int) *TreeNode {var cur, curParent *TreeNode root, nilfor cur ! nil && cur.Val ! key {curParent curif cur.Val > key {cur cur.Left} else {cur cur.Right}}if cur nil {retur…

金镐开源组织成立,增加最新KIT技术,望能为开源添一把火

国内做开源的很多&#xff0c;知名的若依、芋道源码、Pig、Guns等&#xff0c;可谓是百花齐放&#xff0c;虽然比不上Apache&#xff0c;但也大大提高了国内的生产力。经过多年的发展&#xff0c;一些开源项目逐渐也都开始商业化。基于这样的背景&#xff0c;我拉拢了三个技术人…

【重学 MySQL】三十九、Having 的使用

【重学 MySQL】三十九、Having 的使用 基本语法示例示例 1&#xff1a;使用 HAVING 过滤分组示例 2&#xff1a;HAVING 与 WHERE 的结合使用 注意点WHERE 与 HAVING 的对比基本定义与用途主要区别示例对比总结 在 MySQL 中&#xff0c;HAVING 子句主要用于对 GROUP BY 语句产生…