權限控制Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本 Flash Player 用戶端執行階段安全性模型是以資源為中心進行設計,這些資源包括 SWF 檔、本機資料和網際網路 URL 等物件。「關係人」包括擁有或使用這些資源的各方人士。關係人可以對本身擁有的資源執行控制 (安全性設定),而且每一個資源都有四種關係人。Flash Player 會嚴格執行授權階層架構進行這些控制,如下列圖例說明所示: 安全性控制的階層架構 也就是說,如果系統管理員限制存取一項資源,就沒有其他任何關係人能夠覆寫該限制。 至於 AIR 應用程式,這些權限控制項只會套用至 AIR 應用程式安全執行程序外執行的內容。 系統管理員控制電腦的系統管理使用者 (以系統管理權限登入的使用者) 可以套用影響電腦所有使用者的 Flash Player 安全性設定。在非企業環境中 (例如在家用電腦上),通常只有一個使用者,該使用者同時也具有系統管理存取權限;甚至在企業環境中,也有個人使用者具有電腦的系統管理權限。 系統管理使用者控制總共有兩種類型:
mms.cfg 檔mms.cfg 檔是文字檔,可以讓系統管理員啟用或限制存取各種不同的功能。當 Flash Player 啟動時,會從此檔案讀取其安全性設定,然後使用這些設定來限制功能。mms.cfg 檔包含系統管理員用來管理各項功能 (例如隱私權控制、本機檔案安全性、通訊端連線等等) 的設定。 SWF 檔可以存取有關經由呼叫 Capabilities.avHardwareDisable 和 Capabilities.localFileReadDisable 屬性所停用功能的一些資訊,但是 mms.cfg 檔中大部分設定都不能透過 ActionScript 進行查詢。 為了要在電腦上強制執行與獨立於應用程式之外的安全性和隱私權原則,mms.cfg 檔只能由系統管理員進行修改;mms.cfg 檔並不是由應用程式的安裝程式來使用。雖然以系統管理權限執行的安裝程式可以修改 mms.cfg 檔的內容,但是 Adobe 將這種用法視為違反使用者的信任,並強烈要求安裝程式建立者絕對不要修改 mms.cfg 檔。 mms.cfg 檔的儲存位置如下:
如需有關 mms.cfg 檔的詳細資訊,請參閱「Flash Player 管理指南」,網址為:www.adobe.com/go/flash_player_admin_tw。 全域 Flash Player Trust 目錄系統管理使用者和安裝程式應用程式可以將指定的本機 SWF 檔註冊為受所有使用者信任,這些 SWF 檔是指定給本機信任的安全執行程序。它們可以與其它任何 SWF 檔互動,而且可以從遠端或本機的任何一處載入資料。檔案是在下列位置指定為全域 Flash Player Trust 目錄中受信任的檔案:
Flash Player Trust 目錄可以包含任何數目的文字檔,每一個檔案都列出受信任的路徑,一行列出一個路徑。各個路徑可以是個別的 SWF 檔、HTML 檔或目錄。註解行會以 # 符號做為開頭。例如,Flash Player 信任包含下列文字的設定檔,這些文字會授予指定之目錄及其所有子目錄中全部檔案受信任狀態: # Trust files in the following directories: C:\Documents and Settings\All Users\Documents\SampleApp 在信任設定檔中所列的路徑必須永遠都是本機路徑或 SMB 網路路徑。信任設定檔中的任何 HTTP 路徑都會加以忽略,只有本機檔案可以受信任。 為了避免衝突,請給予每一個信任設定檔對應於安裝應用程式的檔名,並使用 .cfg 做為副檔名。 當開發人員透過安裝程式應用程式散發本機執行的 SWF 檔時,您可以讓安裝程式應用程式將設定檔加入至「全域 Flash Player Trust」目錄,將完整的權限授與您所要散發的檔案。安裝程式應用程式必須由具有系統管理權限的使用者執行。「全域 Flash Player Trust」目錄與 mms.cfg 檔不同,包含此目錄的目的在於讓安裝程式應用程式授與信任權限。系統管理使用者和安裝程式應用程式都可以使用「全域 Flash Player Trust」目錄,指定受信任的本機應用程式。 個別使用者也可以使用 Flash Player Trust 目錄 (請參閱使用者控制)。 使用者控制Flash Player 提供三種不同的使用者層級設定權限機制:「設定 UI」、「設定管理員」和「使用者 Flash Player Trust」目錄。 設定 UI 和設定管理員「設定 UI」是為特定網域所設定的快速、互動式機制;「設定管理員」則提供更詳細的介面,並提供功能可進行全域變更,以影響許多或所有網域的權限。此外,當 SWF 檔提出新的權限要求時,需要有關安全性或隱私權的執行階段決策,就會顯示對話方塊,使用者可以在其中調整一些 Flash Player 設定。 「設定管理員」和「設定 UI」都能提供與安全性有關的選項 (例如攝影機和麥克風設定、共享物件儲存設定,以及與舊版內容相關的設定等等)。AIR 應用程式無法使用「設定管理員」或「設定 UI」。 備註: mms.cfg 檔中的任何設定 (請參閱系統管理員控制) 都不會反映在「設定管理員」中。
如需有關「設定管理員」的詳細資訊,請參閱 www.adobe.com/go/settingsmanager_tw。 使用者 Flash Player Trust 目錄使用者和安裝程式應用程式可以將指定的本機 SWF 檔註冊為受信任,這些 SWF 檔是指定給本機信任的安全執行程序。它們可以與其它任何 SWF 檔互動,而且可以從遠端或本機的任何一處載入資料。使用者在「使用者 Flash Player Trust」目錄中指定檔案為受信任,此目錄與共享物件儲存區位於相同目錄中,而位於下列位置 (視目前的使用者而定,會有特定的位置):
網站控制 (原則檔)若要提供您網站伺服器的資料給另一個網域中的 SWF 檔使用,可以在伺服器中建立原則檔。「原則檔」是放置於您伺服器上特定位置中的 XML 檔。 原則檔會影響一些資源的存取,包括下列項目:
ActionScript 物件會實體化兩種不同的伺服器連線:文件架構伺服器連線和通訊端連線。ActionScript 物件 (如 Loader、Sound、URLLoader 和 URLStream) 會實體化文件架構伺服器連線,這些物件都會從 URL 載入檔案;ActionScript Socket 和 XMLSocket 物件會建立通訊端連線,這是以串流資料而不是以載入的文件運作。 由於 Flash Player 支援兩種伺服器連線,因此有兩種原則檔:URL 原則檔和通訊端原則檔。
Flash Player 需要使用與嘗試連線所要使用的相同通訊協定來傳輸原則檔。例如,將原則檔置於 HTTP 伺服器中時,來自其它網域的 SWF 檔就允許以它為 HTTP 伺服器載入資料,但是,如果不在相同伺服器上提供通訊端原則檔,就必須禁止來自其它網域的 SWF 檔,在通訊端層級連線至伺服器。換句話說,擷取原則檔的工具必須與連線的工具相符。 原則檔用法和語法會在本節中其餘內容中扼要討論,因為這些原則檔適用於為 Flash Player 10 發佈的 SWF 檔 (原則檔實作與舊版 Flash Player 稍有不同,因為後續的版本已加強了 Flash Player 的安全性)。如需有關原則檔的詳細資訊,請參閱 Flash Player 開發人員中心主題「Flash Player 9 中的原則檔變更」,網址為:www.adobe.com/go/devnet_security_en。 在 AIR 應用程式安全執行程序裡面執行的程式碼,不需要任何原則檔便可以從 URL 或通訊端存取資料。在 AIR 應用程式中以非應用程式安全執行程序執行的程式碼,則需要原則檔。 主原則檔根據預設,Flash Player (以及 AIR 應用程式安全執行程序以外的 AIR 內容) 會先在伺服器的根目錄尋找名為 crossdomain.xml 的 URL 原則檔,然後再於通訊埠 843 尋找通訊埠原則檔。這兩個位置中的檔案稱為「主原則檔」(在通訊端連線的情況下,Flash Player 也會在與主連線相同的連接埠上尋找通訊端原則檔,但是在該連接埠上找到的原則檔並不視為主原則檔)。 除了指定存取權限以外,主原則檔也包含「中繼原則」陳述式。中繼原則會指定可以包含原則檔的位置。URL 原則檔的預設中繼原則是「僅主檔」,也就是說,/crossdomain.xml 是伺服器上唯一允許的原則檔。通訊端原則檔的預設中繼原則是「全部」,也就是說,主機上的任何通訊端都可以提供通訊端原則檔。 備註: 在 Flash Player 9 及其舊版中,URL 原則檔的預設中繼原則是「全部」,也就是說,任何目錄都可以包含原則檔。如果您已部署從預設 /crossdomain.xml 檔以外位置載入原則檔的應用程式,而這些應用程式現在可能是在 Flash Player 10 中執行,您 (或伺服器管理員) 務必要修改主原則檔以允許其他原則檔。如需有關如何指定不同中繼原則的詳細資訊,請參閱 Flash Player 開發人員中心主題「Flash Player 9 中的原則檔變更」,網址為:www.adobe.com/go/devnet_security_en。
SWF 檔可以呼叫 Security.loadPolicyFile() 方法,檢查不同的原則檔案名稱和不同的目錄位置。但是,如果主原則檔不指定目標位置可提供原則檔,則呼叫 loadPolicyFile() 沒有作用,即使該位置上有原則檔也無效。先呼叫 loadPolicyFile(),再嘗試任何需要原則檔的網路作業。Flash Player 會自動在佇列中將網路要求排在相對應原則檔嘗試之後。因此,舉例來說,在起始網路作業之前立即呼叫 Security.loadPolicyFile() 是可接受的。 檢查主原則檔時,Flash Player 會等候三秒,等候伺服器回應。如果沒有接到回應,Flash Player 就會認定沒有主原則檔。但是,沒有 loadPolicyFile() 呼叫的預設逾時值,Flash Player 會假設被呼叫的檔案是存在的,並且要多久等多久,以便載入。因此,如果您要確定已載入主原則檔,請使用 loadPolicyFile() 明確地呼叫。 即使方法是命名為 Security.loadPolicyFile(),原則檔要等到發出需要原則檔的網路呼叫之後才會載入。呼叫 loadPolicyFile() 只是告知 Flash Player 在需要時到何處尋找原則檔。 您無法接到已起始或已完成原則檔要求的通知,也沒有必要這麼做。Flash Player 會執行非同步原則檢查,並自動等候到已成功查知有原則檔後才起始連線。 下節內容所包含的資訊,僅適用於 URL 原則檔。如需有關通訊端原則檔的詳細資訊,請參閱連線至通訊端。 URL 原則檔範圍URL 原則檔僅套用於載入的目錄及其子目錄。根目錄中的原則檔會套用至整個伺服器,但從任意子目錄載入的原則檔則僅套用於該目錄及其子目錄。 原則檔只影響它所在的特定伺服器。例如,位於 https://www.adobe.com:8080/crossdomain.xml 的原則檔案,只適用於在連接埠 8080 上透過 HTTPS 對 www.adobe.com 進行的資料載入呼叫。 在 URL 原則檔中指定存取權限原則檔中包含單獨一個 <cross-domain-policy> 標籤,其中再包含零個或多個 <allow-access-from> 標籤。每一個 <allow-access-from> 標籤中都包含一個特質,即 domain,它指定了確實的 IP 位址、確實的網域,或者萬用字元網域 (任何網域)。萬用字元網域會以下列兩種方式的其中一種指示:
下面是一個 URL 原則檔的範例,允許存取源自 *.example.com、www.friendOfExample.com 和 192.0.34.166 的 SWF 檔: <?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*.example.com" /> <allow-access-from domain="www.friendOfExample.com" /> <allow-access-from domain="192.0.34.166" /> </cross-domain-policy> 如果指定了一個 IP 位址,則只允許使用 IP 語法 (例如 http://65.57.83.12/flashmovie.swf) 從該 IP 位址載入的 SWF 檔進行存取,使用網域名稱語法載入的 SWF 檔則無法存取。Flash Player 不會執行 DNS 解析。 您可以允許存取源自任何網域的文件,如下列範例所示: <?xml version="1.0"?> <!-- http://www.foo.com/crossdomain.xml --> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy> 每個 <allow-access-from> 標籤也都有選擇性的 secure 特質,此特質預設為 true。如果原則檔是位於 HTTPS 伺服器上,而您想要讓位於非 HTTP 伺服器上的 SWF 檔可以透過 HTTPS 伺服器載入資料,則您可以將此特質設為 false。 將 secure 特質設為 false 有可能會破壞 HTTPS 所提供的安全性。尤其是此特質設定為 false,將會讓安全性內容門戶洞開而遭受窺探與攻擊。Adobe 強烈建議您不要將 secure 特質設定為 false。 如果要載入的資料位於 HTTPS 伺服器上,但載入端 SWF 檔位於 HTTP 伺服器上,Adobe 建議您將載入端 SWF 檔移到 HTTPS 伺服器上。如此一來,就可以讓您所有的安全資料都在 HTTPS 的保護之下。但是,如果您決定必須將載入端 SWF 檔放在 HTTP 伺服器中,請將 secure="false" 特質加入至 <allow-access-from> 標籤,如下列程式碼所示: <allow-access-from domain="www.example.com" secure="false" /> 另一個您可以用來准許存取的元素是 allow-http-request-headers-from 標籤。這個元素會授與用戶端權限,從另一個網域裝載內容,以傳送使用者定義的檔頭到您的網域。<allow-access-from> 標籤可以授與其他網域權限從您的網域拉出資料,而 allow-http-request-headers-from 標籤則是授與其他網域權限推入資料到您的網域,以檔頭的形式進行。在下列範例中,任何網域都准許傳送 SOAPAction 檔頭到目前的網域:
<cross-domain-policy> <allow-http-request-headers-from domain="*" headers="SOAPAction"/> </cross-domain-policy> 如果 allow-http-request-headers-from 陳述式是在主原則檔中,它會套用於主機上的所有目錄。否則,僅套用於包含該陳述式之原則檔的目錄及其子目錄。 預先載入原則檔從伺服器載入資料或連線到通訊端是非同步作業,Flash Player 會等候原則檔完成下載之後,再開始執行主要作業。但是從影像擷取像素資料,或是從聲音擷取樣本資料都是同步作業,必須載入原則檔,才能擷取資料。當您載入媒體時,請指定它檢查原則檔:
當您設定上述其中一個參數時,Flash Player 會先檢查已為該網域下載之任何原則檔,然後再於伺服器上的預設位置尋找原則檔,檢查是否有 <allow-access-from> 陳述式和中繼原則存在。最後,它會考慮任何等候執行的 Security.loadPolicyFile() 方法呼叫,以查看是否在範圍中。 作者 (開發人員) 控制用來授與安全性權限的主要 ActionScript API 是 Security.allowDomain() 方法,它會授與所指定網域中的 SWF 檔權限。在下列範例中,SWF 檔會授予來自 www.example.com 網域之 SWF 檔的存取權限: Security.allowDomain("www.example.com") 此方法會授與下列項目權限:
呼叫 Security.allowDomain() 方法的主要目的,是要授與位於外部網域的 SWF 檔存取權限,以編寫 SWF 檔的指令碼並呼叫 Security.allowDomain() 方法。如需詳細資訊,請參閱跨指令碼處理。 指定 IP 位址為 Security.allowDomain() 方法的參數並不會允許源自指定之 IP 位址的各方進行存取;而是只允許在其 URL 中含有指定之 IP 位址 (不是對應至該 IP 位址的網域名稱) 的一方進行存取。例如,如果網域名稱 www.example.com 對應於 IP 位址 192.0.34.166,則呼叫 Security.allowDomain("192.0.34.166") 並不會授與存取 www.example.com 的權限。 您可以將 "*" 萬用字元傳遞至 Security.allowDomain() 方法,允許所有網域都可以進行存取。因為它會授與「所有」網域的 SWF 檔權限,以編寫呼叫端 SWF 檔的指令碼,所以請謹慎使用 "*" 萬用字元。 ActionScript 包含第二個權限 API,稱為 Security.allowInsecureDomain()。此方法所執行的作業與 Security.allowDomain() 方法相同,不同的是透過安全 HTTPS 連線提供的 SWF 檔呼叫此方法時,它還能允許透過不安全通訊協定 (如 HTTP) 提供的其它 SWF 檔來存取呼叫端 SWF 檔。但是,在來自安全通訊協定 (HTTPS) 與來自不安全通訊協定 (如 HTTP) 的檔案之間允許指令碼處理並不是很好的安全性做法,這種做法可能會讓安全內容門戶洞開,而遭受窺探與攻擊。這類攻擊是以下列方式運作:由於 Security.allowInsecureDomain() 方法允許透過經由 HTTP 連線提供的 SWF 檔存取您的安全 HTTPS 資料,所以攻擊者只要插入您的 HTTP 伺服器與您的使用者之間,就能以他們自己的 SWF 檔取代您的 HTTP SWF 檔,然後存取您的 HTTPS 資料。 重要事項: 在 AIR 應用程式安全執行程序中執行的程式碼,不允許呼叫 Security 類別的 allowDomain() 或 allowInsecureDomain() 方法。
另一個與安全性相關的重要方法是 Security.loadPolicyFile() 方法,它會讓 Flash Player 在非標準位置檢查原則檔。如需詳細資訊,請參閱網站控制 (原則檔)。 |
|