您的位置:首页 > 理论基础 > 计算机网络

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

2012-12-24 13:45 721 查看
这个问题应该不是新问题,今天折腾我几个小时了,查了很多文章,总结如下:
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去设置沙箱安全。


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: