由於最近用到Flex發現存在安全沙箱問題,無法訪問外部接口,就轉載下來,留着以後查看詳細學習。由於轉載的文章也是轉載的,且未寫出處,故此處未寫明轉載出處。
安全沙箱
術語:
資源發佈者 (Resource Distributor ):
提供一個給定資源的一方。通常是一個服務器操作者 ,諸如一個網站管理員或套接字服務器管理員 。
資源創建者 (Resource Creator ):
真正創建資源的一方。對於.swf文件,資源創建者是編譯.swf的ActionScript開發人員 。
用戶 (User):
Flash Player運行的計算機的用戶。
安全沙箱類型:
可通過 flash.system.Security.sandboxType 獲取其值
- remote:來自遠程範圍的所有.swf
- local-with-filesystem
- local-with-networking
- local-trusted
安全沙箱類型可能禁止的外部操作類型:
- 本地內容
- 內容作爲數據訪問
- 交叉腳本控制
- 裝載數據
- 連接一個套接字
- 發送數據到一個外部的URL
- 訪問用戶的相機和麥克風
- 訪問本地共享的對象
- 上傳或下載由用戶選擇的文件
- 通過一個.swf文件腳本控制一個HTML頁面,反之亦然
- 連接一個LocalConnection頻道
限制範圍:
內容裝載 :可以使用 Loader 、Sound 和 NetStream 等這樣一些類來加載內容
內容作爲數據訪問 :(讀取一個內容資源的內部信息,例如,讀取一張位圖的像素 或者一段音頻 )可以通過使用 Bitmap 對象、BitmapData.draw() 方法、Sound.id3 屬性或者 SoundMixer.computeSpectrum() 方
法從加載的媒體內容中提取數據
交叉腳本控制 :
數據裝載 :可以從使用 URLStream 、URLLoader 、Socket 和 XMLSocket 等類加載的外部文件 (如 XML 文件)中直
接訪問數據
限定策略:
創建者允許 :一個.swf文件含有對恰當的Security 類的靜態方法allowDomain ()的調用。
所有者允許 :意味着發佈者使得恰當的跨域名政策文件可用 。
remote 安全沙箱
local-with-filesystem 安全沙箱
local-with-networking 安全沙箱
local-trusted 安全沙箱
套接字安全:
本地沙箱 :
遠程沙箱 :
全沙箱(二):權限控制 & 如何選擇設置一個本地(local)安全沙箱類型關鍵字: flash player, sand box
權限控制:
1. 管理員控制: 計算機的管理用戶(使用管理權限登錄的用戶 )可以應用能影響計算機所有用戶的 Flash Player 安全設置
- mms.cfg 文件:C:\WINDOWS\system32\Macromed\Flash\mms.cfg
- “ 全局 Flash Player 信任 ” 目錄:C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust
2. 用戶控制 :
- 設置 UI :右鍵Flash Player
- 設置管理器 :右鍵Flash Player -> 高級
- “ 用戶 Flash Player 信任 ” 目錄:在 Windows XP 上:C:\Documents and Settings\JohnD\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust,在 Windows Vista 上: C:\Users\JohnD\AppData\Roaming\Macromedia\Flash Player\#Security\FlashPlayerTrust
3. 網站控制: (策略文件)詳見 安全沙箱(三)
4. 作者(開發人員)控制: Security.allowDomain("www.example.com"),詳見 安全沙箱(三)
三種設置 local-with-filesystem 或 local-with-networking 的方法:
使用Flex Builder和Flash authoring tool所編譯的swf均是local-trusted ,配置文件目錄見下:
”C:\Documents and Settings\[USER]\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust “
1. 使用Flex Builder:默認-use-network=false(如果文件不在非信任位置)
在Additional編譯器參量下,輸入:-use-network=false
-use-network=false:local-with-filesystem
-use-network=true:local-with-networking
2. 使用Flash authoring tool:默認Access local files only(如果文件不在非信任位置)
Access local files only:local-with-filesystem
Access network only:local-with-networkin
3. 使用Flex SDK 命令行編譯器
- mxmlc.exe -use-network=false -file-specs c:\...\Calendar.as -output c:\...\Calendar.swf
授予本地信任:
1. 打開在線 的 Flash Player Settings Manager
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html
2. 在 Global Security Settings 中添加你希望信任的位置
3. 關閉所有的 Flash Player 實例 ,重新啓動 (非常重要,所有的 )
=================================
發佈者許可(政策文件):
創建政策文件:
- <?xml version="1.0"?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- <cross-domain-policy>
- <allow-access-from domain="domainOrIP" />
- <allow-access-from domain="*.example.com" />
- <allow-access-from domain="*" />
- <allow-access-from domain="localhost" />
- </cross-domain-policy>
- "*"符號表示給所有源頭 授權。
- 爲了包含本地範圍 作爲一個授權源頭,一個政策文件必須通過爲domain屬性指定 * 來顯式地信任所有的源頭。
- domain指定的IP 和他們等價域名 是不同的 。
公佈政策文件:
- 默認的 名字和位置:名字:crossdomain.xml ;位置:網站的根目錄
- 如果政策文件在網站根目錄 中,它授權對整個網站的訪問權 。
- 如果政策文件在網站的一個子目錄 中,它授權對該目錄及子目錄的訪問權 ,此時需要手工裝載這個政策文件 :
- Security.loadPolicyFile("http://domainOrIP/pathToPolicyFile");
取得一個政策文件的許可來裝載數據 :
- <?xml version="1.0"?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- <cross-domain-policy>
- <allow-access-from domain="www.site-b.com" />
- <allow-access-from domain="site-b.com" />
- </cross-domain-policy>
- var urlloader:URLLoader = new URLLoader();
- urlloader.load(new URLRequest("http://site-a.com/assets/file.xml"));
取得一個政策文件的許可來把內容作爲數據訪問 :
- <?xml version="1.0"?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- <cross-domain-policy>
- <allow-access-from domain="www.site-b.com" />
- <allow-access-from domain="site-b.com" />
- </cross-domain-policy>
- var loaderContext = new LoaderContext();
- loaderContext.checkPolicyFile = true;
- theLoader.load(new URLRequest("http://site-a.com/assets/image.jpg", loaderContext));
- trace(theLoader.content);
使用一個政策文件來授權套接字連接 :
- <?xml version="1.0"?>
- <!DOCTYPE cross-domain-policy
- SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
- <cross-domain-policy>
- <allow-access-from domain="www.site-b.com" to-ports="3000" />
- <allow-access-from domain="site-b.com" to-ports="3000" />
- </cross-domain-policy>
- var socket:Socket = new Socket();
- try {
- socket.connect("site-a.com", 3000);
- } catch (e:SecurityError) {
- trace("Connection problem");
- trace(e.message);
- }
1. 端口範圍 :
to-ports="9100, 9200"
to-ports="10000-11000"
to-ports="*"
2. 如果一個政策文件時取自小於1024 端口的一個套接字,* 表示對任何端口的訪問都被授權
如果一個政策文件取自大於或者等於1024 端口的一個套接字,* 表示對於任何大於或者等於1024端口的訪問都被授權
3. 當一個政策文件在和所需的套接字連接的不同端口 提供服務時,必須手工裝載那個政策文件 ,添加以下語句:
- Security.loadPolicyFile("xmlsocket://domainOrIP:portNumber");
基於HTTP的政策文件:
必須滿足的條件:
- 它必須被命名爲crossdomain.xml
- 它必須放置於網頁服務器的根目錄 中
- 它必須在所需要的套接字連接的域名 或IP地址的端口80 上提供服務
- 在AS3中,它必須通過Security.loadPolicyFile()來手工裝載
創建者許可(allowDomian()):
- Security.allowDomain("www.sometvnetwork.com", "sometvnetwork.com");
- Security.allowDomain("*");
- 只作用於交叉腳本控制 和HTML-to-SWF腳本控制 操作
- * 符號不能 用作一個子域名 的通配符 :Security.allowDomain("*.example.com ");不行的
- 一個.swf文件可以通過檢查被裝載的.swf文件的LoaderInfo 對象中的childAllowsParent 變量來判定它是否被授權
導入裝載:swf裝載swf
如果兩個swf來自不同的遠程區域 ,或者不同的安全沙箱類型,使用下面的方法加載
- var loaderContext:URLLoader = new URLLoader();
- // 僅當加載AS3編寫的SWF文件時纔會使用此屬性
- loaderContext.applicationDomain = ApplicationDomain.currentDomain;
- loaderContext.securityDomain = SecurityDomain.currentDomain;
- loader.load(new URLRequest("http://site-a.com/assets/file.swf"), loaderContext);
處理安全違規:
要麼拋出一個SecurityError 異常,要麼調度一個SecurityErrorEvent .SECURITY _ERROR
- var urlloader:URLLoader = new URLLoader();
- urlloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorListener);
- urlloader.load(".../index.xml");
有時需要註冊LoaderInfo 的事件監聽:
- var loader:Loader = new Loader();
- loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorListener);
=======================
安全沙箱(四):Others
關鍵字: flash player, sand box
限制網絡 API:
適用端口阻止 的 ActionScript 3.0 API:
FileReference.download()、FileReference.upload()、Loader.load()、Loader.loadBytes()、navigateToURL()、
NetConnection.call()、NetConnection.connect()、NetStream.play()、Security.loadPolicyFile()、sendToURL()、Sound.load()、URLLoader.load()、URLStream.load()
使用 allowNetworking 參數:
您可以通過在包含 SWF 內容的 HTML 頁 中的 <object> 和 <embed> 標籤中設置 allowNetworking 參數來控制 SWF 文件訪問網絡的功能。
allowNetworking 參數主要在 SWF 文件及所在的 HTML 頁來自不同的域時使用。
- "all " (默認值) — 在 SWF 中允許所有的網絡 API。
- "internal "— SWF 文件可能不調用瀏覽器導航或瀏覽器交互 API ,但是它會調用任何其它網絡API。
- "none "— SWF 文件可能不調用瀏覽器導航或瀏覽器交互 API ,並且它無法使用任何 SWF 到SWF 通信 API 。
- <object classic="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
- Code base="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,124,0"
- width="600" height="400" ID="test" align="middle">
- <param name="allowNetworking" value="none" />
- <param name="movie" value="test.swf" />
- <param name="bgcolor" value="#333333" />
- <embed src="test.swf" allowNetworking="none" bgcolor="#333333"
- width="600" height="400"
- name="test" align="middle" type="application/x-shockwave-flash"
- pluginspage="http://www.macromedia.com/go/getflashplayer" />
- </object>
或者修改Flex Builder 生成的HTML,加入以下參數:
- AC_FL_RunContent( ... "allowNetworking", "none", ...)
全屏模式安全性:
要啓用全屏模式,請在包含 SWF 文件引用的 HTML 頁的 <object> 和 <embed> 標籤中添加 allowFullScreen 參數,並將參數值設置爲 "true" (默認值爲 "false"),如下例所示:
- <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
- codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,18,0"
- width="600" height="400" id="test" align="middle">
- <param name="allowFullScreen" value="true" />
- <param name="movie" value="test.swf" />
- <param name="bgcolor" value="#333333" />
- <embed src="test.swf" allowFullScreen="true" bgcolor="#333333"
- width="600" height="400"
- name="test" align="middle" type="application/x-shockwave-flash"
- pluginspage="http://www.macromedia.com/go/getflashplayer" />
- </object>
或者修改Flex Builder 生成的HTML,加入以下參數:
- AC_FL_RunContent( ... "allowFullScreen", "true", ...)
設置LocalConnection權限:
同一域中沒問題 。
對於不同沙箱 的SWF文件,需要設置:
- LocalConnection.allowDomain()
控制外出 URL 訪問:
- flash.system.fscommand() 函數
- ExternalInterface.call() 方法
- flash.net.navigateToURL() 函數
HTML 代碼中用於加載 SWF 文件的 AllowScriptAccess 參數控制能否從 SWF 文件內執行外出 URL 訪問 。
如果不設置 AllowScriptAccess 的值,則僅當 SWF 文件與 HTML 頁來自同一個域 時才能通信 。
AllowScriptAccess 參數可以有 "always "、"sameDomain " 和 "never " 這三個可能值中的一個:
- 當 AllowScriptAccess 爲 "always" 時, SWF 文件可以與其嵌入到的 HTML 頁進行通信,即使該 SWF 文件來自不同於HTML 頁的域也可以。
- 當 AllowScriptAccess 爲 "sameDomain" 時,僅當 SWF 文件與其嵌入到的 HTML 頁來自相同的域時,該 SWF 文件才能與該 HTML 頁進行通信。此值是 AllowScriptAccess 的默認值。
- 當 AllowScriptAccess 爲 "never" 時,SWF 文件將無法與任何 HTML 頁進行通信。
- <object id='MyMovie.swf' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
- codebase='http://download.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0' height='100%'
- width='100%'>
- <param name='AllowScriptAccess' value='always'/>
- <param name='src' value=''MyMovie.swf'/>
- <embed name='MyMovie.swf' pluginspage='http://www.adobe.com/go/getflashplayer' src='MyMovie.swf'
- height='100%' width='100%' AllowScriptAccess='never'/>
- </object>