蒋金阳 发表于 2009-5-15 02:05:21

分享Flash处理安全策略的经验

很多人在处理安全策略时遇到问题,我自己也总结了一些经验,供大家参考吧.在 Flash Player 9.0.124.0 及以后的版本中,socket策略文件对于任何 Socket 连接都是必需的。也就是说,无论连接到哪一个端口(即使连接到提供 SWF 文件的同一主机上的端口),目标主机上都需要套接字策略文件。连接步骤:<br /><br />0.不论是低于还是高于1024端口,基于文件系统时都不会请求策略文件,基于网络时才会请求.<br />1.首先发出以null结尾的&lt;policy-file-request/&gt;的消息,检查服务器843端口是否有安全策略文件,策略文件格式为:<br />&lt;cross-domain-policy&gt;<br />&lt;allow-access-from domain=&quot;*&quot; to-ports=&quot;80-9000&quot; /&gt;<br />&lt;/cross-domain-policy&gt;<br />发回策略文件的时候必要以0结尾,如果843端口在3秒内没有请求到策略文件或者to-ports配置的端口不允许链接,则断掉链接抛securityError,这个是flash主动发起的.<br />2. 如果您的客户端socket或xmlsocket连接中设置了Security.loadPolicyFile(&quot;xmlsocket://服务地址:应用端口&quot;),则连接您的应用目标端口请求安全策略文件,请求和响应的方式如上,不设置是不会请求的.发请求是在调用connect之前.<br />3.如果您是http请求方式要设置Security.loadPolicyFile(&quot;http://服务地址/crossdomain.xml&quot;),crossdomain.xml文件内容如上,放在网站根目录就行了.例如mop的http://www.mop.com/crossdomain.xml<br /><br />解决方案1:使用adobe官方提供的文件直接在服务器的843端口上建立服务,这样响应速度最快,但对于应用的部署就麻烦了http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html<br /><br />解决方案2:客户端必须加Security.loadPolicyFile(&quot;xmlsocket://服务地址:应用端口&quot;),在服务端的应用端口上的私有协议上处理,一般的协议是长度+类型+数据,这样判断长度是0x3C70类型0x6C69,单独处理这个消息,但对自己的私有协议处理还是有影响。<br />为什么是这样的长度和类型看图:<br /><br /><br />解决方案3:单独在服务应用上处理843端口,和其他应用的服务剥离出来: <br />//安全策略服务    <br />public void startPolicyServer() throws IOException{    <br />      IoAcceptor acceptor = new NioSocketAcceptor();    <br />      acceptor.setHandler(new PolicyServerHandler());    <br />      acceptor.bind( new InetSocketAddress(843));    <br />      System.out.println(&quot;安全策略服务侦听端口:843&quot;);    <br />}    <br />//其他应用服务    <br />..................    <br />..................    <br />   <br />   <br /> //单独的安全策略处理器    <br />public class PolicyServerHandler extends IoHandlerAdapter {    <br />    // 22字节+0占1个字节    <br />    String security_quest = &quot;&lt;POLICY-FILE-REQUEST /&gt;&quot;;    <br />    // 最后以0结尾    <br />    String policyStr = &quot;&lt;CROSS-DOMAIN-POLICY&gt;rn&lt;ALLOW-ACCESS-FROM to-ports=&#39;&quot;80-9000&quot;&#39; domain=&#39;&quot;*&quot;&#39; /&gt;rn &lt;/CROSS-DOMAIN-POLICY&gt;rn&quot;;    <br />    private final Logger log = Logger.getLogger(PolicyServerHandler.class.getName());    <br />      <br />    public void messageReceived(IoSession session, Object message)    <br />            throws Exception {    <br />      IoBuffer processBuf = (IoBuffer) session.getAttribute(&quot;processBuf&quot;);    <br />      processBuf.put((IoBuffer)message);    <br />      processBuf.flip();    <br />                        <br />      if(getRequest(processBuf)){    <br />            byte[] reps = policyStr.getBytes(&quot;UTF-8&quot;);    <br />            IoBuffer rb = IoBuffer.allocate(reps.length);    <br />            rb.put(reps);//也有putString方法    <br />            rb.flip();    <br />            session.write(rb);//发回    <br />            log.info(&quot;send Policy&quot;);    <br />      }    <br />    }    <br />      <br />    //获得安全请求的字符串    <br />    private Boolean getRequest(IoBuffer buf){    <br />      String req = new String(buf.array());    <br />         if (req.indexOf(security_quest) != -1){    <br />             return true;    <br />         }    <br />         return false;    <br />    }    <br />    @Override    <br />    public void messageSent(IoSession session, Object message) throws Exception {    <br />      session.close(true);    <br />    }    <br />   <br />    @Override    <br />    public void sessionClosed(IoSession session) throws Exception {    <br />      super.sessionClosed(session);    <br />      session.removeAttribute(&quot;processBuf&quot;);    <br />    }    <br />   <br />    @Override    <br />    public void sessionCreated(IoSession session) throws Exception {    <br />      super.sessionCreated(session);    <br />      IoBuffer processBuf = IoBuffer.allocate(64);    <br />      session.setAttribute(&quot;processBuf&quot;, processBuf);    <br />    }    <br />   <br />}<br /><br />备注:<br /><br />1 mina2.x对比1.x效率更高,抛弃了原有的btyeBuffer,新写了Iobuffer,原因如下:<br />It doesn&#39;t provide useful getters and putters such as fill, get/putString, and get/putAsciiInt() enough. <br />It is difficult to write variable-length data due to its fixed capacity <br />2 demux下DemuxingProtocolCodecFactory和MessageDecoder等功能更完善了,decodable判断是否能解析数据,decode解析实际的数据,在处理私有协议上更简单了<br />3 Flash10 socket类新增加timeout属性指示建立连接时需等待的毫秒数<br /><br /><blockquote class="blockquote">From: http://www.photoep.cn/read.php?tid=115Powered by PHPWind.com</blockquote>
页: [1]
查看完整版本: 分享Flash处理安全策略的经验