flash的Socket通讯沙箱和安全策略问题
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
一、沙箱和安全策略問題
??? 1、此問題發(fā)生在連接時,準確地說是連接前,分別兩種情況:
??????? 1.本地播放
?? 本地播放時,默認情況下Flash Player將不允許swf訪問任何網(wǎng)絡。
?? 訪問http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html,將swf加入到許可列表,即可解除限制。
??? 2.WEB發(fā)布
?? 發(fā)布在WEB上的swf, 將可能面臨跨域的問題。
??? 2、Flash中的通信方式有兩種:
1.HTTP方式:如URLLoader等用于加載遠程swf、文件、圖像、音視頻流。
2.Socket主要:如 XMLSocket,用于與遠程服務端建立長效連接。
Flash Player6以上版本引入了安全策略文件,在進行正式的通信前,會檢查目標位置是否存在合法的安全策略,以防止不同域內(nèi)的應用無限制任意互訪。
HTTP方式下,Flash Player會檢查目標域根目錄下是否存在crossdomain.xml,如果有,則獲取并分析其內(nèi)容(內(nèi)容后述)以確定是否允許繼續(xù)訪問。
Socket方式下,Flash Player獲取安全策略稍微復雜些,從9.0.115.0版起,標準步驟如下(以下描述以IE為標準,例外情況后述):
1)首先向目標主機 843 端口發(fā)起連接,并發(fā)送一個字符串,內(nèi)容為"<policy-file-request/>",并等待返回安全策略文件并分析。
2)若1)失敗,則檢查AS代碼中是否使用了Security.loadPolicyFile("xmlsocket://主機:端口")方法加載安全策略文件,若有,則獲取并分析。
3)若2)失敗,則向AS代碼中即將連接的 "目標主機:端口" 發(fā)起請求,過程同1)。
4)若成功獲得安全策略文件并經(jīng)分析認為允許建立連接,則繼續(xù)執(zhí)行Connect()方法,此時方真正嘗試創(chuàng)建與目標主機的連接。
3、解決方案
HTTP 連接方式不用再說,只說說 Socket 方式。
1) 在服務端寫一個程序,監(jiān)聽843端口,當收到 "<policy-file-request/>" 時將恰當?shù)牟呗詢?nèi)容(crossdomain.xml)發(fā)送回客戶端。
2) 在AS中通過loadPolicyFile()加載策略文件,此處需注意使用xmlsocket://,而不是 http://。
3) 在標準服務端口中,檢測到"<policy-file-request/>"時,返回策略內(nèi)容。
4、例外情況及測試結(jié)果
經(jīng)測試發(fā)現(xiàn),在IE,Opera中,Flash Player會嚴格按上述步驟檢查安全策略。
在 FireFox, Chrome中發(fā)起連接時,Flash Player并不會向服務端發(fā)送"<policy-file-request/>",而是直接連接成功。這應該是Flash Player不同實現(xiàn)版本的原因。
??? 5、數(shù)據(jù)傳輸中的問題
?? 在XMLSocket數(shù)據(jù)傳輸中,需要注意以下細節(jié),否則會出來些莫名其妙的問題。
?????? 1.結(jié)束符號
XMLSocket接收到服務端下發(fā)的數(shù)據(jù)時,將連續(xù)放于接收緩沖區(qū),直到接收到"\0"字節(jié)(字節(jié)內(nèi)容為ASCII值0),才認為接收完成,并調(diào)用相應的onData或onXML事件。
服務端若用Java編寫,并使用標準的String類族,則在發(fā)送數(shù)據(jù)結(jié)尾應手動加上"\0"。
若用 C++ 編寫,由于C++中標準字符串類型便是以字節(jié)0作結(jié)束標記,故不必再加"\0"。
* C++中需注意另一個問題,若自行進行了字符串處理,在決定字符串長度時,標準的strlen及String.Length()等返回的均是實際有效字符個數(shù),最終向網(wǎng)絡發(fā)送時,總長度應加1字節(jié),以容納結(jié)尾的字節(jié)0。
* 此問題在發(fā)送安全策略內(nèi)容時同樣存在,故需重視。
?????? 2.中文問題
默認情況下,不管從哪一端發(fā)向另一端的數(shù)據(jù),若包含了中文字符,都會產(chǎn)生亂碼的現(xiàn)象,解決方法有二:
1).在AS中加入"System.useCodepage=true;" 強制使用本地代碼集,此法最方便,但是在跨語種平臺上仍會出現(xiàn)亂碼。
2).在代碼中自行編寫轉(zhuǎn)碼函數(shù),此法復雜些,但通用性強。具體轉(zhuǎn)碼算法網(wǎng)上很多,主要是C++服務端需要,Java中使用JDK類轉(zhuǎn)換為UTF-8即可。
轉(zhuǎn)載于:https://my.oschina.net/leoson/blog/106375
總結(jié)
以上是生活随笔為你收集整理的flash的Socket通讯沙箱和安全策略问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喀纳斯之行杂记
- 下一篇: ios 不同sdk4.3 6.0版本号,