FlexSocket安全沙箱沖突及解決方案
本文和大家重點討論一下FlexSocket安全沙箱沖突及解決方案,F(xiàn)lexSocket連接SocketServer時,javaSocket、c++Socket,抑或其它,首先會開一個Socket連接主機的843端口請求安全策略文件,這個時間為3秒;如果此步未能成功,則看開發(fā)者是否顯式調(diào)用了Security.loadPolicyFileAPI。
FlexSocket安全沙箱沖突及解決方案
這是FP被廣為唾罵的特性之一,其設計糟糕至極。Adobe貌似認為9秒時間對用戶來說很短。
1,糟糕的設計可能使用戶浪費9秒時間
FlexSocket連接SocketServer時,javaSocket、c++Socket,抑或其它,首先會開一個Socket連接主機的843端口請求安全策略文件,這個時間為3秒;如果此步未能成功,則看開發(fā)者是否顯式調(diào)用了Security.loadPolicyFileAPI,如下
- Security.loadPolicyFile("xmlsocket://127.0.0.1:1843");
如有,則再次嘗試從這個端口加載策略數(shù)據(jù),又是3秒。如果此步又未能OK,則嘗試從開發(fā)者定義的FlexSocket主機端口再次加載安全策略,此時會發(fā)送這樣一個請求:
- <policy-file-request/>
如果SocketServer沒有處理這個請求,客戶端將無法進一步完成FlexSocket連接。這個過程又是3秒。如果軟件設計不當,客戶端將浪費9秒的時間才能知道它有沒有獲得Server的連接許可,這張門票有點貴了。FP如能成功加載到安全策略數(shù)據(jù),會把所用socket拋棄(即使從主機端口請求亦是如此),然后執(zhí)行開發(fā)者的socket連接邏輯。
2,合理的方案,用java實現(xiàn)
在SocketServer端單開一個843端口,用于專門向客戶端提供安全策略文件,java示例代碼如下:
- packagesban.socketServer;
- importjava.io.BufferedInputStream;
- importjava.io.BufferedReader;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.IOException;
- importjava.io.InputStreamReader;
- importjava.io.PrintWriter;
- importjava.net.InetSocketAddress;
- importjava.net.ServerSocket;
- importjava.net.Socket;
- importjava.net.SocketAddress;
- importjava.net.URL;
- /**
- *sbanpolicyserverforflex/flashsocket
- *
- *@authorsban<http://sban.biz/>
- *
- */
- publicclassSbanSocketPolicyServer{
- publicSbanSocketPolicyServer(){
- }
- publicstaticStringreadFileAsString(Stringurl)
- throwsjava.io.IOException{
- byte[]buffer=newbyte[(int)newFile(url).length()];
- BufferedInputStreamf=newBufferedInputStream(
- newFileInputStream(url));
- f.read(buffer);
- f.close();
- returnnewString(buffer);
- }
- publicstaticvoidmain(String[]args)throwsIOException{
- ServerSocketserver=newServerSocket();
- SocketAddressendpoint=newInetSocketAddress("127.0.0.1",843);
- server.bind(endpoint);
- Stringpath=SbanSocketPolicyServer.class.getResource("../../crossdomain.xml").getPath();
- System.out.println(path);
- Stringpolicy=readFileAsString(path);
- while(true){
- System.out.println("waitforclient...");
- Socketsocket=server.accept();
- BufferedReaderin=newBufferedReader(newInputStreamReader(
- socket.getInputStream()));
- PrintWriterout=newPrintWriter(socket.getOutputStream());
- Strings=in.readLine();
- System.out.println(s);
- if(s.indexOf("policy-file-request")>-1){
- out.print(policy+'\0');
- out.flush();
- in.close();
- out.close();
- System.out.println("sendedpolicycontext.");
- socket.close();
- }
- }
- }
- }
而crossdomain.xml文件的示例代碼為:
- <cross-domain-policy>
- <site-controlpermitted-cross-domain-policiessite-controlpermitted-cross-domain-policies="all"/>
- <allow-access-fromdomainallow-access-fromdomain="*"to-ports="*"/>
- </cross-domain-policy>
將crossdomain.xml文件與執(zhí)行文件放置一起
3,你可以借用的jar執(zhí)行文件
sban把上述java導出為jar可執(zhí)行文件:
SbanSocketPolicyServer.zip5.8KB
在Windows下,確定已安裝java環(huán)境,并已設定環(huán)境變量,在命令行窗口中執(zhí)行如下命令:
java-jarSbanSocketPolicyServer.jar
說明:該java程序未經(jīng)優(yōu)化,僅作為教程示例,不建議在商業(yè)項目中使用。
【編輯推薦】
- 解析Flex安全沙箱五大解決方法
- Flex安全沙箱問題解決方法
- 技術(shù)前沿 看Flex客戶端緩存技術(shù)如何使用
- 解析Flex全屏模式設置方法
- Flex內(nèi)存泄露解決方法和內(nèi)存釋放優(yōu)化原則