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

news2024/11/17 9:25:05

背景

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。

<meta
  http-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.coloradmin.cn/o/2173287.html

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

相关文章

阿里发布Qwen2.5:编程与数学的AI新革命!

阿里发布Qwen2.5&#xff1a;编程与数学的AI新革命&#xff01; 阿里发布了Qwen2.5系列模型&#x1f680;&#xff0c;带来编程和数学领域的超强升级&#x1f9b8;‍♂️。多种规格可选&#xff0c;开源模型推动创新&#x1f513;&#xff0c;让AI助手更智能&#xff01;快来体…

一阶低通滤波器Simulink仿真测试

1、低通滤波器(SMART PLC双线性变化和后向差分对比测试 低通滤波器(SMART PLC双线性变换和后向差分对比测试)_后向差分 和 双线性-CSDN博客文章浏览阅读367次。该博客详细探讨了低通滤波器的设计,对比了SMART PLC中的双线性变换和后向差分法。内容包括Tustin变换公式、后向差…

第一批学习大模型的程序员,已经碾压同事了,薪资差距都甩出一条街了...

前言 随着人工智能技术的突飞猛进&#xff0c;AI大模型已成为引领未来的核心技术。从ChatGPT的横空出世到GPT-4o的震撼发布&#xff0c;AI技术正以前所未有的速度改变着我们的生活和工作方式。 在这场AI革命中&#xff0c;企业对AIGC人才的需求正以指数级增长。据《AIGC就业趋…

基于Hive和Hadoop的病例分析系统

本项目是一个基于大数据技术的医疗病历分析系统&#xff0c;旨在为用户提供全面的病历信息和深入的医疗数据分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

OpenAi_Moderation审核更新

更新原文档 最新openai-python版本已不可直接用 openai.Moderation.create()

芝法酱学习笔记(0.5)——使用jenkins做自动打包

前言 上节讲了SpringBoot上的打包。但这些过程都是手动的&#xff0c;在实际的开发测试时&#xff0c;自动化的打包部署&#xff0c;可以大大提升团队开发的效率 一、去官网下载 1.1 官网安装命令 对于如何安装的问题&#xff0c;我向来推荐官网 wget -O /usr/share/keyri…

论文阅读:LM-Cocktail: Resilient Tuning of Language Models via Model Merging

论文链接 代码链接 Abstract 预训练的语言模型不断进行微调&#xff0c;以更好地支持下游应用。然而&#xff0c;此操作可能会导致目标领域之外的通用任务的性能显著下降。为了克服这个问题&#xff0c;我们提出了LM Cocktail&#xff0c;它使微调后的模型在总体上保持弹性。…

解决Mac 默认设置 wps不能双面打印的问题

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 使用mac电脑的时候&#xff0c;发现wps找不到双面打印的按钮&#xff0c;导致使用wps打开的所有文件都不能自动双面打印 问题解决&#xff1a; mac的wps也是有双面打印的选项&#xff0c;只是默认被关…

双指针算法【算法 18】

双指针算法 在算法设计与实现中&#xff0c;双指针算法是一种非常高效且常用的技术&#xff0c;尤其适用于处理数组和字符串相关的问题。通过维护两个指针&#xff08;通常称为“快指针”和“慢指针”&#xff09;&#xff0c;双指针算法能够在对数组或字符串进行单次遍历的同时…

VSCode rust文件中的api点击无法跳转问题

如果配置了vscode的setting.json windows端的话 "settings": { "typescript.tsc.autoDetect": "off","rust-analyzer.linkedProjects": [".\\gui-btn\\Cargo.toml",".\\temp\\Cargo.toml", ],其他端类似 能不…

电脑怎么进行网页限制操作?

1、修改Hosts文件&#xff1a; 打开文件资源管理器&#xff0c;导航至C:\Windows\System32\drivers\etc\目录&#xff08;注意&#xff0c;修改前最好备份原文件&#xff09;。 找到并打开hosts文件&#xff0c;以管理员身份运行文本编辑器进行编辑。 在文件末尾添加一行&am…

基于Springboot投稿和稿件处理系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

Java | Leetcode Java题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; class Solution {public int arrangeCoins(int n) {return (int) ((Math.sqrt((long) 8 * n 1) - 1) / 2);} }

【STM32开发环境搭建】-2-安装STM32CubeMX

目录 1 下载STM32CubeMX 2 使用STM32CubeMX 2.1 设置Embedded software Package存放路径 2.2 下载并安装STM32的Embedded software Package 结尾 1 下载STM32CubeMX 注册一个ST的账号&#xff0c;单击STM32CubeMX - STM32Cube初始化代码生成器 - 意法半导体STMicroelectr…

《 C++ 修炼全景指南:十三 》为什么你的代码不够快?全面掌控 unordered_set 和 unordered_map 的哈希性能飙升魔法

摘要 本文深入探讨了 C 标准库中的两大无序容器——unordered_set 和 unordered_map&#xff0c;从底层实现、核心操作、性能优化、实际应用等多个方面进行了全面分析。首先&#xff0c;文章介绍了这两种容器的基本概念&#xff0c;说明了它们基于哈希表实现的特点&#xff0c…

AMD ROCm™ 安装指南

AMD ROCm™ installation — ROCm Blogs 注意: 本文之前是 AMD 实验笔记博客系列的一部分。 AMD ROCm™ 是第一个面向 HPC/超大规模级 GPU 计算的开源软件开发平台。AMD ROCm™ 将 UNIX 的选择权、极简主义和模块化软件开发哲学引入 GPU 计算领域。有关更多信息&#xff0c;请参…

华为OD机试 - 小明的幸运数(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

modelsim仿真出现的问题

问题&#xff1a;仿真波形没有结果 解决 点击Optimization Options 选第二个 右键testbench&#xff0c;Add Wave&#xff0c;快速添加 如何更改字体大小 Tools Edit Preference

latex设置背景颜色

\documentclass{article} \usepackage{xcolor} % 定义颜色&#xff0c;将#FCF9EA转换为LaTeX的颜色定义 \definecolor{mycolor}{HTML}{FCF9EA} % 设置页面颜色 \pagecolor{mycolor} \begin{document} This is a test page with the background color set to \# FCF9E…

如何巧妙运用Shell变量:掌握脚本编程的核心技巧

目录 前言一、Shell变量——变量类型1、用户自定义变量2、环境变量用./ 启动脚本文件记得加权限哦 二、Shell变量——变量赋值和访问(一&#xff09;变量定义(二&#xff09;变量的使用(三&#xff09;删除变量(四&#xff09;添加环境变量(五&#xff09;内部变量(六&#xff…