【问题标题】:Writing Flash crossdomain.xml for Amazon S3为 Amazon S3 编写 Flash crossdomain.xml
【发布时间】:2012-03-02 03:36:53
【问题描述】:

我有两台服务器。服务器 A 是一个内部服务器,可以从我办公室设置的外部世界访问。它上面运行着一个 Rails 服务器。我有第二台服务器,服务器 B,它包含我们所有的静态内容(图像、swfs、javascript、css 等),它是一个 Amazon S3 服务器。我已将所有这些文件公开访问。

我正在尝试将来自服务器 B 的 swf 放在服务器 A 提供的页面上。然后,该 swf 显示所需的其他资产从服务器 B 动态加载。然而,不幸的是,沿着它失败的方式,并且请求动态加载的文件永远不会到达。

基于我的浏览器控制台中的错误,swf 期望 crossdomain.xml 文件位于服务器 A 上。基于 this,它还需要一个位于我的 S3 服务器上。因此,在这种情况下,我创建了两个 crossdomain.xml 文件,每个服务器一个。

这是服务器 A 的 crossdomain.xml 文件:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE cross-domain-policy SYSTEM
  "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="s3-bucket-name.s3.amazonaws.com" />
</cross-domain-policy>

这是服务器 B 的 crossdomain.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>    
<!DOCTYPE cross-domain-policy SYSTEM
  "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <site-control permitted-cross-domain-policies="master-only"/>
  <allow-access-from domain="*.server-a.com"/>
  <allow-http-request-headers-from domain="*.server-a.com" headers="SOAPAction"/>
</cross-domain-policy>

另外,我在我的 swf 中显式加载服务器 B 的 crossdomain.xml 文件:

Security.loadPolicyFile("https://s3-bucket-name.s3.amazonaws.com/crossdomain.xml");

但是,无论我做什么,它都不起作用。我不确定还能尝试什么。我已经尝试在 SO 上查看许多解决方案,但没有任何东西可以帮助我解决我的问题。当然,其他人在这方面的经验比我多,可以给我一些指导,我现在几乎没有想法。

更新 用更多信息更新我的问题。

我尝试将两个策略文件都设置为 * 并且它开始工作直到它命中:

SecurityError: Error #2121: Security sandbox violation: Loader.content: s3.amazonaws.com/bucket_name/swfs/foo.swf cannot access s3.amazonaws.com/bucket_name/data/swfs/bar.swf. This may be worked around by calling Security.allowDomain.

此外,我运行了 Charles,它正在从我的本地服务器中提取 crossdomain.xml,但我在 s3 中看不到它。

更新 2 我尝试将此添加到加载程序:

var context:LoaderContext = new LoaderContext();
context.securityDomain = SecurityDomain.currentDomain;
context.applicationDomain = ApplicationDomain.currentDomain;
Loader.load(new URLRequest(_dataFile), context);

这导致文件实际下载!不幸的是,现在它崩溃了:

SecurityError: Error #2119: Security sandbox violation: caller s3.amazonaws.com/bucket_name/swfs/MainSwf.swf cannot access LoaderInfo.applicationDomain owned by s3.amazonaws.com/bucket_name/data/swfs/foo/SecondSwf.swf

我已尝试包括/不包括 context.applicationDomain = ApplicationDomain.currentDomain; 行,但这并没有解决问题。

实际发生崩溃的地方是在加载文件后我们获取应用程序域的稍后时间:loader_.contentLoaderInfo.applicationDomain.getDefinition( def.a )

【问题讨论】:

  • (1) 你用的是URLLoader,还是Loader? (2) 将两个文件都更改为 domain="*" 看看会发生什么。 (3) 运行 Charles 或其他一些本地代理服务器,查看是否正在请求(和提供)文件。
  • 1.装载机; 2.我刚试过这个,它开始加载直到它这样做:SecurityError:错误#2121:安全沙箱违规:Loader.content:s3.amazonaws.com/bucket_name/swfs/foo.swf无法访问s3.amazonaws.com/bucket_name/data/swfs/bar.swf。这可以通过调用 Security.allowDomain 来解决。
  • 此外,我运行了 Charles,它正在从我的本地服务器中提取 crossdomain.xml,但我在 s3 中看不到它。

标签: actionscript-3 amazon-s3 flash crossdomain.xml


【解决方案1】:

确保 crossdomain.xml 的 mime 类型设置为 application/xml。如果 MIME 类型设置不正确,Flash 将不会加载策略文件。结帐CloudBerry's免费s3客户端,它非常擅长检测/设置正确的mimetype,可能你使用的s3客户端没有正确设置。

编辑:Apache 和其他网络服务器检测文件的 mime 类型并将其返回到响应标头中 - 所以这个问题通常不会出现在本地测试中

【讨论】:

  • 这是在 xml 文件本身中设置的吗?
  • 否,上传文件到s3时设置(需要手动设置content-type header)。 Apache 自动检测文件的 mime 类型并在 Content-Type 标头中返回它。
【解决方案2】:

终于解决了。确保您使用存储桶名称作为策略文件加载和每个文件/URL 请求的子域。

解决方案:

http://onegiantmedia.com/cross-domain-policy-issues-with-flash-loading-remote-data-from-amazon-s3-cloud-storage

【讨论】:

  • +1 这解决了我们的问题。很好的链接。将存储桶名称放在指向 crossdomain.xml 的链接中的第一个修复了问题。最终解决问题的方式多么晦涩难懂。应该更好地记录此提示。
【解决方案3】:

看起来您在不同的域上有 a.swf 和 b.swf,并且 a.swf 正在尝试访问 b.swf 的内容(通过Loader.content),毫无疑问它会因安全错误而失败。

你有两个选择:

  1. 将 b.swf 加载到与 a.swf 相同的安全域(即“当前”安全域)中。您可以在 a.swf 的代码中执行此操作,方法是将新的 LoaderContext 传递给 Loader.load() 并设置 loaderContext.securityDomain = SecurityDomain.currentDomain

  2. 显式允许a.swf通过在b.swf的代码中以a.swf的域名为参数调用Security.allowDomain()来访问b.swf

您选择哪一个取决于其他考虑因素。有了第一个,b.swf 在跨域安全(即访问文件等)方面可以做 a.swf 可以做的事情(一切!);对于第二个,a.swf 域上的任何 SWF 文件都可以访问 b.swf 的内容。这真的取决于你想如何建立信任。

【讨论】:

  • 至于您的第一个建议,如果我这样做了,我应该注意哪些安全注意事项?
  • 我继续尝试第一个建议,它实际上加载了文件!但现在它崩溃了:SecurityError:错误#2119:安全沙箱违规:调用者s3.amazonaws.com/bucket_name/swfs/MainSwf.swf无法访问s3.amazonaws.com/bucket_name/data/swfs/foo/SecondSwf.swf拥有的LoaderInfo.applicationDomain。
  • @keybored 第一个建议,要问自己的问题是:我会在 a.swf 的域上托管 b.swf 吗? (即如果 b.swf 是由您不信任的第三方开发的,那么最好不要。)
  • 两个 swf 都是内部开发的。另外,请参阅主要问题中的更新 2,了解我是如何得到错误的。
  • @keybored getDefinition() 在哪里,在主 SWF 或加载的 SWF 中?另外,如果不需要,请摆脱 ApplicationDomain.currentDomain
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多