用過flash socket的同學都知道,flash socket通訊有安全沙箱問題。就是在flash player發起socket通信時,會向服務端擷取安全政策,如果得不到服務端響應,flash将無法連接配接到服務端。
首先,什麼是flash安全沙箱?
flash安全沙箱是flash socket的一種安全政策,為避免任意flash終端與目标主機建立socket通訊,以授權端口,域名方式限定連接配接。
那麼,flash player怎麼擷取socket政策?
flash player發起socket通信請求的時候會先連接配接伺服器端的843端口,擷取socket政策。當伺服器沒有開啟843端口的時候,flash player會檢查發起請求的flash程式中有沒有使用security.loadpolicyfile來加載socket政策,如果還是沒有就會看這個發起請求的連接配接的目标端口有沒有socket政策。如果都沒有,那麼flash player将觸發連接配接失敗的socket事件,即securityerrorevent.security_error。
備注一下,security.loadpolicyfile的用法為:security.loadpolicyfile("xmlsocket://127.0.0.1:8080");
再來看看socket政策的格式
1、以下是最簡單的socket政策,就是不做任何限制的:
2、如果要限制某個域名或者ip,可以這樣寫:
3、限制端口可以這樣定義:
4、完整的socket政策要怎麼定義?
看一下這個示例:
其中,site-control告訴flash player,服務端支援哪種socket政策。設為master-only表示這個政策是服務端唯一的政策,flash player不要去支援服務端其他socket政策。還可以設為all和none。all表示所有端口的政策都是可信的,none是拒絕所有連接配接。
最後,再來看下flash player擷取socket政策時發什麼請求資訊給服務端?
flash player發起socket連接配接請求會向服務端發23位元組的字元資料:<policy-file-request/>
細心的同學會觀察到,<policy-file-request/>隻有22位元組,怎麼還多了1個位元組呢?
這裡有一點要注意,<policy-file-request/>後面還多帶了一個null 的位元組資料。
參考:
http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html