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


轉自:https://www.cnblogs.com/-yan/p/4529269.html

0x01 簡介
  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跨域的影響。

 

0x02 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.1site-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>

0x03 總結
不正確的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”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM