flash跨域策略文件crossdomain.xml配置詳解


1、簡介



flash在跨域時惟一的限制策略就是crossdomain.xml文件,該文件限制了flash是否能夠跨域讀寫數據以及容許從什麼地方跨域讀寫數據。

位於www.a.com域中的SWF文件要訪問www.b.com的文件時,SWF首先會檢查www.b.com服務器目錄下是否有crossdomain.xml文件,若是沒有,則訪問不成功;若crossdomain.xml文件存在,且裏邊設置了容許www.a.com域訪問,那麼通訊正常。因此要使Flash能夠跨域傳輸數據,其關鍵就是crossdomain.xml。

本文將着重介紹crossdomain.xml文件的配置方法及不一樣配置對flash跨域的影響。


2、crossdomain.xml的配置


2.1 crossdomain.xml的放置位置


自flash 10之後,若有跨域訪問需求,必須在目標域的根目錄下放置crossdomain.xml文件,且該根目錄下的配置文件稱爲「主策略文件」。若不存在主策略文件,則該域將禁止任何第三方域的flash跨域請求。

主策略文件對全站的跨域訪問起控制做用。

也能夠單獨在某路徑下放置僅對該路徑及其子路徑生效的crossdomain.xml配置文件,這須要在flash的AS腳本中使用以下語句來加載該配置文件:[具體的加載權限限制,將受後文中site-control策略的影響]

Security.loadPolicyFile("http://www.xxx.com/subdir/crossdomain.xml")

2.2 crossdomain.xml的配置方法及影響


crossdomain.xml需嚴格遵照XML語法,有且僅有一個根節點cross-domain-policy,且不包含任何屬性。在此根節點下只能包含以下的子節點:site-control、allow-access-from、allow-access-from-identity、allow-http-request-headers-from。下面將分別介紹這四個子節點:


2.2.1 site-control:經過檢查該節點的屬性值,確認是否能夠容許加載其餘策略文件。[若是該策略文件並不是主策略文件,則此節點被自動忽略]

每一個site-control標籤有且僅有屬性permitted-cross-domain-policies,該屬性指定相對於非主策略文件的其餘策略文件的加載策略。permitted-cross-domain-policies屬性值有以下狀況:

none: 不容許使用loadPolicyFile方法加載任何策略文件,包括此主策略文件。

master-only: 只容許使用主策略文件[默認值]。

by-content-type:只容許使用loadPolicyFile方法加載HTTP/HTTPS協議下Content-Type 爲text/x-cross-domain-policy的文件做爲跨域策略文件。

by-ftp-filename:只容許使用loadPolicyFile方法加載FTP協議下文件名爲       crossdomain.xml的文件做爲跨域策略文件。

all: 可以使用loadPolicyFile方法加載目標域上的任何文件做爲跨域策略文件,甚至是一 個JPG也可被加載爲策略文件![使用此選項那就等着被xx吧!]

如須要對網站某子目錄作單獨的flash跨域限制策略,在主策略文件中必須進行相應的site-control設置。

下面的例子將site-control策略配置爲可加載本服務器中其它的text/x-cross-domain-policy文件做爲跨域策略文件。

<cross-domain-policy>

     <site-control permitted-cross-domain-policies="by-content-type" />

</cross-domain-policy>
 
2.2.2 allow-access-from:經過檢查該節點的屬性值,確認可以讀取本域內容的flash文件來源域。


allow-access-from標籤有三個屬性:

·domain:該屬性指定一個確切的 IP 地址、一個確切的域或一個通配符域(任何域)。只有domain中指定的域,纔有權限經過flash讀取本域中的內容。

可採用下列兩種方式之一來表示通配符域:

1)單個星號(*),如:<allow-access-fromdomain="*" />,表示匹配全部域和全部 IP 地址,此時任何域都可跨域訪問本域上的內容。[這是極不安全的!]

2)後接後綴的星號,表示只匹配那些以指定後綴結尾的域,如*.qq.com可匹配   game.qq.com、qq.com。形如www.q*.com或www.qq.*的爲無效配置。

Tips:當domain被指定爲IP地址時,只接受使用該IP做爲網址來訪問的來源請求[此時ip地址也就至關於一個域名而已],如domain被設置爲192.168.1.100時,使用http://192.168.1.100/flash.swf 來請求該域內容是容許的,可是使用指向192.168.1.100的域名www.a.com來訪問時[http://www.a.com/flash.swf]將會被拒絕,由於flash不懂得dns解析:)

·to-ports:該屬性值代表容許訪問讀取本域內容的socket鏈接端口範圍。可以使用to-ports="1100,1120-1125"這樣的形式來限定端口範圍,也可以使用通配符(*)表示容許全部端口。

·secure:該屬性值指明信息是否經加密傳輸。當crossdomain.xml文件使用https加載時,secure默認設爲true。此時將不容許flash傳輸非https加密內容。若手工設置爲false則容許flash傳輸非https加密內容。

下面的例子配置爲容許全部qq.com下的全部二級域名[包括qq.com自己]經過https訪問本域中的內容。

<cross-domain-policy>

     <allow-access-from domain="*.qq.com" secure="true" />

</cross-domain-policy>

2.2.3 allow-access-from-identity:該節點配置跨域訪問策略爲容許有特定證書的來源跨域訪問本域上的資源。每一個allow-access-from-identity節點最多隻能包含一個signatory子節點。形如:

<allow-access-from-identity>

   <signatory>

     <certificate

       fingerprint="01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef:01:23:45:67"

       fingerprint-algorithm="sha-1"/>

   </signatory>

</allow-access-from-identity>

2.2.4 allow-http-request-headers-from:此節點受權第三方域flash向本域發送用戶定義的http頭。


allow-access-from節點受權第三域提取本域中的數據,而 allow-http-request-headers-from 節點受權第三方域將數據以http頭的形式發送到本域中。[簡而言之,allow-access-from是控制讀取權限,allow-http-request-headers-from是控制以http頭形式的寫入權限]

allow-http-request-headers-from包含三個屬性:

·domain:做用及參數格式與allow-access-from節點中的domain相似。

·headers:以逗號隔開的列表,代表容許發送的http頭。可用通配符(*)表示所有    http頭。

·secure:做用及用法與allow-access-from節點中的secure相同。

在下面的示例中,任何域均可以向當前域發送 SOAPAction 標頭:

<cross-domain-policy>

     <allow-http-request-headers-from domain="*" headers="SOAPAction" />

</cross-domain-policy>
 
3、總結   不正確的crossdomain.xml策略將致使嚴重的安全問題,如信息泄露、CSRF等。從上文中能夠看出,在進行安全評估時,咱們應重點關注如下幾點: 1)allow-access-from標籤的domain屬性檢測:domain屬性應根據最小化原則按需設置,僅容許可信任的來源跨域請求本域內容。禁止將該屬性值設置爲「*」。 2)allow-http-request-headers-from標籤的domain屬性檢測:domain屬性應根據最小化原則按需設置,僅容許可信任的來源向本域跨域發送內容。禁止將該屬性值設置爲「*」。 3) site-control標籤的permitted-cross-domain-policies屬性檢測:根據業務的實際需求及可行性,對該屬性作相應設置。禁止將該屬性值設置爲「all」。
相關文章
相關標籤/搜索