Flash安全的一些總結
整理了下Flash安全相關的知識,後面會再完善
一、先來說crossdomain.xml這個檔案
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
site-control
早期的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
該選項用來限制哪些域有許可權進行跨域請求資料。
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
該節點配置跨域訪問策略為允許有特定證照的來源跨域訪問本域上的資源。每個allow-access-from-identity節點最多隻能包含一個signatory子節點。
allow-http-request-headers-from
此節點授權第三方域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。
二、web應用中安全使用flash
設定嚴格的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
三、flash安全程式設計
如果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
相關文章
- Redux的一些總結2019-02-27Redux
- mysql的一些總結2017-10-16MySql
- 安全總結2024-08-16
- 正則的一些總結2018-05-19
- 一些總結而已2013-12-12
- Promise一些小總結2018-01-05Promise
- 關於NTFS資料夾的安全許可權分配的一些總結2017-11-12
- Ajax技術的一些總結2019-03-18
- LevelDB的一些簡單總結2016-10-15
- 外連線的一些總結2007-04-01
- 自己總結的一些enqueue的東東2007-12-13ENQ
- 資訊蒐集一些總結2021-07-20
- 安全基礎總結2018-10-25
- 安全手冊總結2010-11-30
- 總結下 javascript 中的一些小技巧2019-04-03JavaScript
- 關於Mysql使用的一些總結2019-05-10MySql
- GoLang中字串的一些使用總結2021-09-09Golang字串
- Swift中Initialization的一些個人總結2019-02-12Swift
- larabbs 使用的一些擴充總結2018-11-05
- 學習 CodeWhisperer 的一些總結2023-09-21
- MySql關於鎖的一些總結2021-10-15MySql
- php的一些面試題總結(5)2017-06-07PHP面試題
- RunLoop的一些學習與總結2017-01-20OOP
- 關於繼承的一些小總結2014-02-28繼承
- 關於EM配置的一些總結2015-04-04
- 建模的一些體會和總結2013-08-03
- Java 內部類的一些總結2015-12-07Java
- Java內部類的一些總結2015-12-07Java
- 最近的一些總結-記錄(1)2009-02-20
- foreign key的一些總結2012-10-14
- 關於BUFFER POOL的一些總結2007-04-01
- 關於Oracle塊的一些總結2009-09-15Oracle
- Java中的Unsafe在安全領域的一些應用總結和復現2022-03-02Java
- CSS3一些總結2024-03-17CSSS3
- 總結的一些簡單面試題目2020-03-22面試題
- APK體積優化的一些總結2019-05-11APK優化
- 關於Code Review的一些思考總結2019-04-30View
- 總結一些常用的陣列函式2019-06-08陣列函式