allowDomain(security.allowDomain 方法)

来源:互联网 发布:q叔淘宝店铺网址 编辑:程序博客网 时间:2024/05/18 20:08

Flash CS3 文档 

ActionScript 2.0 语言参考 >ActionScript 类 >security (System.security) >allowDomain(security.allowDomain 方法)

allowDomain(security.allowDomain 方法)

public static allowDomain(domain1: String) : Void

允许所标识的域中的 SWF 文件和 HTML 文件访问包含 allowDomain() 调用的 SWF 文件中的对象和变量。

如果两个 SWF 文件是同一个域提供,例如,http://mysite.com/movieA.swf 和 http://mysite.com/movieB.swf,则 movieA.swf 可以检查和修改 movieB.swf 中的变量、对象、属性、方法等,而且 movieB.swf 也可以对 movieA.swf 执行同样的操作。这被称为跨影片脚本编写或简称跨脚本编写。

如果从不同的域提供两个 SWF 文件(例如 http://mysite.com/movieA.swf 和 http://othersite.com/movieB.swf),则在默认情况下,Flash Player 既不允许 movieA.swf 编写 movieB.swf 的脚本,也不允许 movieB.swf 编写 movieA.swf 的脚本。通过调用System.security.allowDomain(),一个 SWF 文件可授予其它域中的 SWF 文件编写其脚本的权限。这称为跨域脚本编写。通过调用System.security.allowDomain("mysite.com"),movieB.swf 授予 movieA.swf 编写 movieB.swf 的脚本的权限。

在任何跨域的情况下,都会涉及两方,明确各方是很重要的。为了便于进行此讨论,我们将执行跨脚本编写的一方称为访问方(通常是执行访问的 SWF),将另一方称为被访问方(通常是被访问的 SWF)。为了继续我们的示例,当 movieA.swf 编写 movieB.swf 的脚本时,movieA.swf 是访问方,movieB.swf 是被访问方。



使用 System.security.allowDomain() 建立的跨域权限是不对称的。在上一个示例中,movieA.swf 可以编写 movieB.swf 的脚本,但 movieB.swf 无法编写 movieA.swf 的脚本,这是因为 movieA.swf 未调用System.security.allowDomain() 来授予 othersite.com 编写 movieA.swf 的脚本的权限。可以通过让两个 SWF 文件都调用 System.security.allowDomain() 来设置对称权限。

除了防止 SWF 文件受到其它 SWF 文件发起的跨域脚本编写外,Flash Player 还防止 SWF 文件受到 HTML 文件发起的跨域脚本编写。可使用旧版本的 Flash 浏览器函数(例如SetVariable)或通过使用 ExternalInterface.addCallback() 创建的回调执行 HTML 到 SWF 的脚本使用。当 HTML 到 SWF 的脚本编写跨域边界时,如果访问方恰是一个 SWF 文件,则被访问的 SWF 文件必须调用System.security.allowDomain(),否则操作将失败。

如果将 IP 地址指定为 System.security.allowDomain() 的参数,则不允许所有源自指定 IP 地址的访问方进行访问。而是只允许通过在访问方的 URL 中显式指定该 IP 地址(而不是通过映射到该 IP 地址的域名)加载的访问方进行访问。

不同版本间的差异:Flash Player 的跨域安全性规则随版本的更新而不断发展。下表概述了这些差异。

跨脚本编写操作中所涉及的最新 SWF 版本。

是否需要 allowDomain()?

是否需要 allowInsecureDomain()?

哪个 SWF 必须调用 allowDomain() 或 allowInsecureDomain()?

在 allowDomain() 或 allowInsecureDomain() 中可以指定哪些内容?

第 5 版或更早版本

暂缺

暂缺

6

是的,如果超级域不匹配

被访问的 SWF 文件,或者任何与被访问的 SWF 文件具有相同超级域的 SWF 文件

  • 基于文本的域 (mysite.com)
  • IP 地址 (192.168.1.1)

7

是的,如果域不是完全匹配

是的,如果执行 HTTP 到 HTTPS 的访问(即使域完全匹配)

被访问的 SWF 文件,或者任何与被访问的 SWF 文件具有完全相同域的 SWF 文件

  • 基于文本的域 (mysite.com)
  • IP 地址 (192.168.1.1)

第 8 版或更高版本

是的,如果域不是完全匹配

是的,如果执行 HTTP 到 HTTPS 的访问(即使域完全匹配)

被访问的 SWF

  • 基于文本的域 (mysite.com)
  • IP 地址 (192.168.1.1)
  • 通配符 (*)

控制 Flash Player 行为的版本是 SWF 版本(SWF 文件的发布版本),而不是 Flash Player 本身的版本。例如,当 Flash Player 8 正在播放为第 7 版发布的 SWF 文件时,它应用与第 7 版一致的行为。这种做法可确保播放器升级不会更改已部署的 SWF 文件中的System.security.allowDomain() 的行为。

上表中的版本列显示了跨脚本编写操作中所涉及的最新 SWF 版本。Flash Player 根据执行访问的 SWF 文件的版本或被访问的 SWF 文件的版本(以两者中的较高版本为准)来确定其行为。

下面的段落提供有关涉及 System.security.allowDomain() 的 Flash Player 安全性更改的详细信息。

“第 5 版”。没有跨域脚本编写限制。

“第 6 版”。引入了跨域脚本编写安全性。默认情况下,Flash Player 禁止跨域脚本编写;System.security.allowDomain() 可允许跨域脚本编写。为了确定两个文件是否处于同一域中,Flash Player 将使用每个文件的超级域(它与文件的 URL 中的主机名完全相同),去掉第一段,最少剩两段。例如,www.mysite.com 的超级域为 mysite.com。此示例将允许来自 www.mysite.com 和 store.mysite.com 的 SWF 文件相互编写脚本,而无需调用 System.security.allowDomain()

“第 7 版”。超级域匹配更改为域完全匹配。仅在这两个文件的 URL 中的主机名完全相同时才允许它们相互编写脚本;否则需要调用 System.security.allowDomain()。默认情况下,不再允许从非 HTTPS URL 加载的文件编写从 HTTPS URL 加载的文件的脚本,即使这两个文件是从完全相同的域加载的。由于非 HTTPS 文件容易在下载的过程中受到修改,而经过恶意修改的非 HTTPS 文件能破坏 HTTPS 文件,此限制可防止这样的篡改,所以有助于保护 HTTPS 文件。引入了 System.security.allowInsecureDomain() 以允许被访问的 HTTPS SWF 文件自主禁用此限制,但 Adobe 不推荐使用System.security.allowInsecureDomain()

“第 8 版”。有两个主要更改区域:

  • 现在,只有被访问的 SWF 文件是调用 System.security.allowDomain() 的 SWF 文件时,调用 System.security.allowDomain() 才允许跨脚本编写操作。也就是说,现在,调用 System.security.allowDomain() 的 SWF 文件只允许访问自己。在以前的版本中,调用System.security.allowDomain() 允许跨脚本编写操作,其中被访问的 SWF 文件可以是与名为 System.security.allowDomain() 的 SWF 文件在同一个域中的任何 SWF 文件。以前调用System.security.allowDomain() 会打开执行调用的 SWF 文件的整个域。
  • 已添加了对具有 System.security.allowDomain("*")System.security.allowInsecureDomain("*") 的通配符值的支持。通配符 (*) 值允许跨脚本编写操作,操作过程中执行访问的文件可以是从任何位置加载的任何文件。将通配符视为全局权限。通配符权限一般情况下会很有用,但是,在 Flash Player 8 中新的本地文件安全性规则下,要启用特定种类的操作,则尤其需要这些权限。具体来说,要使具有网络访问权限的本地 SWF 文件在 Internet 上编写某个 SWF 文件的脚本,被访问的 Internet SWF 文件必须调用 System.security.allowDomain("*"),从而反映本地 SWF 文件的来源是未知的。(如果被访问的 Internet SWF 文件是从 HTTPS URL 加载的,则 Internet SWF 文件必须改为调用System.security.allowInsecureDomain("*")。)

您可能会偶尔遇到以下情况:您从另一个域中加载一个子级 SWF 文件,并想让该子级 SWF 文件编写父级 SWF 文件的脚本,但您不知道该子级 SWF 文件来自哪个最终域。例如,当您使用加载平衡重定向或第三方服务器时就可能发生这种情况。

在这种情况下,您可以使用 MovieClip._url 属性作为此方法的参数。例如,如果将 SWF 文件加载到影片剪辑 my_mc 中,则您可以调用 System.security.allowDomain(my_mc._url)。如果您这样做,请务必等待到my_mc 开始加载,因为 _url 属性只有在此时才会产生最终正确的值。确定子级 SWF 文件开始加载的时刻的最佳方式是使用MovieClipLoader.onLoadStart

也可能出现相反的情况;即,您可能创建一个子级 SWF 文件,并允许其父级编辑该子级 SWF 文件,但不知道该父级将来自哪个域。在这种情况下,请从子级 SWF 调用System.security.allowDomain(_parent._url)。您不必等待父级 SWF 文件加载;加载子级时,父级已加载完毕。

如果正在为 Flash Player 8 进行发布,也可以通过调用 System.security.allowDomain("*") 处理这些情况。不过,有时这可能是很危险的快捷方式,因为它允许来自任何域的任何其它 SWF 文件访问执行调用的 SWF 文件。通常,使用_url 属性更安全。

有关详细信息,请参阅以下部分:

  • Flash Player 9 安全性白皮书(位于 http://www.adobe.com/go/fp9_0_security_cn)
  • Flash Player 8 与安全相关的 API 白皮书(位于 http://www.adobe.com/go/fp8_security_apis_cn)

可用性:ActionScript 1.0、Flash Player 6 ― Flash Player 7 中的行为已更改;Flash Player 8 中的行为已更改。

参数

domain1:String ― 一个或多个字符串,指定可以访问包含System.Security.allowDomain() 调用的 SWF 文件中的对象和变量的域。可以按照以下格式指定域:

  • "domain.com"
  • "http://domain.com"
  • "http://IPaddress"
  • (仅限 Flash Player 8)"*" 您可以将通配符 ("*") 传递到 System.security.allowDomain() 以允许所有的域(包括本地主机)可以对执行调用的 SWF 文件访问。在使用该通配符之前,请确认:对于执行调用的 SWF 文件,您的确需要提供这样广泛的访问。请参阅此方法的主要说明中的讨论。

示例

位于 www.adobe.com/MovieA.swf 的 SWF 文件包含以下行:

System.security.allowDomain("www.shockwave.com");loadMovie("http://www.shockwave.com/MovieB.swf", my_mc);

由于 MovieA 包含 allowDomain() 调用,所以 MovieB 可以访问 MovieA 中的对象和变量。如果 MovieA 不包含此调用,则 Flash Player 安全实施机制将阻止 MovieB 访问 MovieA 的对象和变量。

请参阅

addCallback(ExternalInterface.addCallback 方法),onLoadComplete(MovieClipLoader.onLoadComplete 事件侦听器),_parent(MovieClip._parent 属性),_url(MovieClip._url 属性),allowInsecureDomain(security.allowInsecureDomain 方法)


Flash CS3

 

评论添加到页面后给我发送电子邮件 |评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00002104.html

原创粉丝点击