关闭

“SecurityError: Error #2060: 安全沙箱冲突:ExternalInterface 调用者xxx不能访问xxx”解决方案一例

标签: actionscriptflashwindowsmicrosofthtmlinternet
6860人阅读 评论(0) 收藏 举报
分类:

今天,我把我的Flash Player插件做了一下升级,变为了10.0.42.34的版本。然后发现之前能够在本地正常运行的DVF,今天运行起来却抛出了异常信息。提示信息如下:

SecurityError: Error #2060: 安全沙箱冲突:ExternalInterface 调用者 file://D:/study/flex/service/bin/rainbowX.swf 不能访问 file://D:/study/flex/service/bin/rainbowX_Debug.html
at flash.external::ExternalInterface$/_initJS()
at flash.external::ExternalInterface$/addCallback()
at freeidea.rainbowX::Application()

       根据调试信息的提示是因为调用了ExternalInterface.addCallback方法导致的。于是看了一下帮助文档,文档中关于此方法抛出安全性异常的描述如下:

引发

Error — 此容器不支持传入调用。 仅在适用于 Windows 的 Internet Explorer 和使用 NPRuntime API 的浏览器(如 Mozilla 1.7.5 及更高版本或 Firefox 1.0 及更高版本)中支持传入调用。
SecurityError — 您无权访问的沙箱中的 ActionScript 已经添加了具有指定名称的回调;您不能覆盖该回调。 若要解决此问题,请改写原来调用 addCallback() 方法的 ActionScript,以使其还调用 Security.allowDomain() 方法。
SecurityError — 包含环境属于调用代码无权访问的安全沙箱。 若要解决此问题,请按照下列步骤操作:
  1. 在包含 SWF 文件的 HTML 页中,在该文件的 object 标签中设置以下参数:

    <param name="" value="always" />

  2. 在 SWF 文件中,添加以下 ActionScript:

    flash.system.Security.allowDomain(sourceDomain )

      看了上面的帮助说明,我觉得有可能是因为跨域访问的问题,因为在“作者(开发人员)控制”一文中也有提到过如果SWF要跟HTML的脚本进行通信必须要把 插件的allowScriptAccess的值设置为always。以及SWF要允许该域的访问。于是我试着在SWF中加入了flash.system.Security.allowDomain("*"); 然后在加载他的HTML中加入了<param name="allowScriptAccess" value="always" /> 这一句。

   但是问题还是得不到解决。没办法只能往别的方向思考。后来发现我的DVF在Project的输出文件夹中能够正常浏览(我是用Flex建立的),一旦移到 别的目录下面就不行了呢?结果找了一下资料看到了下面一篇文章,文章名称叫“权限控制概述”。这篇文章主要说明了Flash Player的安全模型是怎么样的。下面我把部分内容贴上来,有兴趣的朋友可以到网上搜索一下。

权限控制概述

Flash Player 客户端运行时安全模型是围绕 SWF 文件、本地数据和 Internet URL 等这些对象资源设计而成的模型。“资源持有者”是指拥有或使用这些资源的各方。资源持有者可以对其自己的资源进行控制(安全设置),每种资源有四个持有 者。Flash Player 对这些控制严格采用一种权利层次结构,如下图所示:




安全控制层次结构


该图说明,如果管理员限制对资源的访问,则任何其他持有者都不能覆盖该限制。

管理用户控制

计算机的管理用户(使用管理权限登录的用户)可以应用能影响计算机所有用户的 Flash Player 安全设置。在非企业环境(例如家庭计算机)中,通常只有一个用户,该用户也拥有管理访问权限。即使是在企业环境中,单个用户也可以拥有计算机管理权限。

管理用户控制有两种类型:

  • mms.cfg 文件
  • “全局 Flash Player 信任”目录

mms.cfg 文件

在 Mac OS X 系统上,mms.cfg 文件位于 /Library/Application Support/Macromedia 中。在 Microsoft Windows 系统上,该文件位于系统目录的 Macromedia Flash Player 文件夹中(例如,在 Windows XP 默认安装中为 C:/windows/system32/macromed/flash/mms.cfg)。

Flash Player 启动时将从此文件中读取其安全设置,然后使用这些设置限制功能。

mms.cfg 文件包括管理员用于执行以下任务的设置:

  • 数据加载 — 限制读取本地 SWF 文件、禁止文件下载和上载以及对永久共享对象设置存储限制。
  • 隐私控制 — 禁止麦克风和摄像头访问、禁止 SWF 文件播放无窗口内容,以及禁止与浏览器窗口中显示的 URL 不匹配的域中的 SWF 文件访问永久共享对象。
  • Flash Player 更新 — 设置检查 Flash Player 更新版本的时间间隔、指定检查 Flash Player 更新信息所使用的 URL、指定从其中下载 Flash Player 更新版本的 URL 以及完全禁用 Flash Player 的自动更新。
  • 旧版文件支持 — 指定是否应将早期版本的 SWF 文件放置在受信任的本地沙箱中。
  • 本地文件安全性 — 指定是否可以将本地文件放置在受信任的本地沙箱中。
  • 全屏模式 — 禁用全屏模式。

SWF 文件可通过调用 Capabilities.avHardwareDisableCapabilities.localFileReadDisable 属性来访问已禁用功能的某些信息。但是,mms.cfg 文件中的大部分设置无法通过 ActionScript 进行查询。

为对计算机强制执行与应用程序无关的安全和隐私策略,只能由系统管理员修改 mms.cfg 文件。mms.cfg 文件不能用于安装应用程序。虽然使用管理权限运行的安装程序可以修改 mms.cfg 文件的内容,但是 Adobe 将此类使用视为违反用户的信任,并且劝告安装程序的创建者决不要修改 mms.cfg 文件。

“全局 Flash Player 信任”目录

管理用户和安装应用程序可以将指定的本地 SWF 文件注册为受信任。这些 SWF 文件会被分配到受信任的本地沙箱。它们可以与任何其它 SWF 文件进行交互,也可以从任意位置(远程或本地)加载数据。文件在“全局 Flash Player 信任”目录中被指定为受信任,该目录与 mms.cfg 文件的所在目录相同,位置(特定于当前用户)如下:

  • Windows:system/Macromed/Flash/FlashPlayerTrust

    (例如,C:/windows/system32/Macromed/Flash/FlashPlayerTrust)

  • Mac:app support/Macromedia/FlashPlayerTrust

    (例如,/Library/Application Support/Macromedia/FlashPlayerTrust)

“Flash Player 信任”目录可以包含任意数目的文本文件,每个文件均列出受信任的路径,一个路径占一行。每个路径可以是单个的 SWF 文件、HTML 文件,也可以是目录。注释行以 # 号开头。例如,包含以下文本的 Flash Player 信任配置文件表示将向指定目录及所有子目录中的所有文件授予受信任状态:

# Trust files in the following directories:
C:/Documents and Settings/All Users/Documents/SampleApp

信任配置文件中列出的路径应始终是本地路径或 SMB 网络路径。信任配置文件中的任何 HTTP 路径均会被忽略;只能信任本地文件。

为避免发生冲突,应为每个信任配置文件指定一个与安装应用程序相应的文件名,并且使用 .cfg 文件扩展名。

由于开发人员通过安装应用程序分发本地运行的 SWF 文件,因此可以让安装应用程序向“全局 Flash Player 信任”目录添加一个配置文件,为要分发的文件授予完全访问权限。安装应用程序必须由拥有管理权限的用户来运行。与 mms.cfg 文件不同,包含“全局 Flash Player 信任”目录是为了让安装应用程序授予信任权限。管理用户和安装应用程序都可以使用“全局 Flash Player 信任”目录指定受信任的本地应用程序。

    看完这篇文章后,终于发现原来Flex中的项目其实也是把项目中的输出文件加入了本地信任沙箱。而且在本地的指定目录下也找到了关于Flex的cfg文 件,里面确实是加入了各个项目的输出文件夹。于是我也试着把DVF所处的目录加入本地信任沙箱。根据文中中所说的cfg文件格式把整个文件夹的路径字符串 写入了文本文件中,然后另存为cfg文件。把它放到system/Macromed/Flash/FlashPlayerTrust中。然后再次运行 DVF,报错信息没有了,问题得到了解决。

    回想了一下,发觉Flash Player对安全性方面确实是越来越严格了。现在的版本甚至对本地运行也要求如此严格(我之前用的版本是9.0的,只要做到在HTML中设置 allowScriptAccess为always即可)。只有透彻地了解Flash Player的安全机制才能更好地帮助我们解决问题。不过我上面采用的是管理用户控制的方法实现的,所以是属于最高配置级别了,对安全方面可能存在相对较 大的隐患,大家也可以尝试用普通用户控制的方法加入受信任。文章就写到这里,希望对大家有所帮助。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18189次
    • 积分:339
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:7篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论