如果兩個 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()
方法。