整理了下Flash安全相關的知識,后面會再完善?
flash如何跨域通信,全靠crossdomain.xml這個文件。這個文件配置在服務端,一般為根目錄下,限制了flash是否可以跨域獲取數據以及允許從什么地方跨域獲取數據。
比如下面的列子: 1、www.a.com域下不存在crossdomain.xml文件,則不允許除了www.a.com域之外的其他任何域下的flash進行跨域請求。
2、www.a.com域下存在crossdomain.xml文件,如若配置 allow-access-from 為www.b.com,則只允許www.b.com域下的flash進行跨域請求,以及來自自身域www.a.com的網絡請求。 crossdomain.xml需嚴格遵守XML語法,有且僅有一個根節點cross-domain-policy,且不包含任何屬性。在此根節點下只能包含如下的子節點:
site-control
allow-access-from
allow-access-from-identity
allow-http-request-headers-from
早期的flash允許從其他位置載入自定義的策略文件,目前最新版的flash在接受自定義的策略文件之前會去檢查主目錄的crossdomain.xml來判斷是否接受自定義策略文件。該選項就由site-control進行控制。
不加該選項時,默認情況下flash不加載除主策略文件之外的其他策略文件,即只接受根目錄下的crossdomain.xml,這樣可以防止利用上傳自定 義策略文件進行的攻擊。如果需要啟用其他策略文件,則需要配置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也可被加載為策略文件!
例子:
<site-control permitted-cross-domain-policies="by-content-type" >
允許通過HTTP/HTTPS協議加載http頭中Content-Type為text/x-cross-domain-policy的文件作為策略文件
<site-control permitted-cross-domain-policies="all" >
允許加載任意文件作為策略文件
該選項用來限制哪些域有權限進行跨域請求數據。
allow-access-from有三個屬性
domain:有效的值為IP、域名,子域名代表不同的域,通配符*單獨使用代表所有域。通配符作為前綴和域名進行組合代表多個域,比如*.weibo.com,代表weibo.com所有的子域。
to-ports:該屬性值表明允許訪問讀取本域內容的socket連接端口范圍。可使用to-ports="1100,1120-1125"這樣的形式來限定端口范圍,也可使用通配符(*)表示允許所有端口。
secure:該屬性值指明信息是否經加密傳輸。當crossdomain.xml文件使用https加載時,secure默認設為true。此時將不允許flash傳輸非https加密內容。若手工設置為false則允許flash傳輸非https加密內容。
例子
http://a.com/crossdomain.xml文件內容如下
<cross-domain-policy >
<allow-access-from domain="*.b.com" secure="true" />
</cross-domain-policy >
允許所有qq.com的子域通過https對t.qq.com域進行跨域請求。
該節點配置跨域訪問策略為允許有特定證書的來源跨域訪問本域上的資源。每個allow-access-from-identity節點最多只能包含一個signatory子節點。
此節點授權第三方域flash向本域發送用戶定義的http頭。
allow-http-request-headers-from包含三個屬性:
domain:作用及參數格式與allow-access-from節點中的domain類似。
headers:以逗號隔開的列表,表明允許發送的http頭。可用通配符(*)表示全部http頭。
secure:作用及用法與allow-access-from節點中的secure相同。
注:Flash 在自定義HTTP頭中無法使用下列請求標題,并且受限制的詞不區分大小寫(例如,不允許使用 Get、get 和 GET)。 另外,如果使用下劃線字符,這也適用于帶連字符的詞(例如,不允許使用 Content-Length 和 Content_Length):
Accept-Charset、Accept-Encoding、Accept-Ranges、Age、Allow、Allowed、Authorization、Charge-To、Connect、Connection、Content-Length、Content-Location、Content-Range、Cookie、Date、Delete、ETag、Expect、Get、Head、Host、Keep-Alive、Last-Modified、Location、Max-Forwards、Options、Post、Proxy-Authenticate、Proxy-Authorization、Proxy-Connection、Public、Put、Range、Referer、Request-Range、Retry-After、Server、TE、Trace、Trailer、Transfer-Encoding、Upgrade、URI、User-Agent、Vary、Via、Warning、WWW-Authenticate 和 x-flash-version。
設置嚴格的crossdomain.xml文件可以提高服務端的安全性,在web應用中也會經常使用flash,一般是通過<object>或者<embed>來進行調用,例如下面:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"name="Main" width="1000" height="600" align="middle" id="Main" >
<embed flashvars="site=&sitename=" src='Loading.swf?user=453156346&key=df57546b-c68c-4fd7-9f9c-2d105905f132&v=10950&rand=633927610302991250' width="1000" height="600"align="middle" quality="high" name="Main" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" >
</object >
<embed src="http://www.xxx.com/Loading.swf" allowScriptAccess="sameDomain" type="application/x-shockwave-flash>
flash是直接可以執行js代碼的,所以在web應用中如果使用不當也會很危險,所以flash使用下面兩個屬性來保證引用flash時的安全性。
allowScriptAccess 和 allowNetworking
allowScriptAccess用來控制flash與html的通訊,可選的值為:
always //對與html的通訊也就是執行javascript不做任何限制
sameDomain //只允許來自于本域的flash與html通訊,這是默認值
never //絕對禁止flash與頁面的通訊
allowNetworking用來控制flash與外部的網絡通訊,可選的值為:
all //允許使用所有的網絡通訊,也是默認值
internal //flash不能與瀏覽器通訊如navigateToURL,但是可以調用其他的API
none //禁止任何的網絡通訊
在allowNetworking設置為internal時,下面API將會被禁止使用:
fscommand()
navigateToURL()
ExternalInterface.call()
在allowNetworking設置為none時,下面API將會被禁止使用:
sendToURL()
FileReference.download()
FileReference.upload()
Loader.load()
LocalConnection.connect()
LocalConnection.send()
NetConnection.connect()
URLStream.load()
NetStream.play()
Security.loadPolicyFile()
SharedObject.getLocal()
SharedObject.getRemote()
Socket.connect()
Sound.load()
URLLoader.load()
XMLSocket.connect()
在web應用中使用flash的時候一般通過設置這兩項即可保證安全性,如果在web應用中使用的flash為用戶可控,強烈建議這兩項的設置值為
allowScriptAccess=never allowNetworking=none
如果web應用中調用flash時設置的allowScriptAccess為never、allowNetworking為none,即使flash文件 本身存在漏洞也可以忽略。不過事實上大部分web應用不會設置這兩項屬性,甚至會設置的不安全,比如allowScriptAccess為always、 allowNetworking為all。所以在進行flash開發的時候就要考慮好安全性。
flash編程不安全可導致兩方面的漏洞:
1、通過ExternalInterface.call()執行javascript代碼
2、通過loadMovie()等方式可以載入外部flash文件執行
這兩類問題都是需要通過參數接收外面傳入的數據,在flash內部沒有對數據進行嚴格的控制造成的。
例子:
this.movieName = root.loaderInfo.parameters.movieName;
this.flashReady_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].flashReady";
ExternalCall.Simple(this.flashReady_Callback);
public static function Simple(arg0:String){
ExternalInterface.call(arg0);
return;
}
接收到外部傳入的movieName沒有進行處理,最后通過ExternalInterface.call()進行執行,這樣就能夠執行任意的javascript代碼,如果在調用flash的時候設置的不夠安全就是XSS漏洞。
所以在flash編程中如果需要通過參數接收外部傳入的數據,一定要對數據進行嚴格的檢查,這樣才能保證flash安全性。
參考文檔:
Flash應用安全規范 http://www.80sec.com/flash-security-polic.html
flash跨域策略文件crossdomain.xml配置詳解 http://hi.baidu.com/cncxz/blog/item/7be889fa8f47a20c6c22eb3a.html
Cross-domain Policy File Specification http://www.senocular.com/pub/adobe/crossdomain/policyfiles.html