这个问题应该不是新问题,今天折腾我几个小时了,查了很多文章,总结如下:
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框架,贴部分代码
主应用加
- IoAcceptor acceptor = new SocketAcceptor();
-
- try {
- acceptor.bind( new InetSocketAddress(PORT), new FirHandler());
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(-1);
- }
- /*以下是为处理843加的*/
- try {
- acceptor.bind( new InetSocketAddress(843), new Flash843());
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(-1);
- }
复制代码
Flash843实现如下:
- package fir;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import org.apache.mina.common.ByteBuffer;
- import org.apache.mina.common.IdleStatus;
- import org.apache.mina.common.IoAcceptor;
- import org.apache.mina.common.IoHandlerAdapter;
- import org.apache.mina.common.IoSession;
- import org.apache.mina.common.TransportType;
- import org.apache.mina.transport.socket.nio.SocketAcceptor;
- import org.apache.mina.transport.socket.nio.SocketSessionConfig;
- public class Flash843 extends IoHandlerAdapter {
-
- public void sessionCreated(IoSession session) throws Exception {
- System.out.println("From to " + session.getRemoteAddress().toString() + "Session created...");
- if( session.getTransportType() == TransportType.SOCKET )
- ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );
- session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );
- }
-
- public void exceptionCaught(IoSession session, Throwable t) throws Exception {
- t.printStackTrace();
- session.close();
- }
- public void messageReceived(IoSession session, Object msg) throws Exception {
- ByteBuffer get = (ByteBuffer)msg;
- //System.out.println("Rec:" + get.getHexDump());
- String s = new String(get.buf().array());
- if (s.indexOf("<policy-file-request/>") != -1)
- {
- String res = "<?xml version=/"1.0/"?><cross-domain-policy><allow-access-from domain=/"*/" to-ports=/"*/"/></cross-domain-policy>/0";
- ByteBuffer resbb = ByteBuffer.wrap(res.getBytes());
- System.out.println("send 843");
- session.write(resbb);
- return;
- }
-
- }
-
- public void sessionOpened(IoSession session) throws Exception {
- System.out.println("Session open..");
- }
- public void sessionClosed(IoSession session) throws Exception {
- System.out.println("Session close..");
- }
-
- }
注意,在回复的res中最后一定要加个"/0",其实也就是一个byte 0x00,我原来看抓包后门已经有几个填充0x00,但是不行,因为tcp包内容长度没有把填充部分加上,我想flashplayer在处理此包的时候必须碰到规定长度里的0x00才停止,然后再解析xml去设置
沙箱安全。