1. 程式人生 > >跨域策略檔案crossdomain.xml檔案

跨域策略檔案crossdomain.xml檔案

使用crossdomain.xml讓Flash可以跨域傳輸資料

一、crossdomain.xml檔案的作用
    跨域,顧名思義就是需要的資源不在自己的域伺服器上,需要訪問其他域伺服器。跨域策略檔案是一個xml文件檔案,主要是為web客戶端(如Adobe Flash Player等)設定跨域處理資料的許可權。打個比方說,公司A部門有一臺公共的電腦,裡面存放著一些資料檔案,專門供A部門內成員自己使用,這樣,A部門內的員工就可以訪問該電腦,其他部門人員則不允許訪問。如下圖:

A部門的員工可以任意訪問A部門的公共電腦,但是不能直接訪問B部門的公共電腦。有一天,B部門領導覺得他們的資料非常有用,想要與A部門分享,於是就給A部門一個令牌,這樣A部門的員工也可以訪問B部門的公共電腦了。
    換成系統,常見就如同下面所示:

上圖是典型的跨域請求,業務伺服器向圖片伺服器上傳圖片時就涉及到了跨域,要想能正常訪問,圖片伺服器需要給業務伺服器設定允許訪問的許可權。而這個許可權設定就是跨域策略檔案crossdomain.xml存在的意義。

二、配置規則
cross-domain-policy
cross-domain-policy元素是跨域策略檔案crossdomain.xml的根元素。它只是一個策略定義的容器,沒有自己的屬性。子元素有:
site-control
allow-access-from
allow-access-from-identity
allow-http-request-headers-from
site-control
site-control元素用於定義當前域的元策略。元策略則是用於指定可接受的域策略檔案,且該檔案不同於目標域根元素(名為crossdomain.xml)中的主策略檔案。
如果客戶端收到指示使用主策略檔案以外的策略檔案,則該客戶端必須首先檢查主策略的元策略,以確定請求的策略檔案是否獲得許可。
屬性:

permitted-cross-domain-policies
指定元策略。除套接字策略檔案外,所有策略檔案的預設值均為master-only,套接字策略檔案的預設值為all。該屬性允許的值有:
none:目標伺服器上的任何位置(包括該主策略檔案)均不允許使用策略檔案。
master-only:僅允許這個主策略檔案。
by-content-type:僅允許Content-Type:text/x-cross-domain-policy提供的策略檔案(只適用於HTTP/HTTPS)。
by-ftp-filename:僅允許檔名為crossdomain.xml的策略檔案。(只適用於FTP)
all:允許此目標域中所有的策略檔案。
allow-access-from
allow-access-from元素用於授權發出請求的域從目標域中讀取資料。可以通過使用萬用字元(*),為多個域設定訪問許可權。
屬性:

domain:指定要授予訪問許可權的發出請求的域。可以是域名或IP地址。子域將被視為不同的域。指定域時可以使用萬用字元星號( * )表示多個域。單獨使用星號( * )表示所有域。一般不建議設定為星號允許所有域訪問。
to-ports:只適用於Sockets,以逗號分隔的埠列表,或者允許連線到套接字連線的一系列埠。埠範圍通過在兩個埠號之間插入短劃線 (-) 指定。埠範圍在用逗號隔開時則可以用於指代單個埠。一個萬用字元 (*) 可用於表示允許所有埠。
secure:只只適用於HTTPS和Sockets,指定僅授予指定來源的 HTTPS 文件的訪問許可權 (true),還是授予指定來源的所有文件的訪問許可權 (false)。如果 HTTPS 策略檔案中未指定 secure,則預設為 true。不建議在 HTTPS 策略檔案中使用 false,因為這會影響 HTTPS 的安全性。在套接字策略檔案中,預設值為 false。只有當套接字伺服器接受本地主機連線時,指定 secure=”true” 才有意義,因為本地套接字連線通常不會面臨中間人攻擊的風險,因此無法更改 secure=”true” 宣告。
allow-access-from-identity
allow-access-from-identity元素根據加密憑據授予許可權,而 allow-access-from 則截然不同,它根據來源授予許可權。
allow-http-request-headers-from
allow-http-request-headers-from元素用於授權發出請求的域中的請求文件將使用者定義的標頭髮送到目標域。而 allow-access-from 元素旨在授權從目標域提取資料。這個標籤授權以標頭的形式推送資料。
屬性:
domain:指定要授予訪問許可權的的域。可以是域名,也可以是IP地址,子域將被視為不同的域。萬用字元 (*) 單獨使用時可用於表示所有域,在用作以句點 (.) 分隔的明確二級域名字首時表示多個域。表示單個域時需要使用單獨的 allow-access-from 元素。
headers:以逗號分隔的標頭列表,表示允許傳送的請求域。萬用字元 (*) 可用於准許所有標頭或頭字尾,從而支援以相同字元開頭但以不同字元結尾的標頭。
secure:只適用於HTTPS,如果設定為 false,則表示允許 HTTPS 策略檔案授權訪問 HTTP 源發出的請求。預設值為 true,表示僅提供 HTTPS 源許可權。我們不推薦使用 false。
三、匹配規則
各個域或子域必須完全匹配。如www.example.com匹配http://www.example.com。
IP地址和域名不匹配,即使IP地址就是域名指代的IP也不行。
域萬用字元與該域本身及所有子域匹配。
單獨使用萬用字元 (*) 允許所有請求者進行訪問,但不推薦使用。只有在策略檔案範圍內的所有內容完全公開的情況下才應當使用允許所有許可權。
舉例:

域值 匹配 不匹配
www.example.com http://www.example.com http://example.com
http://example.com
http://www.example.net
*.example.com http://example.com
http://www.example.com
http://deep.subdomain.example.com http://www.example.net
http://*.example.com http://example.com
http://www.example.com
http://deep.subdomain.example.com 所有的https域
127.0.0.1 http://127.0.0.1 http://localhost
http://127.0.0
http://127.0.0.2
www.example.* 無效的值,不匹配 無

示例檔案

<?xml version="1.0"?>   
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="master-only"/>
    <!-- 允許example.com及其子域訪問 -->
    <allow-access-from domain="*.example.com"/>
    <!-- 允許http://www.example.com訪問 -->
    <allow-access-from domain="www.example.com"/>
    <allow-http-request-headers-from domain="*.csdn.net" headers="*"/>
</cross-domain-policy>
View Code

 

原文:https://blog.csdn.net/gnail_oug/article/details/53488918

https://www.cnblogs.com/jiuyi/p/6068190.html

另外:

當Flex訪問WebService服務時,在本地能夠正常訪問,當部署到web容器中釋出為web服務後,再呼叫WebServicIE,此時就會被拒絕訪問,這就是Flex跨域訪問的沙箱問題,
為了解決Flex跨域訪問WebService的問題,可採用如下方案:
首先,跨域訪問被拒絕是因為提供服務方沒有配置安全策略檔案,即crossdomain.xml,如果你不想用crossdomain.xml就要用到代理,即自己寫一個後臺讀取webservice,然後提供給自己的flex應用,因為在flashplayer中,要跨域必須要有策略檔案。考慮到 flashplayer升級到9.124之後,加強了安全性,之前的crossdomain.xml的寫法發生了變化,以下就是該檔案的完整寫法:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
表示該服務允許任何外域來訪問。
關於crossdomain.xml的放置目錄問題,有如下解決方案,可放置在:

1) 如果這個目錄是容器的根目錄,可以通過以下的url訪問crossdomain.xml: 

http://localhost:8080/crossdomain.xml 。
2) 如果crossdomain.xml不是放在根目錄下,而是在某個webapp下面,在flex中就需要在初始化的時候應用 
Security.loadPolicyFile("http:// localhost:8080/aaa /crossdomain.xml"); 

其中aaa為webapp的名稱
這樣,外部Flex訪問該服務釋出的WebService時,flashplayer首先找的就是crossdomain.xml檔案,若安全機制設定為允許訪問,則訪問成功