首页 > 其他分享 >“SecurityError: Error #2060: 安全沙箱冲突:ExternalInterface 调用者xxx不能访问xxx”【二】...

“SecurityError: Error #2060: 安全沙箱冲突:ExternalInterface 调用者xxx不能访问xxx”【二】...

时间:2023-10-20 16:32:00浏览次数:41  
标签:文件 xxx 调用者 cfg Flash SWF Player 沙箱 信任


今天,我把我的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" />


  1. 在 SWF 文件中,添加以下 ActionScript:
    flash.system.Security.allowDomain(sourceDomain )


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.avHardwareDisable 和 Capabilities.localFileReadDisable



为对计算机强制执行与应用程序无关的安全和隐私策略,只能由系统管理员修改 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 文件,也可以是目录。注释行以 #



# 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的安全机制才能更好地帮助我们解决问题。不过我上面采用的是管理用户控制的方法实现的,所以是属于最高配置级别了,对安全方面可能存在相对较大的隐患,大家也可以尝试用普通用户控制的方法加入受信任。文章就写到这里,希望对大家有所帮助。

标签:文件,xxx,调用者,cfg,Flash,SWF,Player,沙箱,信任
From: https://blog.51cto.com/u_4387387/7956098

相关文章