FlexSocket安全沙箱冲突及解决方案

Hy 2010-07-29

本文和大家重点讨论一下FlexSocket安全沙箱冲突及解决方案,FlexSocket连接SocketServer时,javaSocket、c++Socket,抑或其它,首先会开一个Socket连接主机的843端口请求安全策略文件,这个时间为3秒;如果此步未能成功,则看开发者是否显式调用了Security.loadPolicyFileAPI。

FlexSocket安全沙箱冲突及解决方案

这是FP被广为唾骂的特性之一,其设计糟糕至极。Adobe貌似认为9秒时间对用户来说很短。

1,糟糕的设计可能使用户浪费9秒时间

FlexSocket连接SocketServer时,javaSocket、c++Socket,抑或其它,首先会开一个Socket连接主机的843端口请求安全策略文件,这个时间为3秒;如果此步未能成功,则看开发者是否显式调用了Security.loadPolicyFileAPI,如下

Security.loadPolicyFile("xmlsocket://127.0.0.1:1843"); 

如有,则再次尝试从这个端口加载策略数据,又是3秒。如果此步又未能OK,则尝试从开发者定义的FlexSocket主机端口再次加载安全策略,此时会发送这样一个请求:

<policy-file-request/> 

如果SocketServer没有处理这个请求,客户端将无法进一步完成FlexSocket连接。这个过程又是3秒。如果软件设计不当,客户端将浪费9秒的时间才能知道它有没有获得Server的连接许可,这张门票有点贵了。FP如能成功加载到安全策略数据,会把所用socket抛弃(即使从主机端口请求亦是如此),然后执行开发者的socket连接逻辑。

2,合理的方案,用java实现

在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文件与执行文件放置一起

3,你可以借用的jar执行文件

sban把上述java导出为jar可执行文件:

SbanSocketPolicyServer.zip5.8KB

在Windows下,确定已安装java环境,并已设定环境变量,在命令行窗口中执行如下命令:

相关推荐