画布被 CORS 数据和 S3 污染

2023-11-24

我的应用程序正在显示存储在AWS S3(出于安全原因,位于私人存储桶中)。

为了允许用户从浏览器中查看我生成的图像签名 URL like https://s3.eu-central-1.amazonaws.com/my.bucket/stuff/images/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Date=20170701T195504Z&X-Amz-Expires=900&X-Amz-Signature=bbe277...3358e8&X-Amz-SignedHeaders=host.
这与完美配合<img src="S3URL" />:图像正确显示。
我什至可以通过复制/粘贴 URL 来直接查看另一个选项卡中的图像。

我还生成嵌入这些图像的 PDF,这些图像之前需要使用canvas:调整大小并加水印。

但我用于调整大小的库遇到了一些麻烦:

Failed to execute 'getImageData' on 'CanvasRenderingContext2D':
The canvas has been tainted by cross-origin data.

事实上我们正处于一个CORS上下文,但我已经设置了所有内容,以便可以将图像显示给用户,并且确实可以正常工作。
所以我不确定理解这个错误的原因:这是另一个 CORS 安全层吗:浏览器担心我可能出于恶意目的更改图像?

我尝试设置一个宽松的CORS配置在 S3 存储桶上:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

And img.crossOrigin = "" or img.crossOrigin = "Anonymous"在客户端,但随后我得到:

Access to Image at 'https://s3.eu-central-1.amazonaws.com/...'
from origin 'http://localhost:5000' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:5000' is therefore not allowed access.

可能缺少哪些 AWS/S3 端和/或客户端配置?


这里的一种解决方法是阻止浏览器缓存下载的对象。这似乎源于 S3 与 Chrome 处理缓存对象的方式交互的不正确行为。我最近回答过关于服务器故障的类似问题,您可以在那里找到更多详细信息。

当您从简单的 HTML(例如<img>tag),然后在跨域上下文中再次获取相同的对象。

Chrome 会缓存第一个请求的结果,然后使用缓存的响应,而不是在第二次发出新请求。当它检查缓存的对象时,没有Access-Control-Allow-Origin标头,因为它是从不受 CORS 规则约束的请求中缓存的...因此,当发出第一个请求时,浏览器不会发送Origin标头。因此,S3 没有回复Access-Control-Allow-Origin标头(或任何与 CORS 相关的标头)。

问题的根源似乎与 HTTP 有关Vary:响应头,与缓存相关。

Web 服务器(本例中为 S3)可以使用Vary:响应头向浏览器发出信号,表明服务器能够生成返回对象的多种表示形式——以及浏览器是否愿意vary请求、响应的属性might不同。当浏览器考虑使用缓存对象时,它应该检查该对象在新上下文中是否有效,然后再得出缓存对象适合当前需要的结论。

事实上,当您发送Origin向 S3 请求标头,您会得到一个响应,其中包括Vary: Origin。这告诉浏览器,如果请求中发送的源是不同的值,则响应也可能不同——例如,因为并非所有源都被允许。

根本问题的第一部分是 S3——可以说——应该always return Vary: Origin每当在存储桶上配置 CORS 时,即使浏览器没有发送原始标头,因为Vary可以针对您实际未包含在请求中的标头指定,以告诉您如果包含它,响应可能会有所不同。但是,当Origin不存在。

问题的第二部分是 Chrome——当它查询其内部缓存时——发现它已经拥有该对象的副本。播种缓存的响应不包括Vary,因此 Chrome 假定该对象对于 CORS 请求也完全有效。显然,事实并非如此,因为当 Chrome 尝试使用该对象时,它发现跨域响应标头丢失。据推测,Chrome 是否收到了Vary: OriginS3 对原始请求的响应,它会意识到第二个请求的临时请求标头包括Origin:,因此它会正确地获取对象的不同副本。如果这样做了,问题就会消失——正如我们通过设置所说明的那样Cache-Control: no-cache对象上,阻止 Chrome 缓存它。但是,事实并非如此。

因此,我们通过设置来解决这个问题Cache-Control: no-cache在 S3 中的对象上,这样 Chrome 就不会缓存第一个对象,而是为第二个对象发出正确的 CORS 请求,而不是尝试使用缓存的副本,这会失败。

请注意,如果您想避免更新 S3 中的对象以包含Cache-Control: no-cache响应,还有另一种选择可以解决此问题,而无需实际将标头添加到 S3 中的静态对象。实际上,还有两个选择:

S3 API 尊重在查询字符串中传递的值response-cache-control=no-cache。将其添加到签名 URL 将指示 S3 将标头添加到响应中,无论Cache-Control与对象一起存储的元数据值(或缺少)。您不能简单地将其附加到查询字符串中——您必须将其添加为 URL 签名过程的一部分。但是一旦将其添加到代码中,您的对象将返回Cache-Control: no-cache在响应标头中。

或者,如果您可以在呈现页面时分别为同一对象生成这两个签名 URL,则只需更改其中一个签名 URL 相对于另一个签名 URL 的过期时间即可。延长一分钟,或者类似的事情。将过期时间从一个更改为另一个将强制两个签名 URL 不同,并且具有两个不同查询字符串的两个不同对象应被 Chrome 解释为两个单独的对象,这也应该消除第一个缓存对象的错误使用以满足其他请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

画布被 CORS 数据和 S3 污染 的相关文章

  • 如何在画布中旋转图表同时保持数字垂直?

    我正在尝试围绕其中心旋转画布中的图表 同时保持字母直立 我正在尝试使用 ctx rotate 但它使用画布的左侧作为中心来旋转整个图表 以下链接提供了视觉效果 我希望它看起来像绿色 而不是红色 就像我的代码当前所做的那样 视觉解释 http
  • Elastic Beanstalk、Bundler 找不到 gem“bundler”的兼容版本

    我已经尝试过将 Elastic Beanstalk 用于 Rails 当我运行 eb deploy 时出现此错误 我需要至少安装bundler 1 8 4 知道如何解决这个问题吗 Bundler could not find compati
  • 使用 AWS API Gateway 和 Lambda 从 multipart/form-data 获取非文件正文

    我正在尝试从multipart form data POST通过 API 网关连接到我的 AWS Lambda Web 服务 超文本传输 协议POST具有内容类型 multipart form data 和 URL 编码的正文 文件数据也在
  • java设置图像的分辨率和打印尺寸

    我编写了一个程序 生成一个 BufferedImage 以显示在屏幕上 然后打印 图像的一部分包括 1 像素宽的网格线 即 一行为1个像素 行与行之间大约有10个像素 由于屏幕分辨率的原因 图像显示得比这大得多 每行有几个像素 我想将其绘制
  • Tkinter:无法识别图像文件中的数据[重复]

    这个问题在这里已经有答案了 我有以下问题 我使用外部应用程序生成 GIF 文件 对我来说 GIF 看起来不错 我可以毫无问题地打开它们 然而 使用 photo PhotoImage file screenshot file self pre
  • Javascript图像编辑插件

    在哪里可以找到 Javascript 或 jQuery 图像编辑器插件 用户可以单击图像进行编辑 并且该插件允许他们进行裁剪 调整大小 旋转 翻转等 Pixastic http pixastic com lib 不再活跃 和CamanJS
  • Android:自动从项目包中删除未使用的图像

    我正在开发一个相当大的android项目 并且在drawable文件夹中有很多图像 其中许多图像未在项目中使用 因为它们已被替换 并且占用了宝贵的空间 有什么方法可以自动找到这些图像并删除它们 而不是搜索项目中的每个图像 我使用过的一些工具
  • 亚马逊 AWS CloudFront 声称不存在这样的存储桶

    我正在尝试设置 CloudFront 来提供图像 但当前无法访问它并返回错误 指定的存储桶不存在
  • 从 EC2 W2008 实例创建 AMI - 为什么从来没有获得密码?

    我正在尝试做什么 我正在尝试克隆 EC2视窗2008通过管理控制台实例 该实例基于 Windows Server2008 i386 Base v104 ami 92ba43fb 但上面安装了许多应用程序 我想为新实例保留这些应用程序 发生了
  • 在没有签名 URL 的情况下使用 CloudFront/S3 设置内容处置

    我有一些具有公共读取访问权限的对象 这些对象仅限于通过 CloudFront 提供服务 当我尝试传递一个response content disposition参数到我的 CloudFront URL 我收到 S3 错误 Request s
  • JS - 如何将图像对象变成灰度并显示它

    基本上 当单击按钮时 它会告诉移动设备转到相机 一旦相机拍照 它就会给我图像数据 它被称为数据 URL 吗 这是我处理它的代码 var imagesrc data image jpeg base64 imageData var myimag
  • HTML5 Canvas 性能:加载图像与绘图

    我正计划使用 javascript canvas 编写一个游戏 我只有一个问题 在加载图像与仅使用 canvas 的方法进行绘图方面 我应该考虑什么样的性能考虑因素 因为我的游戏将使用非常简单的几何图形 圆形 正方形 直线 所以任何一种方法
  • 在 Swift 中将 gif 保存到 iOS 照片库

    我正在尝试保存位于已使用 Regift 代码创建的临时文件中的 GIF 图像 Regift https github com matthewpalmer Regift https github com matthewpalmer Regif
  • 如何使用对象标记上传到 AWS S3

    有没有办法使用标签将文件上传到AWS S3 不将标签添加到S3中的现有文件 对象 我需要让该文件与我的 Tags 一起出现在 S3 中 即在单个 API 调用中 我需要这个 因为我使用 Lambda 函数 使用这些 S3 对象标签 由 S3
  • S3 不返回 Access-Control-Allow-Origin 标头?

    我无法强制 S3 在从存储桶返回的所有对象上设置 CORS 标头 尽管启用了 CORS 但由于客户端 S3 上传正在工作 返回的对象没有 CORS 标头 我启用的策略是
  • 如何将图像转换为 UIImage?

    如何转换 SwiftUIImage to a UIImage let image Image systemName circle fill let UIImage image as UIImage 没有直接的方法将 Image 转换为 UI
  • C# 代码上的 ImageURL 不显示图像

    我在 aspx 页面上有图像
  • 我们能否知道回形针下载何时完成?

    我有一个应用程序 我需要知道用户的 Rails Paperclip 文件下载时间complete 我的应用程序设置为与 Amazon S3 交互 当用户收到完整的文件时 我需要运行 JavaScript 函数 我怎样才能做到这一点 跟踪天气
  • 将密钥对添加到现有 EC2 实例

    我被给予AWS控制台访问正在运行 2 个实例的帐户 但我无法关闭 在生产中 但是 我想获得对这些实例的 SSH 访问权限 是否可以创建一个新的密钥对并将其应用到实例 以便我可以通过 SSH 访问 获取现有的pem当前无法选择创建实例所用的密
  • 有没有办法从画布上清除一个元素而不消除其他元素?

    我正在使用画布构建页面加载器 并使用 es6 类 虽然目前我无法使其正常工作 原因之一是我找不到清除画布的方法进展 到目前为止 这是我的代码 class Loader constructor width height this width

随机推荐

  • 修改 emacs 向前单词/向后行为(就像 vi/vim 中一样)

    实现与 vim 中的单词来回导航相同的行为的最简单方法是什么 在vim中 当你按 w 它将光标向前移动一个单词 其中单词由一系列字母 数字和下划线组成 或者由一系列其他非空白字符组成 并用空格 空格 制表符 eol 分隔 另一方面 在 em
  • 如何在 C# 中设置 .net teradata 连接?

    我正在尝试使用 c 连接到 Teradata 我正在使用来自的示例代码这个网站 using System using System Collections Generic using System Text using Teradata C
  • 任务“:app:dexDebug”Android Studio 执行失败

    该应用程序能够在更新我的 android studio 之前执行 这是我收到的错误 Error Execution failed for task app dexDebug gt com android ide common process
  • 将 Java FX 2.0 添加到现有 Netbeans 项目

    我在 Netbeans 中有一个使用 Swing 的现有 Java 项目 我想开始对该项目中的某些组件使用 Java FX 2 0 我已经下载了最新版本的 JDK 1 7 0 03 并启用了 JavaFX 但是当我尝试添加import ja
  • 如何访问超级视图控制器?

    我有一个问题 我会尝试解释这个问题 我有一个主要的UIViewController 全屏 我有一个二级UIViewController 设定范围 我将辅助视图添加到了我的mainView使用这个 mainController view ad
  • java中数据库中的Json对象

    谁能帮我如何从数据库创建 JSON 对象 这就是JSON 输出应该看起来像 devicelist device id 01 type CAM name Livingroom id 15 type CAM name Kitchen This
  • 防止提交时默认:- Angularjs

    如果填写表单时电子邮件为空 我想防止 http post 的默认操作为 sign Up 控制器代码 scope signUp function if scope email null preventdefault html 玉 form n
  • PowerShell 复制项目方法失败 - 文件名中包含括号

    我正在尝试使用 PowerShell v 1 仅复制与模式匹配的文件 文件命名约定是 Daily Reviews 0001 0871 journal Daily Reviews 1002 9887 journal 当我运行它时 方法 Cop
  • 尝试在 WinXP 上使用 pyserial 打开串行端口 ->“访问被拒绝”

    我正在尝试使用 python 和 pyserial 通过串口将数据发送到 hplc 泵 我在 linux gentoo 的衍生版本 下测试了电缆和泵 尽管是 root 但它工作得很好 现在我必须在WinXP机器上使用代码 在尝试打开端口时我
  • Dapper.net Oracle 参数

    我正在尝试将 Dapper net 与 Oracle 一起使用 由此post我知道我们可以使用没有前缀的参数 然后 dapper 就可以同时使用sql serverand oracle 如果没有显式的 oracle 命名参数前缀 我很难让它
  • Javascript在数组中找到最接近的数字而不进行下探

    例如 我有一个数字数组 300 500 700 1000 2000 3000 我想找到最接近的数字 而不低于给定的数字 例如 搜索 2200 将返回 3000 而不是 2000 但是 如果我搜索 3200 因为数组中没有更高的值 它应该返回
  • 将php对象存储在html表单元素上并通过GET方法传递php对象?

    我可能听起来有点奇怪 但是有办法吗 例如 我有一个 PHP 对象 foo 有没有办法通过某些对象加密函数以 HTML 表单 隐藏输入 存储该对象 然后使用解密函数检索该对象 同样 我可以通过 GET 方法传递这些对象吗 就像其他地方已经指出
  • React useEffect 导致:无法对未安装的组件执行 React 状态更新

    获取数据时 我得到 无法在未安装的组件上执行 React 状态更新 该应用程序仍然有效 但反应表明我可能会导致内存泄漏 这是一个空操作 但它表明应用程序中存在内存泄漏 要修复此问题 请取消 useEffect 清理函数中的所有订阅和异步任务
  • C# 读取注册表:ProductID 在 x86 目标应用程序中返回 null。 “任何CPU”都可以正常工作

    我最近搬到了一台装有 VS 2010 的 W7 64 位机器 我的项目设置为运行Any CPU 当我将其更改为目标时x86我注意到我的一些注册表调用不再起作用 我正在尝试阅读ProductID像这样的字段 RegistryKey windo
  • Bootstrap carousel:如何同时滑动两个carousel滑块?

    我在单个页面上有三个轮播滑块 我希望它们同时移动其中两个 即两者应该同时更改滑块图像 两者都有相同数量的图像 幻灯片 这是我正在使用的代码 jQuery carousel example generic1 carousel example
  • Interface Builder 中的颜色错误

    问题 我在 Interface Builder 中设置了颜色 设置了 RGB 通道 然后对工作窗口进行了屏幕截图 在 Photoshop 中打开它 并通过颜色选择器 我在 Interface Builder 中设置 检查颜色 结果 RGB值
  • 在 64 位 Windows 7 上使用 32 位版本的 ODBC?

    我在使用 ODBC 和使用 Visual Basic 6 因此它是 32 位 编写的应用程序时遇到问题 看来VB6的ODBC库与Windows 7的64位ODBC不兼容 返回的错误码是 2147220992并且它在谈论不兼容的架构 我可以安
  • QMake CONFIG() 函数和“主动配置”

    在阅读 Qt 5 1 的文档 特别是 qmake 的文档时 我对 qmake CONFIG 函数文档中给出的解释感到困惑 我完全理解该函数的单参数版本 但双参数版本对我来说完全没有意义 我认为我的困惑来自于缺乏 活动配置 的定义 因为 Qt
  • Puppeteer 登录 page.evaluate 内

    我如何console log page evaluate中的某些内容 将其传递给节点并使用它during页面的评价 我实际上想将 page evaluate 的进度记录到控制台并向用户显示一些结果 puppeteer 12 的更新 改编自当
  • 画布被 CORS 数据和 S3 污染

    我的应用程序正在显示存储在AWS S3 出于安全原因 位于私人存储桶中 为了允许用户从浏览器中查看我生成的图像签名 URL like https s3 eu central 1 amazonaws com my bucket stuff i