• 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去设置沙箱安全。
    

      

  • 相关阅读:
    自定义 mapper
    solr 服务搭建
    jedis 连接redis
    jedis 整合 Spring
    Redis 安装
    HttpClient 工具类
    springMvc 中返回字符串 乱码解决
    linux常用命令解析
    压缩jar包
    控制反转
  • 原文地址:https://www.cnblogs.com/sinsoul/p/2830882.html
Copyright © 2020-2023  润新知