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

  

posted @ 2012-12-24 13:45  sinsoul  阅读(2154)  评论(0编辑  收藏  举报