2011年12月29日 星期四

Flash Socket安全策略及應對方法

Flash Socket安全策略<policy-file-request/>及應對方法

在Adobe Flash Player 升級到9.0.124 後,由於安全策略更改,原來Socket 或XmlSocket 的應用裡的http 方式加載安全策略的手段不能繼續使用。更改如下:

1, 首先檢測目標服務器的843 端口是否提供安全策略2, 如果1 沒有檢測到策略,則檢測actionscript 是否使用了Security.loadPolicyFile(xmlsocket://)手段提供安全策略,如果還沒檢測到,則使用第3 步檢測3, 檢測目標服務器目標端口是否提供安全策略。


在說具體處理方式前,我先描述一下Flash Player 的驗證過程。在Flex 程序發出Socket 或XmlSocket( 以下統稱為Socket) 請求前, FlashPlayer 會先判斷是否為本地調用,如果不是。即用一個Socket 去鏈接到你的服務端,三次握手成功後一方面發出字符串“ <policy-file-request/>\0 “另一方面監聽返回的安全策略。安全策略接收成功後, FlashPlayer 就斷開驗證的Socket ,然後再運行程序本身的Socket 。在整個SWF 運行期間,無論你請求多少次,只要域相同, FlashPlayer 就只驗證一次。這裡有兩個重點:第一個是驗證的Socket 和程序的Socket 是兩個Socket 。所以你在本地測試時,服務端監聽到N 個Socket 請求,但佈置到服務端后,服務端會監聽到N+1 個請求。第二是驗證的Socket 發送“ <policy-file-request/>\0 “請求和接收你的策略文件是沒有先後關係的,所以你沒必要接收完“ <policy-file-request/>\0 “後才發策略文件。我的做法是只要監聽到請求,就把策略字符串發過去。

在Java中,我處理的方法是獨立啟動一個843端口的服務專門監聽授權請求,這樣客戶端響應速度很快,代碼片段如下:String xml = "<?xml version=\"1.0\"?><cross-domain-policy><site-control permitted-cross-domain-policies=\"all\"/><allow-access-from domain= \"*\" to-ports=\"*\"/></cross-domain-policy>\0";Socket socket=serverSocket.accept();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));PrintWriter pw = new PrintWriter(socket.getOutputStream());char[] by = new char[22];br.read(by, 0, 22);String s = new String(by);System.out.println("s="+s);if (s.equals("<policy-file-request/>")) {System.out.println("接收policy-file-request");pw.print(xml);pw.flush();br.close();pw.close();socket.close();}另外,一定要注意xml 字符串後面的”\0” ,因為Flash Player 是用他來做分隔符的,如果你不加上,客戶端驗證socket 可能就一直等待。另外授權接收的socket一定要斷開。

沒有留言:

張貼留言