跨指令碼處理

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

如果兩個 SWF 檔都是用 ActionScript 3.0 撰寫,或者在 AIR 中有兩個執行中的 HTML 檔案是同屬一個網域 (例如,一個 SWF 檔的 URL 是 http://www.example.com/swfA.swf,而另一個 SWF 檔的 URL 是 http://www.example.com/swfB.swf),則一個 SWF 檔中定義的程式碼可以檢查並修改變數、物件、屬性及方法;同理,另一個 SWF 檔也可以反過來執行相同的動作,這就叫做「跨指令碼處理」。

如果而個檔案從不同的網域提供 (例如,http://siteA.com/swfA.swf 和 http://siteB.com/swfB.swf),則根據預設值,Flash Player 和 AIR 不允許 swfA.swf 改編 swfB.swf,也不允許 swfB.swf 改編 swfA.swf。 SWF 檔藉由呼叫 Security.allowDomain() ,授與其它網域的 SWF 檔權限。swfB.swf 可透過呼叫 Security.allowDomain("siteA.com") ,授與 siteA.com 網域中的 SWF 檔對它進行指令碼處理。

在 AVM1 SWF 檔與 AVM2 SWF 檔之間並不支援跨指令碼處理。AVM1 SWF 檔是以 ActionScript 1.0 或 ActionScript 2.0 所建立的檔案 (AVM1 和 AVM2 是指 ActionScript Virtual Machine)。但是,您可以使用 LocalConnection 類別,在 AVM1 與 AVM2 之間傳送資料。

在任何跨網域狀況下,清楚分辨牽涉的兩方是很重要的。為方便本文進行討論,我們將執行跨指令碼處理的一方稱為「存取的一方」(通常是指要進行存取的 SWF),另一方則稱為「被存取的一方」(通常是被存取的 SWF)。當 siteA.swf 對 siteB.swf 進行指令碼處理時,siteA.swf 會是存取的一方,而 siteB.swf 則是被存取的一方,如下列圖例說明所示:

使用 Security.allowDomain() 方法建立的跨網域權限屬於非對稱式。在之前的範例中,siteA.swf 可以對 siteB.swf 進行指令碼處理,不過 siteB.swf 無法對 siteA.swf 進行指令碼處理,因為 siteA.swf 並未呼叫 Security.allowDomain() 方法,授與位於 siteB.com 之 SWF 檔的存取權限對其進行指令碼處理。您可以讓兩個 SWF 檔都呼叫 Security.allowDomain() 方法,以設定對稱的權限。

Flash Player 除了可以保護 SWF 檔不受到其它 SWF 檔進行跨網域指令碼處理之外,還可以保護 SWF 檔不受到 HTML 檔的跨網域指令碼處理。HTML-to-SWF 的指令碼編寫可以透過用 ExternalInterface.addCallback() 方法建立的回呼來執行。當 HTML-to-SWF 跨越網域編寫指令碼時,被存取方 SWF 必須呼叫 Security.allowDomain() 方法,而存取方是 SWF 檔時也相同,否則這項作業會失敗。如需詳細資訊,請參閱 作者 (開發人員) 控制

同時,Flash Player 也提供 SWF-to-HTML 編寫指令碼的安全性控制。如需詳細資訊,請參閱 控制外傳 URL 存取

Stage 安全性

Stage 物件有一些屬性和方法可供顯示清單上的任何 Sprite 或影片片段使用。

但是 Stage 物件有擁有者:就是第一個載入的 SWF 檔。根據預設,下列 Stage 物件的屬性和方法只供與 Stage 擁有者位於相同安全執行程序中的 SWF 檔使用:

屬性

方法

align

addChild()

displayState

addChildAt()

frameRate

addEventListener()

height

dispatchEvent()

mouseChildren

hasEventListener()

numChildren

setChildIndex()

quality

willTrigger()

scaleMode

showDefaultContextMenu

stageFocusRect

stageHeight

stageWidth

tabChildren

textSnapshot

width

若要讓不是位於 Stage 擁有者之安全執行程序中的 SWF 檔存取這些屬性和方法,Stage 擁有者 SWF 檔必須呼叫 Security.allowDomain() 方法,將權限授與外部安全執行程序的網域。如需詳細資訊,請參閱 作者 (開發人員) 控制

frameRate 屬性則是特殊情況,任何 SWF 檔都可以讀取 frameRate 屬性。但是,只有位於 Stage 擁有者之安全執行程序中的檔案 (或透過呼叫 Security.allowDomain() 方法授與權限的檔案) 才能變更此屬性。

對於 Stage 物件的 removeChildAt() swapChildrenAt() 方法也有限制,但這些限制與其它限制不同。不是要求位於與 Stage 擁有者相同的安全執行程序中,而是若要呼叫這些方法程式碼必須位於與受影響子物件的擁有者相同的網域中,或者子物件也可以呼叫 Security.allowDomain() 方法。

在顯示清單中移動

一個 SWF 檔存取從其它安全執行程序中所載入之顯示清單的能力是有限制的。SWF 檔若要存取由不同安全執行程序中另外一個 SWF 檔所建立的顯示清單,則被存取端 SWF 檔必須呼叫 Security.allowDomain() 方法,授與存取端 SWF 檔所在網域存取權限。如需詳細資訊,請參閱 作者 (開發人員) 控制

若要存取由 Loader 物件載入的 Bitmap 物件,該影像檔的原始伺服器上必須有 URL 原則檔存在,而且該原則檔必須授與嘗試要存取 Bitmap 物件的 SWF 檔所在網域存取權限 (請參閱 網站控制 (原則檔) )。

對應於載入的檔案 (及 Loader 物件) 之 LoaderInfo 物件包含下列三個屬性,這些屬性會定義載入的物件與 Loader 物件之間的關係: childAllowsParent parentAllowsChild sameDomain

事件安全性

與顯示清單相關的事件具有安全存取限制,這些限制會根據傳送事件的顯示清單所在安全執行程序而不同。在顯示清單中的事件有反昇和捕捉階段 (說明於 處理事件 中)。在反昇與捕捉階段期間,事件從來源顯示清單遷移經過顯示清單中的父顯示物件,如果父物件位於與來源顯示清單不同的安全執行程序中,捕捉及反昇階段會在該父物件之下停止,除非在父物件與來源物件的擁有者具有彼此信任關係。這種彼此信任關係可以經由下列作業建立:

  1. 擁有父物件的 SWF 檔必須呼叫 Security.allowDomain() 方法,以信任擁有來源物件之 SWF 檔的網域。

  2. 擁有來源物件的 SWF 檔必須呼叫 Security.allowDomain() 方法,以信任擁有父物件的 SWF 檔之網域。

對應於載入的檔案 (及 Loader 物件) 之 LoaderInfo 物件包含下列兩個屬性,這些屬性會定義載入的物件與 Loader 物件之間的關係: childAllowsParent parentAllowsChild

對於從顯示物件以外物件傳送的事件,並沒有安全性檢查及安全性相關含意。