Flash网络编程安全沙箱问题隆重解决

这个问题应该不是新问题,今天折腾我几个小时了,查了很多文章,总结如下:
1.crossdomain.xml放在我http server的根目录
2.代码中加上Security.loadPolicyFile("http://myip/crossdomain.xml")
3.有人说crossdomain.xml服务端口必须大于1024,接着我把http server的port修改到8000
4.加了Security.allowDomain("*"); 其实我想根本不关它的事,也加上了.
以上的事情都做了,结果还是不行,一直在securityErrorHandler中报错,心都碎了,也许我的flashplayer太新了,没错,就是flashplayer10.

部分文章描述到 flashplayer 寻找crossdomain.xml的过程,说去843端口去询问,于是我决定自己验证下这个事情.
中间发现vista无法使用ethereal,结果用wildpacket这个工具进行网络抓包.
flashplayer的确首先访问843端口,请求是<policy-file-request/>,最后面加个"/0",其实也就是0x00.
接着,发现843无法连接,就往应用端口送了,我的tcpserver是9850,所以flashplayer连接到我的tcpserver第一个内容报就发<policy-file-request/>
在这个过程中,并没有发现flashplayer有http的请求去访问/crossdomain.xml这样的资源,难道adobe文档骗人???

现在很明显了,解决办法必须自己实现一个tcp socket去应付flashplayer的安全检查,要么在port 843做,要么在应用端口做,当然我不希望在判断我私有协议的时候去检查<policy-file-request/>这么一串东西。所以我还是用843做了。

因为我用mina框架,贴部分代码
主应用加

  1. IoAcceptor acceptor = new SocketAcceptor();
  2.         
  3.         try {
  4.                         acceptor.bind( new InetSocketAddress(PORT), new FirHandler());
  5.                 } catch (IOException e) {
  6.                         e.printStackTrace();
  7.                         System.exit(-1);
  8.                 }
  9. /*以下是为处理843加的*/
  10.                 try {
  11.                         acceptor.bind( new InetSocketAddress(843), new Flash843());
  12.                 } catch (IOException e) {
  13.                         e.printStackTrace();
  14.                         System.exit(-1);
  15.                 }
复制代码
Flash843实现如下:
  1. package fir;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import org.apache.mina.common.ByteBuffer;
  5. import org.apache.mina.common.IdleStatus;
  6. import org.apache.mina.common.IoAcceptor;
  7. import org.apache.mina.common.IoHandlerAdapter;
  8. import org.apache.mina.common.IoSession;
  9. import org.apache.mina.common.TransportType;
  10. import org.apache.mina.transport.socket.nio.SocketAcceptor;
  11. import org.apache.mina.transport.socket.nio.SocketSessionConfig;
  12. public class Flash843 extends IoHandlerAdapter {
  13.         
  14.         public void sessionCreated(IoSession session) throws Exception {
  15.                 System.out.println("From to " + session.getRemoteAddress().toString() + "Session created...");
  16.                 if( session.getTransportType() == TransportType.SOCKET )
  17.                         ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );
  18.         session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );
  19.         }
  20.         
  21.         public void exceptionCaught(IoSession session, Throwable t) throws Exception {
  22.                 t.printStackTrace();
  23.                 session.close();
  24.         }
  25.         public void messageReceived(IoSession session, Object msg) throws Exception {
  26.                 ByteBuffer get = (ByteBuffer)msg;
  27.                 //System.out.println("Rec:" + get.getHexDump());
  28.                 String s = new String(get.buf().array());
  29.                 if (s.indexOf("<policy-file-request/>") != -1)
  30.                 {
  31.                         String res = "<?xml version=/"1.0/"?><cross-domain-policy><allow-access-from domain=/"*/" to-ports=/"*/"/></cross-domain-policy>/0";
  32.                         ByteBuffer resbb = ByteBuffer.wrap(res.getBytes());
  33.                         System.out.println("send 843");
  34.                         session.write(resbb);
  35.                         return;
  36.                 }
  37.                 
  38.         }
  39.         
  40.         public void sessionOpened(IoSession session) throws Exception {
  41.                 System.out.println("Session open..");
  42.         }
  43.         public void sessionClosed(IoSession session) throws Exception {
  44.                 System.out.println("Session close..");
  45.         }
  46.         
  47. }
注意,在回复的res中最后一定要加个"/0",其实也就是一个byte 0x00,我原来看抓包后门已经有几个填充0x00,但是不行,因为tcp包内容长度没有把填充部分加上,我想flashplayer在处理此包的时候必须碰到规定长度里的0x00才停止,然后再解析xml去设置 沙箱安全。

你可能感兴趣的:(Flash网络编程安全沙箱问题隆重解决)