zoukankan      html  css  js  c++  java
  • 关于C#建立FLASH服务端的安全沙箱问题

    注意:XMLSocket 接收到服务端下发的数据时,将连续放于接收缓冲区,直到接收到 "\0" 字节(字节内容为 ASCII 值 0),才认为接收完成,并调用相应的 onData 或 onXML 事件,因此,服务端使用标准的 String 类族,则在发送数据结尾应手动加上 "\0",同样,当XMLSocket发送数据时,也会在数据的结尾自动加上"\0"。

    1、允许FLASH访问网络


    2、如果只是运行或者发布成EXE,不调试,不会出现问题,调试之后出现安全沙箱问题

    Flash Player 6 以上版本引入了安全策略文件,在进行正式的通信前,会检查目标位置是否存在合法的安全策略,以防止不同域内的应用无限制任意互访。

    HTTP 方式下,Flash Player 会检查目标域根目录下是否存在 crossdomain.xml,如果有,则获取并分析其内容(内容后述)以确定是否允许继续访问。

    Socket 方式下,Flash Player 获取安全策略稍微复杂些,从 9.0.115.0 版起,标准步骤如下(以下描述以 IE 为标准,例外情况后述):
    1) 首先向目标主机 843 端口发起连接,并发送一个字符串,内容为 "<policy-file-request/>",并等待返回安全策略文件并分析。
    2) 若 1) 失败,则检查 AS 代码中是否使用了 Security.loadPolicyFile( "xmlsocket://主机:端口" ) 方法加载安全策略文件,若有,则获取并分析。
    3) 若 2) 失败,则向 AS 代码中即将连接的 "目标主机:端口" 发起请求,过程同 1)。
    4) 若成功获得安全策略文件并经分析认为允许建立连接,则继续执行 Connect() 方法,此时方真正尝试创建与目标主机的连接。

    解决方案:

    1) 在服务端写一个程序,监听 843 端口,当收到 "<policy-file-request/>" 时将恰当的策略内容(crossdomain.xml)发送回客户端。
    2) 在 AS 中通过 loadPolicyFile() 加载策略文件,此处需注意使用 xmlsocket:// 而不是 http://。
    3) 在标准服务端口中,检测到 "<policy-file-request/>" 时,返回策略内容。


    代码如下

    package{
      import flash.display.Sprite;
      import flash.events.*;
      import flash.net.XMLSocket;
      import flash.system.Security;
      public class ceshi extends Sprite {
    
        private var socket:XMLSocket;
    
        public function ceshi() {
    		
    		//Security.allowDomain("localhost:10000");
    		btn.addEventListener(MouseEvent.CLICK,onClick)
          socket = new XMLSocket();
         
          // Add an event listener to be notified when the connection is made
          socket.addEventListener( Event.CONNECT, onConnect );
         
          // Connect to the server
          socket.connect( "localhost", 10000 );
    	  
        }
       
       private function onClick(event:MouseEvent):void
       {
    	   trace("点击鼠标了")
    	   socket.send("12321321321321321");
       }
       
        private function onConnect( event:Event ):void {
    		Security.loadPolicyFile("xmlsocket://localhost:843");
          trace( "The xml socket is now connected..." );
        }
       
      }
    }


    C# 新建线程执行下面函数

            private void BeginSafe()
            {
                string host = "127.0.0.1";
                int port = 843;
                byte[] data;
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sc.Bind(ipe);
                sc.Listen(5);
                while (serverFlag)
                {
                    Thread.Sleep(100);
                    data = new byte[1024];
                    Socket clientSocket = sc.Accept();
    
                    int count = clientSocket.Receive(data, data.Length, 0);//接收的字节                
                    string recstr = Encoding.UTF8.GetString(data, 0, count);//byte[]转换成string 
                    if (recstr.IndexOf("<policy-file-request/>") >= 0)
                    {
                        byte[] datas = System.Text.Encoding.UTF8.GetBytes("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"10000\" /></cross-domain-policy>\0");
                        clientSocket.Send(datas);
                        clientSocket.Close();                    
                        continue;
                    }                 
                }
            }


  • 相关阅读:
    Centos7 安装python3 pip3
    VMW14.x虚拟机安装Mac10.13系统教程
    ADB命令大全
    appium服务器参数
    虚拟机VM14.X安装Mac10.12启动出现问题的解决方法
    Centos7安装vscode
    jmeter接口测试多数据组合登陆场景
    appium环境安装
    mysql命令大全
    jmeter录制请求
  • 原文地址:https://www.cnblogs.com/leestar54/p/3013207.html
Copyright © 2011-2022 走看看