`

as跨域问题解决总结

阅读更多

 

总结一下在工作中遇到的跨域问题!

一、报安全沙箱问题,没有可用的安全策略文件

 

关于策略文件,我改的是目标服务器(也就是图片服务器)上的策略文件,在策略文件里把flash所在域的域名加上就可以了!

 

东西还是挺简单的,就是网上说法太多了,表达的也不太清楚,在这里明确一下!

 

策略文件语法:

下面的示例显示了一个策略文件,该文件允许访问源自 *.example.com、www.zol.com 和 192.0.34.166 的 SWF 文件。

 

 

 

< ?xml version="1.0"? >
< cross-domain-policy >
    < allow-access-from domain="*.DE<exampleDE<.com" / >
    < allow-access-from domain="www.zol.com" / >
    < allow-access-from domain="192.0.34.166" / >
< /cross-domain-policy >

 

 

 

当某个 SWF 文件试图访问另一个域中的数据时,Flash Player 会尝试自动从该域加载策略文件。如果试图访问数据的 SWF 文件所在的域包括在该策略文件中,则数据将自动成为可访问数据。

默认情况下,策略文件必须命名为 crossdomain.xml,并且必须位于服务器的根目录中。但是,SWF 文件可以通过调用 Security.loadPolicyFile() 方法检查是否为其它名称或位于其它目录中。跨域策略文件仅适用于从其中加载该文件的目录及其子目录。因此,根目录中的策略文件适用于整个服务器,但是从任意子目录加载的策略文件仅适用于该目录及其子目录。

策略文件仅影响对其所在特定服务器的访问。例如,位于 https://www.zol.com:8080/crossdomain.xml 的策略文件只适用于在端口 8080 通过 HTTPS 对 www.zol.com 进行的数据加载调用。

跨域策略文件包含单个< cross-domain-policy >标签,该标签又包含零个或多个< allow-access-from >标签。每个< allow-access-from >标签包含一个属性 domain,该属性指定一个确切的 IP 地址、一个确切的域或一个通配符域(任何域)。通配符域由单个星号 (*)(匹配所有域和所有 IP 地址)或后接后缀的星号(只匹配那些以指定后缀结尾的域)表示。后缀必须以点开头。但是,带有后缀的通配符域可以匹配那些只包含后缀但不包含前导点的域。例如,foo.com 会被看作是 *.foo.com 的一部分。IP 域规范中不允许使用通配符。

如果您指定了一个 IP 地址,则只向使用 IP 语法从该 IP 地址加载的 SWF 文件(例如 http://65.57.83.12/flashmovie.swf)授予访问权限,而不向使用域名语法加载的 SWF 文件授予访问权限。Flash Player 不执行 DNS 解析。

您可以允许访问来自任何域的文档,如下面的示例所示:

 

 

< ?xml version="1.0"? >< !-- http://www.foo.com/crossdomain.xml -- >< cross-domain-policy >  < allow-access-from domain="*" / >< /cross-domain-policy >

 

每个< allow-access-from > 标签还具有可选的 secure 属性,其默认值为 true。如果您的策略文件在 HTTPS 服务器上,并且要允许非 HTTPS 服务器上的 SWF 文件从 HTTPS 服务器加载数据,则可以将此属性设置为 false。

将 secure 属性设置为 false 可能会危及 HTTPS 提供的安全性。特别是将此属性设置为 false 时,会使安全内容受到电子欺骗和截听攻击。Adobe 强烈建议不要将 secure 属性设置为 false。

如果要加载的数据位于 HTTPS 服务器上,但是加载数据的 SWF 文件位于 HTTP 服务器上,则 Adobe 建议将要执行加载的 SWF 文件移动到 HTTPS 服务器上,以便可以使安全数据的所有副本都能得到 HTTPS 的保护。但是,如果决定必须将要执行加载的 SWF 文件保存在 HTTP 服务器上,则需将 secure="false" 属性添加到< allow-access-from > 标签,如以下代码所示:

 

< allow-access-from domain="www.example.com" secure="false" / >

 

 

不包含任何< allow-access-from >标签的策略文件相当于服务器上没有策略。

 

 

二、远程加载图片,无法显示,已经设置跨域文件

一开始的思路:当使用 Loader 类的 load() 方法加载图像时,可以指定一个 context 参数,该参数是一个 LoaderContext对象。如果将 LoaderContext 对象的 checkPolicyFile 属性设置为 true,则 Flash Player将在从其中加载该图像的服务器上检查是否存在跨域策略文件。如果存在跨域策略文件且该文件允许执行加载的 SWF文件所在的域进行访问,则会允许该文件访问 Bitmap 对象中的数据,否则就不允许。

最后解决方法如下:

 

 

import flash.display.Loader;
import flash.net.URLRequest;
import flash.system.LoaderContext;

var lc:LoaderContext = new LoaderContext(true);
var loader:Loader = new Loader();
loader.load(new URLRequest("http://xxxxxxxx/xxxx.jpg"),lc);

//需要在原来的调用基础增加LoaderContext类;

 

 

最后看一下:

checkPolicyFile 属性 

public var checkPolicyFile:Boolean = false 语言版本 :  ActionScript 3.0 

Player 版本 :  Flash Player 9 

 

指定 Flash Player 是否应在开始加载对象本身之前,尝试从所加载对象的服务器上下载跨域策略文件。 此标志适用于 Loader.load() 方法,但不适用于 Loader.loadBytes() 方法。 

如果您从执行调用的 SWF 文件所在的域之外加载图像(JPEG、GIF 或 PNG),并且您预计将需要从 ActionScript 访问该图像的内容,请将此标志设置为 true。 访问图像内容的示例包括引用 Loader.content 属性以获得 Bitmap 对象,以及调用 BitmapData.draw() 方法以获得所加载图像像素的副本。 如果您在加载时没有指定 checkPolicyFile 就尝试执行这些操作之一,您可能会得到一个 SecurityError 异常,这是因为尚未下载所需的策略文件。

在 LoaderContext.checkPolicyFile 被设置为 true 的情况下调用 Loader.load() 方法时,Flash Player 在成功下载相关的跨域策略文件后或发现不存在这样的策略文件后才开始下载 URLRequest.url 中的指定对象。 Flash Player 首先考虑已经下载的策略文件,然后尝试下载在对 Security.loadPolicyFile() 方法的调用中指定的任何待下载策略文件,最后尝试从与 URLRequest.url 对应的默认位置(即 URLRequest.url 所在的服务器上的 /crossdomain.xml)下载策略文件。 在所有情况下,Flash Player 都要求给定的策略文件存在于其服务器上,要求它利用策略文件的位置提供对位于 URLRequest.url 的对象的访问,并要求它利用一个或多个 标签允许执行调用的 SWF 文件的域进行访问。

如果您将 checkPolicyFile 设置为 true,Flash Player 会等待至策略文件下载完成后再开始执行您在 Loader.load() 方法中指定的主下载。 因此,只要您需要的策略文件存在,一旦您收到来自 Loader 对象的 contentLoaderInfo 属性的任何 ProgressEvent.PROGRESS 或 Event.COMPLETE 事件,就说明该策略文件下载已完成,您就可以安全地开始执行需要该策略文件的操作。

如果您将 checkPolicyFile 设置为 true,并且未找到相关的策略文件,则除非您尝试执行的操作引发了 SecurityError 异常,否则您将不会收到任何错误指示。 但是,一旦 LoaderInfo 对象调度 ProgressEvent.PROGRESS 或 Event.COMPLETE 事件,您就可以通过检查 LoaderInfo.childAllowsParent 属性的值来测试是否找到了相关的策略文件。

如果不需要对正在加载的图像进行像素级的访问,则不应将 checkPolicyFile 属性设置为 true。 在这种情况下不必再检查是否存在策略文件,因为这样会延迟下载的开始时间,并且可能会不必要地占用网络带宽。

如果是使用 Loader.load() 方法下载 SWF 文件,也尽量不要将 checkPolicyFile 设置为 true。 这是因为 SWF 到 SWF 的权限不是由策略文件控制的,而是由 Security.allowDomain() 方法控制的,因此在加载 SWF 文件时 checkPolicyFile 不起任何作用。 在这种情况下不必再检查是否存在策略文件,因为这样会延迟 SWF 文件的下载,并且可能会不必要地占用网络带宽 (Flash Player 无法判断您的主下载将是 SWF 文件还是图像,这是因为策略文件下载先于主下载进行)。

如果是从可能使用服务器端 HTTP 重定向的 URL 下载对象,则使用 checkPolicyFile 时要小心。 Flash Player 总是会尝试检索与您在 URLRequest.url 中指定的初始 URL 对应的策略文件。 如果由于 HTTP 重定向而导致最终对象来自其它 URL,则最初下载的策略文件可能不适用于该对象的最终 URL,而最终 URL 对于安全性决策非常重要。 如果发现处于这种情况,可以在收到 ProgressEvent.PROGRESS 或 Event.COMPLETE 事件后检查 LoaderInfo.url 的值,它会告诉您该对象的最终 URL。 接着,用一个基于该对象的最终 URL 的策略文件 URL 调用 Security.loadPolicyFile() 方法。 然后轮询 LoaderInfo.childAllowsParent 的值,直到它变为 true。

分享到:
评论

相关推荐

    uploadify+ashx 跨域上传

    Uploadify支持跨域上传,这使得它可以在不同源的Web应用之间安全地传输数据,解决了传统的文件上传因同源策略限制而遇到的问题。 跨域上传的核心在于设置合适的HTTP头部,尤其是`Access-Control-Allow-Origin`头部...

    pdf跨域及多版本兼容处理

    总结,处理PDF跨域和多版本兼容问题需要前后端的协同工作。后端设置CORS策略,确保PDF可被跨域访问,而前端使用兼容性好的库处理PDF显示。对于版本兼容性,前端使用如PDF.js这样的库,后端可能需要进行PDF版本转换。...

    跨域实现用户鉴权1

    为解决这个问题,可以采用Token-based的身份验证,如JWT,因为令牌可以在不同的域之间传递。 在实际操作中,BASS可能提供了一种后端服务,使得前端能够通过API进行用户鉴权。前端在接收到用户登录信息后,可以将...

    MP3播放器用as实现

    总结来说,实现“MP3播放器用AS实现”需要掌握AS3中的Sound类和SoundChannel类,理解Flash的安全策略,处理跨域问题,以及考虑如何优化用户体验和处理可能出现的错误。在实际项目中,还要关注文件组织结构,确保代码...

    基于C#后台调用跨域MVC服务及带Cookie验证的实现

    【跨域问题与解决方案】 在Web开发中,跨域(Cross-Origin)是指浏览器限制JavaScript从一个源(协议+域名+端口)访问另一个源的数据,这是为了保护用户的安全。然而,这种机制有时会成为开发中的一大挑战,尤其是...

    js调用as函数百分百能使用

    总结,JS调用AS函数是通过Flash的ExternalInterface API实现的,它允许在JavaScript和ActionScript之间建立通信桥梁。尽管这种方法在某些场景下仍然有用,但随着Web技术的发展,开发者应该逐步转向更现代的解决方案...

    as3 与js相互通信

    3. **调试**:AS3与JS通信时的错误通常难以定位,使用`trace`语句进行日志记录或使用Flash的调试版本可以帮助解决问题。 总结来说,AS3与JS的相互通信是Web开发中增强互动性和功能的重要手段,尽管随着HTML5和WebGL...

    C#/.NET uploadify/js跨域异步上传文件,上传文件项目用mvc做,支持多文件上传

    在本文中,我们将深入探讨如何使用C#/.NET环境下的Uploadify插件来解决跨域文件上传的问题,并实现异步上传功能。 #### 二、技术选型 - **前端:** JavaScript 和 Uploadify 插件。 - **后端:** C#/.NET MVC。 #...

    原生JS实现Ajax跨域请求flask响应内容

    为了解决这一问题,我们需要采用跨域资源共享(CORS,Cross-Origin Resource Sharing)机制。 在本案例中,我们将使用Python的Flask框架来配置服务器,允许来自任何源的Ajax请求。首先,我们引入Flask库中的`make_...

    eclipse配置Tomcat、部署web项目

    对于"源码"标签,Eclipse支持源码级别的调试,这对于理解代码运行过程和解决问题非常有帮助。在部署的Web项目上右键选择Debug As -&gt; Debug on Server,Eclipse会在Tomcat服务器上启动应用,并允许我们在源码级别设置...

    Flash 导入资源

    为解决这个问题,服务器端需要提供一个跨域策略文件(crossdomain.xml),允许指定的源访问其资源。 总结来说,AS3.0提供了丰富的功能来处理各种资源,无论是静态的图像和音频,还是动态的视频和数据。通过合理地...

    ajaxSubmit上传文件IE解析

    其中通过设置`iframe: true`参数,启用iframe上传模式,这种方式可以解决跨域问题,并且能够更好地支持各种类型的浏览器,包括IE。 #### 问题根源分析 问题的关键在于IE浏览器对JSON格式数据的解析处理。默认情况...

    华为 E05E, NE08E V300R005C10SPC100 特性描述 - MSDP

    总结来说,MSDP是解决PIM-SM域间组播通信问题的关键,通过建立对等体关系和交互SA消息,实现了跨域组播数据的高效传输。在实际网络部署中,理解并正确配置MSDP对于保障多播服务的稳定性和扩展性至关重要。

    whois相关总结

    **Whois相关总结** 在互联网世界中,"Whois"是一个重要的查询服务,用于查找与域名、IP地址或AS号(自治系统号)相关的注册信息。这个查询工具可以帮助我们了解谁是某个网络资源的所有者,注册日期,到期日期,以及...

    xcode与flash通过socket进行通信

    总结来说,Xcode与Flash通过Socket通信需要理解网络编程的基本原理,掌握如何在两端建立和管理Socket连接,同时要注意Flash的跨域安全策略。通过正确的配置和代码实现,可以实现流畅的数据交换,无论是在本地还是...

    Flex_RPC错误大全

    这些错误及其解决方法的总结有助于开发者快速定位问题并采取相应措施,提高Flex与.NET之间通信的效率和稳定性。通过深入理解每个错误背后的原理,可以避免常见的陷阱,提升项目的开发效率和用户体验。

    源于FLEX中的安全沙箱问题

    7. **解决跨脚本访问问题**: 跨域访问通常需要使用`crossdomain.xml`策略文件,并在被访问的SWF中使用`Security.allowDomain()`或`Security.allowInsecureDomain()`。双向访问时,双方都需要设置相应的策略。 ...

    flash与js交互

    需要注意的是,为了确保跨域安全,`ExternalInterface`仅允许在同源策略下工作,且在某些旧版本的浏览器或Flash播放器中可能不支持。 总结,Flash与JavaScript的交互经历了从简单到复杂,再到简化的历程。`...

    JS下载文件

    FileSaver.js库兼容大部分现代浏览器,解决了跨域和大文件下载的问题。 四、HTTP响应头控制 服务器端也可以通过设置特定的HTTP响应头来控制文件下载,例如设置`Content-Disposition`为`attachment`: ```http ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    (2)跨域数据交互问题。不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备和浏览器。 本文研究并设计了基于Android+HTML5的在线认证检测系统,主要工作包括以下四个方面: ...

Global site tag (gtag.js) - Google Analytics