缓存图像的 CORS 策略

2024-02-09

在 chrome 22 和 safari 6 中。

使用启用 CORS 的 S3 存储桶从 s3 加载图像以在画布中使用(以提取为主要目的),代码如下:

<!-- In the html -->
<img src="http://s3....../bob.jpg" /> 

// In the javascript, executed after the dom is rendered
this.img = new Image();
this.img.crossOrigin = 'anonymous';
this.img.src = "http://s3....../bob.jpg";

我观察到以下情况:

  1. 禁用缓存
  2. 一切正常,两张图片都加载了

然后在启用缓存的情况下尝试:

  1. 启用缓存
  2. DOM图像加载,canvas图像创建dom安全异常

如果我修改代码的 javascript 部分以附加查询字符串,如下所示:

this.img = new Image();
this.img.crossOrigin = 'anonymous';
this.img.src = "http://s3....../bob.jpg?_";

即使完全启用缓存,一切正常。我通过使用 http 代理发现缓存是一个问题,并观察到在失败的情况下,实际上并未从服务器请求图像。

我被迫得出的结论是,图像缓存正在保存原始请求标头,然后将其用于后续启用 CORS 的请求 - 并且由于违反同源策略而生成安全异常。

这是有意的行为吗?

编辑:在 Firefox 中工作。

Edit2:s3 存储桶上的 Cors 策略

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

我使用的是全开,因为我现在只是从本地盒子进行测试。这还没有投入生产。

Edit3:更新了 cors 策略以指定来源

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://localhost:5000</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
    </CORSRule>
</CORSConfiguration>

已验证的传出标头:

Origin  http://localhost:5000
Accept  */*
Referer http://localhost:5000/builder
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.3

传入标头:

Access-Control-Allow-Origin http://localhost:5000
Access-Control-Allow-Methods    GET
Access-Control-Allow-Credentials    true

如果我在加载到画布时没有破坏缓存,chrome 中仍然会失败。

Edit 4:

刚刚在失败案例中注意到了这一点。

传出标头:

GET /373c88b12c7ba7c513081c333d914e8cbd2cf318b713d5fb993ec1e7 HTTP/1.1
Host    amir.s3.amazonaws.com
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.91 Safari/537.4
Accept  */*
Referer http://localhost:5000/builder
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.3
If-None-Match   "99c958e2196c60aa8db385b4be562a92"
If-Modified-Since   Sat, 29 Sep 2012 13:53:34 GMT

传入标头:

HTTP/1.1 304 Not Modified
x-amz-id-2  3bzllzox/vZPGSn45Y21/vh1Gm/GiCEoIWdDxbhlfXAD7kWIhMKqiSEVG/Q5HqQi
x-amz-request-id    48DBC4559B5B840D
Date    Sat, 29 Sep 2012 13:55:21 GMT
Last-Modified   Sat, 29 Sep 2012 13:53:34 GMT
ETag    "99c958e2196c60aa8db385b4be562a92"
Server  AmazonS3

I think这是第一个请求,由 dom 触发。我不知道这不是 javascript 请求。


问题是图像是从以前的请求中缓存的,没有所需的 CORS 标头。因此,当您再次请求它时,对于指定了“crossorigin”的画布,浏览器使用缓存的版本,看不到必要的标头,并引发 CORS 错误。 当您将“?_”添加到 URL 时,浏览器会忽略缓存,因为这是另一个 URL。 看看这个线程:https://bugs.chromium.org/p/chromium/issues/detail?id=409090 https://bugs.chromium.org/p/chromium/issues/detail?id=409090

Firefox 和其他浏览器不存在这个问题。

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

缓存图像的 CORS 策略 的相关文章

随机推荐

  • 向现有 MongoDB 文档添加字段(在 Node.js 中使用 Mongoose)

    我在集合中有这个现有文档Article在 MongoDB 数据库中 site www atlantico fr date 2014 05 27T11 10 19 000Z link http www atlantico fr example
  • 如何从 SQLite android 中的表中删除行? [复制]

    这个问题在这里已经有答案了 我已经这样做了 但它不起作用 我正进入 状态force close public boolean favoriteDelete int id return database delete FavoriteData
  • 在 C++ main() 执行之前处理 Mac OS X 文件打开事件

    我用谷歌搜索了很多 但仍然找不到好的解决方案 因此 我将一个复杂的 Qt5 应用程序 某些网络服务的客户端 移植到 Mac OS X 10 7 0 Lion 及更高版本 我需要处理自定义文件 例如 xyz和自定义 URL 方案 例如xyz
  • zsh:在目录分隔符上停止向后杀字

    In zsh http www zsh org 我如何设置行编辑器 以便backward kill word停在目录分隔符上 目前在我的 bash 设置中 如果我输入 cd devel sandbox 然后打C w点将紧随其后devel 在
  • 模型工厂中的 Laravel 5.1 外键

    如何在模型工厂中定义外键 例如 如果我有一个组织表 其中包含国家 地区表的外键 则在我的模型工厂中 我必须为国家 地区 ID 定义一个虚拟值 如下所示 factory gt define App Organisation class fun
  • 为什么这个类/实例变量没有被初始化?

    我正在尝试使用 gnu smalltalk 在以下带有变量的简单类的代码中 我发现它没有初始化为给定值 Object subclass Myclass mainval mainval 555 getmainval mainval gc My
  • Hibernate - 具有排序顺序的多列索引

    我有以下代码 Table appliesTo MyTable indexes Index name MultipleColumnsIndex columnNames column1 columns2 注意 这是 Hibernate 表 通过
  • 有效筛选唯一值的数据 (Python)

    我有一个由 X Y Z A 值组成的 2D Numpy 数组 其中 X Y Z 是 3D 空间中的笛卡尔坐标 A 是该位置的某个值 举个例子 X Y Z A 13 7 21 1 5 9 2 7 0 5 15 3 9 1 1 13 7 21
  • 将列表应用于输出数据帧的函数

    我的单参数函数输出一个数据帧 library tidyverse myfun lt function x mtcars gt filter x gt group by cyl gt summarise mean disp mean drat
  • 如何在 Swift 中创建 _inline_ 递归闭包? [复制]

    这个问题在这里已经有答案了 对于 Swift 中的全局函数来说 递归是微不足道的 例如 func f f 但是 闭包不能引用自身 例如 var f Void gt Void f 产生以下错误 Variable used within its
  • 如何处理 jQuery 中的表单更改?

    在 jQuery 中 有没有一种简单的方法来测试是否any表单的元素发生了变化 假设我有一个表单和一个带有以下内容的按钮click event mybutton click function Here is where is need to
  • 如何从烂番茄上抓取一页以上的评论?

    我一直在使用这个抓取工具来抓取此网址的评论家评论 https www rottentomatoes com m avengers endgame reviews https www rottentomatoes com m avengers
  • java-8 过滤列表而不创建新列表

    我正在寻找使用简单的 lambda 来过滤 Java 8 中的列表的最干净的方法Predicate 无需创建新列表 特别是 该解决方案不合适 因为toList 返回一个新的List List
  • 回滚 Laravel 中的一项特定迁移

    I want 仅回滚 Rolled back 2015 05 15 195423 alter table web directories I run php artisan migrate rollback 我的 3 个迁移正在回滚 Rol
  • PHP Sort 函数用于对对象数组进行排序

    我有一个充满同一类对象的数组 例如 我想通过可选对象字段对该数组进行排序 case gt ID or case gt Sender 是否有内置的 array sort 函数可以执行此操作 或者我必须自己编写此排序函数 答案不必详细解释 这更
  • 沉默的例外,

    我在 64 位中遇到过这个奇怪的静默异常问题 到底是什么原因导致这种行为呢 我想了解为什么会发生这种情况以及推荐的解决方案是什么 消失的 OnLoad 异常 http blog paulbetts org index php 2010 07
  • 如何处理 IncompleteRead: 在 python 中

    我正在尝试从网站获取一些数据 然而它返回了我incomplete read 我试图获取的数据是一组巨大的嵌套链接 我在网上做了一些研究 发现这可能是由于服务器错误 之前的分块传输编码完成 达到预期大小 我还找到了上述问题的解决方法link
  • Nifi:如何使 ListenHTTP 与 SSL 配合使用

    客观的 由于 Nifi 通过 HTTP 与其他工具集成 我必须ListenHTTP处理器面向公众 所有 3 个环境上的 API 网关对我来说太贵了 所以我关闭了所有虚拟机入口端口 除了ListenHTTP 对于外部网络 Issue 我的配置
  • 从终端打开 iPhone 应用程序

    是否可以从终端打开 iPhone 应用程序或 Xcode 项目 我已经尝试过 open path to project app 但这会返回警告并由于启动模拟器时出现图像加载错误而意外退出 有没有人有什么建议 您无法从终端启动 iPhone
  • 缓存图像的 CORS 策略

    在 chrome 22 和 safari 6 中 使用启用 CORS 的 S3 存储桶从 s3 加载图像以在画布中使用 以提取为主要目的 代码如下 img src http s3 bob jpg In the javascript exec