- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序显示存储在 中的图像AWS S3 (出于安全原因,在私有(private)存储桶中)。
为了让用户从他们的浏览器中看到图像,我生成了 签名 URL 喜欢 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.
<?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>
img.crossOrigin = ""
或
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.
最佳答案
这里的一种解决方法是防止浏览器缓存下载的对象。这似乎源于 S3 与 Chrome 处理缓存对象的方式交互的部分可以说是不正确的行为。我最近回答 a similar question on Server Fault ,您可以在那里找到更多详细信息。
当您从简单的 HTML(如 <img>
标签)中从 S3 获取一个对象,然后在跨域上下文中再次获取相同的对象时,问题似乎出现了。
Chrome 缓存第一个请求的结果,然后使用缓存的响应而不是第二次发出新请求。当它检查缓存对象时,没有 Access-Control-Allow-Origin
header ,因为它是从不受 CORS 规则约束的请求中缓存的......所以当第一个请求发出时,浏览器没有发送 Origin
标题。因此,S3 没有回复 Access-Control-Allow-Origin
header (或任何与 CORS 相关的 header )。
问题的根源似乎与 HTTP Vary:
有关。响应头,与缓存相关。
Web 服务器(在本例中为 S3)可以使用 Vary:
响应 header 向浏览器发出信号,表明服务器能够生成不止一种返回对象的表示——以及浏览器是否会变化 请求的一个属性,响应 可能不同。当浏览器考虑使用缓存对象时,它应该检查该对象在新上下文中是否有效,然后才能得出缓存对象适合当前需求的结论。
确实,当您发送 Origin
时向 S3 发送请求 header ,您会得到包含 Vary: Origin
的响应.这告诉浏览器如果请求中发送的来源是不同的值,响应也可能不同——例如,因为并非所有来源都被允许。
潜在问题的第一部分是 S3 —— 可以说 —— 应该 总是 返回 Vary: Origin
每当在存储桶上配置 CORS 时,即使浏览器没有发送原始 header ,因为 Vary
可以针对您实际上并未包含在请求中的 header 指定,以告诉您如果包含它,响应可能会有所不同。但是,它不会那样做,当 Origin
不存在。
问题的第二部分是 Chrome——当它查询它的内部缓存时——看到它已经有一个对象的副本。为缓存设定种子的响应不包括 Vary
,因此 Chrome 假定此对象对于 CORS 请求也完全有效。显然,事实并非如此,因为当 Chrome 尝试使用该对象时,它会发现缺少跨域响应 header 。据推测,Chrome 是否收到了 Vary: Origin
S3 对原始请求的响应,它会意识到它的第二个请求的临时请求 header 包含 Origin:
,所以它会正确地去获取对象的不同副本。如果这样做,问题就会消失——正如我们通过设置 Cache-Control: no-cache
所说明的那样。在对象上,防止 Chrome 缓存它。但是,它没有。
因此,我们通过设置 Cache-Control: no-cache
来解决这个问题。在 S3 中的对象上,这样 Chrome 就不会缓存第一个,而是为第二个发出正确的 CORS 请求,而不是尝试使用缓存的副本,这会失败。
请注意,如果您想避免更新 S3 中的对象以包含 Cache-Control: no-cache
响应,还有另一个选项可以解决此问题,而无需实际将 header 添加到 S3 中的静止对象。其实还有两个选择:
S3 API 尊重在 response-cache-control=no-cache
的查询字符串中传递的值。 .将此添加到签名 URL 将指示 S3 将 header 添加到响应中,而不管 Cache-Control
与对象一起存储的元数据值(或缺少对象)。您不能简单地将其附加到查询字符串中——您必须将其添加为 URL 签名过程的一部分。但是一旦你将它添加到你的代码中,你的对象将返回 Cache-Control: no-cache
在响应头中。
或者,如果您可以在呈现页面时为同一对象分别生成这两个签名 URL,只需更改一个签名 URL 相对于另一个的过期时间。让它多一分钟,或者类似的东西。将过期时间从一个更改为另一个将强制两个签名的 URL 不同,具有两个不同查询字符串的两个不同对象应该被 Chrome 解释为两个单独的对象,这也应该消除第一个缓存对象的错误使用为另一个请求服务。
关于image - Canvas 被 CORS 数据和 S3 污染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44865121/
我正在尝试将我的插件提交到 mozilla 站点,但我收到了这个该死的警告: 代码(在 mf_options.js 中)非常简单(我认为问题只存在于“开始存储”和“结束存储”之间: // start
精简版 在下面的代码中,$1被污染了,我不明白为什么。 长版 我在运行 Foswiki在带有 -T 的 perl v5.14.2 系统上启用污点检查模式。 调试该设置的问题,我设法构建了以下 SSCC
我有一个 Controller ,其中 $scope 对象已用于存储仅在同一 Controller 中本地使用的方法和值。有很多这样的事情发生: $scope.foo = 'something'; $
我知道将不受信任的对象标记为受污染的可能性,但根本目的是什么,我为什么要这样做? 最佳答案 将污点作为一种安全预防措施进行跟踪,以确保不受信任的数据不会被错误地用于计算、交易或解释为代码。 通过内置语
我正在开始一个新的 react 项目,我刚刚安装了非常基本的包(npx create-react-app),没有任何其他东西。当我运行审核时,我得到以下低漏洞:
我知道关于这个特定主题有很多,但是我找不到任何偶然发现我的问题的人,希望有人可以向我解释这一点。 我有一个域,我在 equals 方法中使用注入(inject)的 grailsApplication
我在程序中使用许多不同的记录,其中一些使用相同的字段名称,例如 data Customer = Customer { ..., foo :: Int, ... } data Product = Pro
我有一个包含 2 个节点组的集群:实时和常规。我只希望能够实时容忍亲和性的 Pod 能够在来自实时集群的节点上运行。 我的方法是污染相关节点并向我要注册到该节点的 pod 添加容忍度。当我试图污染一个
在其中一个回复中,BalusC 已经提到了 初学者的一个常见错误是,他们将 servletcontainer/appserver 的库复制到/WEB-INF/lib 中,因为他们在 IDE 中遇到编译
最近我偶然发现了一个vulnerability in doT.js 。该漏洞的存在是因为攻击者可以利用原型(prototype)污染来修改传入 doT 的选项值。 示例: var doT = requ
我有一个带有多个命名空间的仅 header C++ 库。 例如一个头文件可能包含 //header1.h namespace library{ namespace componentA{ tem
我正在尝试将 svg 转换为图像并提示用户下载。 var chart = $(svg.node()) .attr('xmlns', 'http://www.w3.org/200
在 javascript 中,可以“覆盖”Object.prototype 的属性或方法。例如: Object.prototype.toString = function(){ return "s
当我们要写入一个数据项时,首先将包含数据的块带入缓存,然后将数据项写入缓存。这可能会导致缓存污染。为了避免这种情况,英特尔没有引入临时指令。 如果我要使用 mmap() 将数据写入文件并且永远不会再次
我可以感染一个节点,但不能感染一个实例组。 kubectl taint nodes nodeA kops.k8s.io/instancegroup=loadbalancer:NoSchedule 下面
我的应用程序显示存储在 中的图像AWS S3 (出于安全原因,在私有(private)存储桶中)。 为了让用户从他们的浏览器中看到图像,我生成了 签名 URL 喜欢 https://s3.eu-cen
总结 对于我的 CS 顶点项目,我们遇到了一个类名存在于两个不同依赖项中的问题。具体来说,我们使用一个依赖项将 MySQL 与 Entity Frame 一起使用,一个用于直接连接和执行 MySQL
我在 VS 2005 中有一个 VC++ 项目,我制作了 32 位和 64 位版本。我刚刚安装了 VS 2010 并试图将项目移植到较新的 Visual Studio。它不会移植,因为该项目引用了平台
我正在使用 Struts 2 v 2.3.16.3 和 tomcat 6。 用户将单击一个通过 id 查找对象的操作,页面将显示它。我遇到了一个零星的错误,用户会突然从另一台机器上的另一个用户那里得到
这个问题已经有答案了: Tainted Canvas, due to CORS and SVG? (2 个回答) 已关闭 4 年前。 我在 Angular JS 中有一个指令,允许将 SVG 导出为
我是一名优秀的程序员,十分优秀!