“SecurityError: Error #2060: 安全沙箱衝突:ExternalInterface 調用者xxx不能訪問xxx”解決方案一例

今天,我把我的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的安全機制才能更好地幫助我們解決問題。不過我上面採用的是管理用戶控制的方法實現的,所以是屬於最高配置級別了,對安全方面可能存在相對較 大的隱患,大家也可以嘗試用普通用戶控制的方法加入受信任。文章就寫到這裏,希望對大家有所幫助。

發佈了16 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章