Flash安全沙箱和跨域文件
1.1?簡述flash的安全沙箱?
1.Flash有四種基本的沙箱類型:
Remote: swf來自網絡,遵守域的沙箱規則,不能讀取不同域中的資源,除非有設置。
Local?with?file?:swf是本地文件,可以讀取本地數據,但不能與網絡通信。
Local?with?network:swf是本地文件,可以與網絡通信,但不可以讀取本地數據。
Local?trusted?:swf是本地文件,可以讀取本地數據,也可以與網絡通信,此為最高權限,受本地信任。(一般開發階段,swf默認設置為此權限)
2.2條基本原則:
位于同一沙箱中的資源始終可以互相訪問。
遠程沙箱中的swf始終不能訪問本地文件和數據。?
?
1.2?flash跨域策略文件crossdomain.xml配置詳解??
一、概述
?解決flash安全沙箱帶來的跨域問題的方法之一是部署策略文件(crossdomain.xml),該文件限制了flash是否可以跨域讀寫數據以及允許從什么地方跨域讀寫數據。
?過程:
位于A域中的SWF文件要訪問B域的文件時,SWF首先會檢查B域服務器目錄下是否有crossdomain.xml文件,如果沒有,則訪問不成功;若crossdomain.xml文件存在,且里邊設置了允許A域訪問,那么通信正常。所以要使Flash可以跨域傳輸數據,其關鍵就是crossdomain.xml。
?一個通用的跨域文件內容如下:
<?xml?version="1.0"?>
<!DOCTYPE?cross-domain-policy?SYSTEM?"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>?????????
????<allow-access-from?domain="*"?/>???
</cross-domain-policy>?
?
二、crossdomain.xml的配置?
?
1.crossdomain.xml的放置位置?
A.主策略文件放置位置
? ? ?如有跨域訪問需求,必須在目標域的根目錄下放置crossdomain.xml文件(例如:tomcat下的root文件夾中),且該根目錄下的配置文件稱為“主策略文件”。若不存在主策略文件,則該域將禁止任何第三方域的flash跨域請求。
主策略文件對全站的跨域訪問起控制作用。
?
主策略文件舉例:
新浪微博的跨域文件
http://weibo.com/crossdomain.xml??
<cross-domain-policy?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> <allow-access-from?domain="js.wcdn.cn"/> <allow-access-from?domain="js.t.sinajs.cn"/> <site-control?permitted-cross-domain-policies="all"/> <allow-http-request-headers-from?domain="js.wcdn.cn"?headers="*"/> <allow-http-request-headers-from?domain="js.t.sinajs.cn"?headers="*"/> </cross-domain-policy>?
百度貼吧的跨域文件:
http://tieba.baidu.com/crossdomain.xml??
<cross-domain-policy> <allow-access-from?domain="tieba.baidu.com"/> <allow-access-from?domain="static.tieba.baidu.com"/> <allow-access-from?domain="mv.baidu.com"/> <allow-access-from?domain="tb2.bdstatic.com"/> <allow-access-from?domain="tb1.bdstatic.com"/> </cross-domain-policy>優酷的跨域文件
http://www.youku.com/crossdomain.xml??
<cross-domain-policy> <allow-access-from?domain="*"/> </cross-domain-policy>?
B.子策略文件放置的位置
? ? 也可以單獨在某路徑下放置僅對該路徑及其子路徑生效的crossdomain.xml配置文件,這需要在flash的AS腳本中使用如下語句來加載該配置文件:[具體的加載權限限制,將受后文中site-control策略的影響]
?Security.loadPolicyFile("http://www.xxx.com/subdir/crossdomain.xml")
?
2.crossdomain.xml的配置方法及影響?
? ? crossdomain.xml需嚴格遵守XML語法,有且僅有一個根節點cross-domain-policy,且不包含任何屬性。在此根節點下只能包含如下的子節點:
site-control
allow-access-from
allow-access-from-identity
allow-http-request-headers-from
?
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設置。?
如果網站的根目錄下沒有主策略文件,而在子文件夾中部署了子策略文件,那么flash會報錯,提示服務器的默認設置是“master-only”,將自動忽略子文件夾中的策略文件。簡而言之,要使用子策略文件,根目錄必須有個主策略文件。
下面的例子將site-control策略配置為可加載本服務器中其它的text/x-cross-domain-policy文件作為跨域策略文件。
?<cross-domain-policy>?
?????<site-control?permitted-cross-domain-policies="by-content-type"?/>?
</cross-domain-policy>
?
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加密內容。(adobe官方建議不使用false)?
下面的例子配置為允許所有qq.com下的所有二級域名[包括qq.com本身]通過https訪問本域中的內容。
<cross-domain-policy>?
?????<allow-access-from?domain="*.qq.com"?secure="true"?/>?
</cross-domain-policy>
?
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>
?
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>
?
三、總結
?
不正確的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”。
?
本文在http://www.2cto.com/Article/201108/100008.html的基礎上進行了一定修改。
轉載于:https://www.cnblogs.com/moring/archive/2012/07/11/2586786.html
總結
以上是生活随笔為你收集整理的Flash安全沙箱和跨域文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第31届中国国际信息通信展新闻发布会在京
- 下一篇: 华虹半导体二次上市获批,有望成为今年国内