載入資料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 檔位於相同網域,也一樣停用。您可以透過從下列任何位置提供通訊端原則檔,准許通訊端層級存取:
根據預設,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 檔可以針對不同的伺服器進行上傳或下載。 |
|