安全地使用未受信任內容

Adobe AIR 1.0 以及更新的版本

未指定至應用程式安全執行程序的內容可以為應用程式提供額外的編寫指令碼功能,但僅限於符合執行階段安全性準則的情況。本主題將說明 AIR 與非應用程式內容的安全性合約。

Security.allowDomain()

AIR 應用程式會限制非應用程式內容的指令碼存取,比 Flash Player 瀏覽器外掛程式對不受信任內容的指令碼存取限制更為嚴格。例如,在瀏覽器中的 Flash Player,當指定給本機信任的安全執行程序之 SWF 檔呼叫 System.allowDomain() 方法時,從指定網域載入的 SWF 就會獲得指令碼存取權授予。從 AIR 應用程式中 application (應用程式) 內容則不准許類似手法,因為這會授予非應用程式檔案不合理的存取權限,進而得以存取使用者的檔案系統。遠端檔案無法直接存取應用程式安全執行程序,即使呼叫 Security.allowDomain() 方法也不行。

在應用程式與非應用程式內容之間編寫指令碼

在應用程式與非應用程式內容之間編寫指令碼的 AIR 應用程式有更為複雜的安全性考量。不在應用程式安全執行程序中的檔案僅能透過使用安全執行程序橋接,存取應用程式安全執行程序中檔案的屬性和方法。安全執行程序橋接是做為應用程式與非應用程式內容之間的閘道,提供兩個檔案之間的明確互動。當正確使用時,安全執行程序橋接會提供一層外加的安全性,限制非應用程式內容存取屬應用程式內容一部分的物件參考。

安全執行程序橋接的優點透過範例最能說明清楚。假設 AIR 音樂商店應用程式要將 API 提供給要自行建立 SWF 檔的廣告商,讓商店應用程式之後可以與此 SWF 檔通訊。商店想要為廣告商提供方法,讓廣告商能從商店尋找演唱者和 CD,但是基於安全性考量,也要隔離一些方法和屬性,使協力廠商 SWF 檔案無法加以存取。

安全執行程序橋接可以提供這項功能。根據預設,在執行階段從外部載入 AIR 應用程式中的內容無法存取主應用程式中的任何方法或屬性。開發人員可以使用自訂安全執行程序橋接實作,在不需公開這些方法和屬性的情況下,將服務提供給遠端內容。請將安全執行程序橋接視為受信任與未受信任內容之間的通道,此通道不需要公開物件參考便可以在載入器與被載入者內容之間提供通訊。

如需有關如何安全使用安全執行程序橋接的詳細資訊,請參閱在不同網域中的內容之間編寫指令碼

防範以動態方式產生的不安全 SWF 內容

Loader.loadBytes() 方法能夠讓應用程式從位元組陣列產生 SWF 內容。但是,從遠端來源載入資料中的插入攻擊,會在載入內容時產生嚴重的損害。這在將資料載入應用程式安全執行程序中時更是明顯,所產生的 SWF 內容可在此存取完整的 AIR API。

有些方法可用來合法使用 loadBytes() 方法且不產生可執行的 SWF 程式碼。例如,您可以使用 loadBytes() 方法產生影像資料,控制影像顯示的時間。有些方法則「需要」依賴執行程式碼以進行合法使用,像是動態建立 SWF 內容以進行音效播放。在 AIR 中,根據預設,loadBytes() 方法「不會」讓您載入 SWF 內容,而只允許您載入影像內容。在 AIR 中,loadBytes() 方法的 loaderContext 屬性具有 allowLoadBytesCodeExecution 屬性,您可以將其設定為 true,以明確地允許應用程式使用 loadBytes() 載入可執行的 SWF 內容。下列程式碼會示範如何使用這項功能:

var loader:Loader = new Loader(); 
var loaderContext:LoaderContext = new LoaderContext(); 
loaderContext.allowLoadBytesCodeExecution = true; 
loader.loadBytes(bytes, loaderContext);

如果呼叫 loadBytes() 來載入 SWF 內容,而 LoaderContext 物件的 allowLoadBytesCodeExecution 屬性設定為 false (預設值),則 Loader 物件會擲出 SecurityError 例外。

備註: 在未來的 Adobe AIR 版本中,這個 API 可能會改變。發生改變時,您可能需要重新編譯使用 LoaderContext 類別的 allowLoadBytesCodeExecution 屬性之內容。