플래시 socket 통신 안전 샌 드 박스 문제 해결(추가 사례)

1.플래시 socket 통신 안전 샌 드 박스 문제 해결
        플래시 가 socket 통신 을 시작 하 는 세 가지 과정:
             1.페이지 에 포 장 된 플래시 가 socket 통신 요청 을 할 때 서버 엔 드 843 포트 를 찾 아 crossdomain.xml 파일 을 가 져 옵 니 다.
             2.서버 가 843 을 열지 않 았 을 때 플래시 플레이 어 는 요청 한 swf 파일 에 Security.loadPolicy File 을 사 용 했 는 지 확인 합 니 다(xmlsocket://127.0.0.1:4299)
                 정책 파일 crossdomain.xml 를 불 러 옵 니 다.
             3.없 으 면 이 요청 한 swf 가 연결 할 대상 포트 에 정책 파일 이 있 는 지 확인 합 니 다.
           위 세 단계 에서 정책 파일 을 찾 지 못 하면 연결 에 실패 하고 오류 알림 이 발생 합 니 다.
            [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]
둘째,  이 문제 가 발생 한 원인:
                새 플래시 플레이어 입 니 다.플래시 파일 이 socket 통신 을 하려 면 서버 에 crossdomain.xml 파일 을 가 져 와 야 합 니 다.찾 지 못 하면 이 문제 가 발생 합 니 다.
             (오래된 flash player 는 http 요청 방식 이나 xmlsocket socket 방식 을 사용 하 더 라 도 보안 정책 파일 을 공유 합 니 다.이 정책 파일 은 주 도 메 인 디 렉 터 리 에 두 기만 하면 됩 니 다.
                  새 버 전의 요구 사항 은 http 요청 방식 을 사용 하려 면 정책 파일 을 디 렉 터 리 아래 에 두 어야 합 니 다.사용 하 는 socket 요청 방식 은 socket 포트 를 통 해 이 정책 파일 을 받 아야 합 니 다.                     그 에 대응 하 는 호출 방식 은:                   http 요청:Security.loadPolicyFile(")http://www.xxx.com/crossdomain.xml");                   socket 또는 xmlsocket 요청:Security.loadPolicy File("xmlsocket://www.xxx.com:port");)
3.그러면 socket 정책 파일 을 플래시 플레이어 에 어떻게 보 냅 니까?
        세 가지 방법:
                기본 843 포트 사용
                    flash player 는 socket.connect(address,port)에 있 습 니 다.실행 하기 전에 세 가지 과정 에 따라 socket 서버 843 포트 에""문자열 을 보 냅 니 다.
                    이때 843 포트 를 감청 하 는 서버 가 있다 면 이 문자열 을 받 은 후 xml 형식 으로 정책 파일 을 발휘 하면 해 결 됩 니 다.
               2.사용자 정의 포트 사용(추천)
                      물론 포트 를 스스로 설정 할 수도 있 지만 이 럴 때 는 Http 방식 이 아니 라 xmlsocket 방식 을 사용 해 야 합 니 다.xmlsocket 대상 을 자동 으로 새로 만 드 는 것 과 같 습 니 다.
                      그리고 지정 한 호스트 와 포트 를 연결 합 니 다.  예 를 들 어 1234 포트 를 사용 하고 싶 으 면 플래시 에 이 Security.loadPolicy File(")을 추가 할 수 있 습 니 다.xmlsocket://www.xxx.com:1234")
                          주의해 야 할 것 은 이 한 마디 가 당신 의 socket.connect()앞 에 붙 어야 한 다 는 것 입 니 다.
              3.코드 전송 정책 파일.
                   socket 연결 포트 에서 이 요청 을 감청 합 니 다.예 를 들 어 sockt.connect("127.0.0.1",3333)를 사용 합 니 다.
                   그러면 서버 에'policy-file-request/'문자열 을 받 아들 이 는 코드 를 추가 하고 이 문자열 을 받 았 을 때 정책 파일 을 xml 형식 으로 클 라 이언 트 에 보 냅 니 다.
4.보안 정책 파일 을 어떻게 설정 합 니까?
            1.웹 응용 정책 파일
                     정책 파일 로 열 거 된 접근 허용:*game.com 과 192.168.1.1 swf 파일                                                                                                                                                                 주의사항:
                    기본적으로 정책 파일 은 crossdomain.xml 이 라 고 명명 되 어야 하 며 서버 의 루트 디 렉 터 리 에 있어 야 합 니 다.단,SWF 파일 은 호출 을 통 해
                   Security.loadPolicy File()방법 은 다른 이름 이나 다른 디 렉 터 리 에 있 는 지 확인 합 니 다.도 메 인 정책 파일 은 이 파일 을 불 러 오 는 디 렉 터 리 에 만 적 용 됩 니 다.
                   하위 디 렉 터 리따라서 루트 디 렉 터 리 의 정책 파일 은 전체 서버 에 적용 되 지만 임의의 하위 디 렉 터 리 에서 불 러 온 정책 파일 은 이 디 렉 터 리 와 하위 디 렉 터 리 에 만 적 용 됩 니 다.
            2.socket 에 대한 정책 파일
                                       
                                                                                                                                                 
                     이 정책 파일 은 어떤 도 메 인 호스트 가 어떤 포트 를 통 해 연결 할 수 있 는 지 지정 합 니 다.
                     
예제 코드
java   socket 서버:
       :
public class SecurityServer
{
	private int count = 0;
	public  String xml = "";
	private InputStream is;
	private OutputStream os;

	public void start() throws Exception
	{
		xml += "<cross-domain-policy>";
		xml += "<allow-access-from domain=\"*\" to-ports=\"*\" />";
		xml += "</cross-domain-policy>";

		ServerSocket serverSocket = new ServerSocket(4299);
		System.out.println("      ``       ``````");
		while (true)
		{
			try
			{
				Socket socket = serverSocket.accept();
				count++;
				this.is = socket.getInputStream();
				this.os = socket.getOutputStream();
				byte[] temp = new byte[300];
				this.is.read(temp);
				this.os.write(this.xml.getBytes("utf-8"));
				this.os.flush();
				this.os.close();
				this.is.close();
				socket.close();
			} catch (Exception e)
			{
				System.out.println("       ");
			}
		}
	}
	public static void main(String[] args)
	{
		try
		{
			new SecurityServer().start();
		} catch (Exception e)
		{
			System.out.println("Socket    :" + e);
		}
	}
}
      :
public class ServerJava
{
	private int count =0;
	
	public void start() throws Exception
	{
		ServerSocket serverSocket = new ServerSocket(4399);
		System.out.println("      ````````");
		while (true)
		{
			try
			{
				Socket socket = serverSocket.accept();
				
				count++;
				System.out.println("    ``  : `````"+count);
				
				ServerThread thread = new ServerThread(socket);
				thread.start();
			} catch (Exception e)
			{
				System.out.println("       ");
			}
		}
	}
	public static void main(String[] args)
	{
		try
		{
			new ServerJava().start();
		} catch (Exception e)
		{
			System.out.println("Socket    :" + e);
		}
	}
}
          :
public class ServerThread extends Thread
{
	private Socket socket;
	private BufferedReader input;
	private PrintWriter output;
	private OutputStream os;
	private InputStream is;
	
	public ServerThread(Socket socket)
	{
		this.socket = socket;
	}
	public void run()
	{
		System.out.println("---------------      -----------------");
		try
		{
			this.os = this.socket.getOutputStream();
			this.is = this.socket.getInputStream();
			byte[] temp = new byte[1000];
			int len = 0;
			StringBuffer msg = new StringBuffer();

			while ((len = this.is.read(temp)) > 0)
			{
				msg.append(new String(temp, 0, len,"UTF-8"));
				if(len<1000){
					this.os.write(msg.toString().getBytes("UTF-8"));
					this.os.flush();
					msg = new StringBuffer();
				}
			}
		} catch (Exception e)
		{
			System.out.println("       ");
			try
			{
				input.close();
				output.close();
			} catch (Exception ex)
			{
				System.out.println("        ");
			}
			System.out.println("      ");
		}
	}
}

as3 클 라 이언 트 단일 코드:
package {
	import flash.net.Socket;
	import flash.events.ProgressEvent;
	import flash.events.Event;
	import flash.utils.ByteArray;
	import flash.display.Sprite;
	import flash.system.Security;
	import flash.text.TextField;
	import flash.events.MouseEvent;
	public class ClientSocket extends Sprite {
		private var count:uint=0;
		private var clientSocket:Socket;
		private var readBytes:ByteArray = new ByteArray();
		private var writeBytes:ByteArray = new ByteArray();
		public function ClientSocket() {
			conn.addEventListener(MouseEvent.CLICK,connServer);
			send.addEventListener(MouseEvent.CLICK,sendToServer);
		}

		private function connServer(evt:MouseEvent):void {
			clientSocket = new Socket();
			Security.allowDomain("*");
			Security.loadPolicyFile("xmlsocket://127.0.0.1:4299")
			clientSocket.connect("127.0.0.1",4399);
			clientSocket.addEventListener(Event.CONNECT,successConn);
			clientSocket.addEventListener(ProgressEvent.SOCKET_DATA,reviceData);
		}

		private function successConn(evt:Event):void {
			count++;
			dyText.text="    "+count+"
"; } private function sendToServer(evt:Event):void { var charContext=inputText.text; dyText.text=dyText.text+charContext+"
"; //utf-8 clientSocket.writeUTFBytes(charContext); clientSocket.flush(); } private function reviceData(evt:Event):void { trace(totalLen+"======revice message==============="); var totalLen:uint=clientSocket.bytesAvailable; server.text=clientSocket.readUTFBytes(totalLen); } } }

swf 파일 을 웹 페이지 에 게시 하여 테스트 합 니 다.

좋은 웹페이지 즐겨찾기