載入資料

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

Flash Player 和 AIR 內容可以與伺服器交換資料。載入資料與載入媒體是不同類型的作業,因為載入的資訊會顯示為程式物件,而不是顯示為媒體。一般而言,內容可能會從內容的相同來源網域載入資料。不過,內容通常需要有原則檔,才能載入其他網域中的資料 (請參閱網站控制 (原則檔))。

備註: 在 AIR 應用程式安全執行程序中執行的內容,絕不會從遠端網域提供 (除非開發人員故意將遠端內容匯入至應用程式安全執行程序),因此無法參與原則檔所防護的攻擊類型。應用程式安全執行程序中的 AIR 內容並未限制透過原則檔載入資料。不過,其他安全執行程序中的 AIR 內容需要遵循這裡說明的限制。

使用 URLLoader 和 URLStream

您可以載入如 XML 檔和文字檔這類資料。URLLoader 和 URLStream 類別的 load() 方法是由 URL 原則檔權限加以控制。

如果您使用 load() 方法,從呼叫此方法之程式碼以外的網域載入內容,則執行階段會檢查所載入資源的伺服器上是否有 URL 原則檔。如果具有原則檔,而且此檔案授與載入內容之網域的存取權限,就可以載入資料。

連線至通訊端

執行階段預設會尋找從連接埠 843 提供的通訊端原則檔。就像 URL 原則檔一樣,這個檔案稱為「主原則檔」。

最初在 Flash Player 6 加入原則檔時,並沒有通訊端原則檔的支援。至通訊端伺服器的連線是由原則檔進行授權,該原則檔位於與通訊端伺服器相同主機之埠號 80 上 HTTP 伺服器所含原則檔的預設位置中。Flash Player 9 仍然支援這項功能,但 Flash Player 10 不支援。在 Flash Player 10 中,只有通訊端原則檔可以授權通訊端連線。

通訊端原則檔與 URL 原則檔相同,都支援中繼原則陳述式,指定可提供原則檔的連接埠。但是,通訊端原則檔的預設中繼原則是「全部」而不是「僅主檔」。也就是說,除非主原則檔指定限制更多的設定,否則,Flash Player 會假設主機上的任何通訊端都可以提供通訊端原則檔。

根據預設,會停用通訊端和 XML 通訊端連線,即使您連線的通訊端是與 SWF 檔位於相同網域,也一樣停用。您可以透過從下列任何位置提供通訊端原則檔,准許通訊端層級存取:

  • 連接埠 843 (主原則檔的位置)

  • 與主通訊端連線相同的連接埠

  • 與主通訊端連線不同的連接埠

根據預設,Flash Player 會在連接埠 843 上以及與主通訊端連線相同的連接埠上尋找通訊端原則檔。如果您要從不同的連接埠提供通訊端原則檔,SWF 檔必須呼叫 Security.loadPolicyFile()

通訊端原則檔與 URL 原則檔具有相同的語法,不同的是,通訊端原則檔也必須指定所允許存取的埠號。當原則檔來自低於 1024 的埠號時,就可以授與存取權限給任何埠號;當原則檔來自 1024 或更高的埠號時,則只能授與存取權限給 1024 或更高的埠號。允許存取的連接埠是在 <allow-access-from> 標籤的 to-ports 特質中設定的。單一埠號、埠號範圍以及萬用字元也都是所接受的值。

以下是通訊端原則檔的範例:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<!-- Policy file for xmlsocket://socks.mysite.com --> 
<cross-domain-policy>  
    <allow-access-from domain="*" to-ports="507" />  
    <allow-access-from domain="*.example.com" to-ports="507,516" />  
    <allow-access-from domain="*.example.org" to-ports="516-523" />  
    <allow-access-from domain="adobe.com" to-ports="507,516-523" />  
    <allow-access-from domain="192.0.34.166" to-ports="*" />  
</cross-domain-policy> 

若要從連接埠或與主通訊端連線相同的連接埠上擷取通訊端原則檔,請呼叫 Socket.connect()XMLSocket.connect() 方法。Flash Player 會先在連接埠 843 上檢查是否有主原則檔。如果找到原則檔,會檢查檔案中是否包含中繼原則陳述式,禁止目標連接埠上的通訊端原則檔。如果未禁止存取,Flash Player 會先在主原則檔中尋找適當的 allow-access-from 陳述式。如果找不到檔案,就會到與主通訊端連線相同的連接埠上尋找通訊端原則檔。

若要在不同位置上擷取通訊端原則檔,請先以特殊的 "xmlsocket" 語法呼叫 Security.loadPolicyFile() 方法,如下所示:

Security.loadPolicyFile("xmlsocket://server.com:2525"); 

先呼叫 Security.loadPolicyFile() 方法,再呼叫 Socket.connect()XMLSocket.connect() 方法,然後 Flash Player 會等到已完成您的原則檔要求之後,才決定是否允許您的主連線。但是,如果主原則檔指定目標位置不可提供原則檔,則呼叫 loadPolicyFile() 沒有作用,即使該位置上有原則檔也無效。

如果實作通訊端伺服器,而且必須提供通訊端原則檔,請決定在提供原則檔時,您是要使用接受主連線的連接埠,或是要使用不同的連接埠。不論何種情況,您的伺服器都必須先等候來自您用戶端的傳輸,再傳送回應。

當 Flash Player 要求原則檔時,連線一建立,就一定會立即傳輸下列字串:

<policy-file-request/>

伺服器接收到此字串以後,就可以傳輸原則檔。來自 Flash Player 的要求永遠都會以 null 位元組結束,而來自伺服器的回應也必須都以 null 位元組結束。

不要期望在原則檔和主連線上重新使用相同的連線,您應該在傳輸原則檔之後關閉連線。若不關閉連線,Flash Player 會先關閉原則檔連線,再重新連線設置主連線。

保護資料

為避免資料在網際網路上傳輸時遭到竊取和竄改,您可以在資料所在的伺服器上使用傳輸層安全性 (TLS) 或通訊端層安全性 (SSL)。接著您便可以使用 HTTPS 通訊協定來連線至伺服器。

在針對 AIR 2 或更新版本建立的應用程式中,您也可以保護 TCP 通訊端通訊。SecureSocket 類別可讓您起始通訊端連線,該連線會連至使用 TLS 第 1 版或 SSL 第 4 版的通訊端伺服器。

傳送資料

程式碼將資料傳送至伺服器或資源時,就會傳送資料。一律允許來自網路網域的內容傳送資料。本機 SWF 檔案只有在本機信任安全執行程序、具有網路的本機安全執行程序或 AIR 應用程式安全執行程序中時,才可以將資料傳送至網路位址。如需詳細資訊,請參閱本機安全執行程序

您可以使用 flash.net.sendToURL() 函數,傳送資料至 URL。其它方法也會傳送要求至 URL,這些包括載入方法 (如 Loader.load()Sound.load()) 以及資料載入方法 (如 URLLoader.load()URLStream.load())。

上傳和下載檔案

FileReference.upload() 方法會開始上傳使用者或遠端伺服器所選取的檔案。您必須先呼叫 FileReference.browse()FileReferenceList.browse() 方法,再呼叫 FileReference.upload() 方法。

只有在回應滑鼠事件或鍵盤事件時,才能呼叫起始 FileReference.browse()FileReferenceList.browse() 方法的程式碼。如果在其它情況下呼叫,Flash Player 10 和更新版本會擲回例外。不過,使用者起始的事件並不需要從 AIR 應用程式安全執行程序呼叫這些方法。

呼叫 FileReference.download() 方法會開啟對話方塊,使用者可以在其中從遠端伺服器下載檔案。

備註: 如果伺服器需要使用者驗證,則只有在瀏覽器中執行 (也就是使用瀏覽器外掛程式或 ActiveX 控制項) 的 SWF 檔才能提供對話方塊,以提示使用者輸入使用者名稱和密碼以便進行驗證,而且僅供下載。Flash Player 不允許上傳至需要使用者驗證的伺服器。

如果呼叫的 SWF 檔位於具有檔案系統的本機安全執行程序中,則不允許上傳和下載。

根據預設,SWF 檔不可以啟動上傳至或下載自本身以外的伺服器。如果該伺服器提供原則檔,授與叫用 SWF 檔之網域的權限,則 SWF 檔可以針對不同的伺服器進行上傳或下載。