[转]FlashSocket通信安全策略一点心得
flash調(diào)試沒問題放到html中就不可以了,沒想到在crossdomain上耗了這么久...看來還是自己道行淺,要多多學(xué)習(xí)啊
http://www.flashas.net/html/flashas/flashheWEBchengxuyingyong/20080824/3600.html
1、問題描述
????? 將flash發(fā)布為html格式后,加載頁面后,swf無法與服務(wù)器進(jìn)行socket通信。Flash端顯示的錯(cuò)誤為:
securityErrorHandler信息: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]
????? 在服務(wù)器端顯示的信息是由客戶端嘗試進(jìn)行連接,但是無法接受數(shù)據(jù)。接受的數(shù)據(jù)顯示為空。
2.問題原因:
??????? 最新的Flash player 9.0.124.0,當(dāng)flash文件要進(jìn)行socket通信的時(shí)候,需要向服務(wù)器端獲取crossdomain.xml文件。如果找不到就出現(xiàn)客戶端無法連接服務(wù)器的現(xiàn)象。
了解flash發(fā)起socket通信的三個(gè)過程
????? 當(dāng)封裝在頁面的flash發(fā)起socket通信請求的時(shí)候會(huì)先尋找服務(wù)器端的843端口,獲取Crossdomain.xml文件,當(dāng)服務(wù)器沒有開啟 843的時(shí)候,flashPlayer會(huì)檢查發(fā)起請求的swf文件中中有沒有使用Security.loadPolicyFile來加載策略文件 Crossdomain.xml,如果還是沒有就會(huì)看這個(gè)發(fā)起請求的swf要連接的目標(biāo)端口有沒有策略文件。如果都沒有那么連接失敗,返回如上的出錯(cuò)提 示。
為什么老版本的Flash player沒有這個(gè)問題?
??????從一些官方的一些資料中了解了一下。以前的Flash Player無論你采用urlRequest的http請求方式或者xmlsocket socket方式,他們都共用一個(gè)安全策略文件。這個(gè)策略文件只要你放在主域的目錄下就行了。而現(xiàn)在不行了,現(xiàn)在的策略文件如果你使用http請求方式那 么需要把策略文件放在目錄下面,如果你使用socket請求方式就必須通過socket端口來接收這個(gè)策略文件。
????? 對應(yīng)調(diào)用的方式為:
????? http請求——》Security.loadPolicyFile(“http://www.xxx.com/crossdomain.xml”)
????? socket或xmlsocket請求——》Security.loadPolicyFile(“xmlsocket://www.xxx.com:port”)
怎么將Socke策略文件發(fā)給Flash Player
????? Flash Player在你的socket.connect("domain",port)運(yùn)行之前,會(huì)按照前面描述的三個(gè)過程向你的socket服務(wù)器的843端 口(據(jù)說Adobe已經(jīng)向相關(guān)管理機(jī)構(gòu)申請保留843端口給Flash Player用)發(fā)送一個(gè)字符串 "<policy-file-request/>",這個(gè)時(shí)候如果你有一個(gè)服務(wù)在監(jiān)聽843端口那么收到這個(gè)字符串之后,直接按照XML格式 發(fā)回策略文件就解決了。(注意發(fā)回的時(shí)候記得加一個(gè)截止字符"\0")
??? 當(dāng)然你也可以不用843端口自己設(shè)置一個(gè)端口。因?yàn)镕lash Player如果在843端口得不到信息,就會(huì)檢查你是否在你的Flash文件里面自己添加了指定的獲取通道,你可以定義一個(gè)自己的端口。不過這個(gè)時(shí)候你 不能用http方式,而要用xmlsocket方式。(相當(dāng)于自動(dòng)幫你新建了一個(gè)xmlsocket對象,然后鏈接你指定的主機(jī)和端口)。比如你想用 1234端口可以在你的Flash里面加這一句 Security.loadPolicyFile(“xmlsocket://www.xxx.com:1234”),需要注意的是這一句要加在你的 socket.connect前面。
??? 還有最后一個(gè)辦法,就是在你的socket連接端口監(jiān)聽這個(gè)請求。比如你用的是 socket.connect("192.168.1.100",8888),那么在你的服務(wù)器加一段接收字符串"<policy-file- request/>"的代碼,當(dāng)接到這個(gè)字符串時(shí)將策略文家按照xml格式發(fā)到客戶端。
關(guān)于策略文件的格式(可以在Flash CS3幫助里面的Flash Player安全性——》控制權(quán)限概述中找到)
1、針對web應(yīng)用的策略文件
下面的示例顯示了一個(gè)策略文件,該文件允許訪問源自 *.iflashigame.com 和 192.0.34.166 的 SWF 文件。
<?xml version="1.0"?>
<cross-domain-policy>
??? <allow-access-from domain="*.iflashigame.com" />
??? <allow-access-from domain="192.0.34.166" />
</cross-domain-policy>
注意事項(xiàng):
????? 默認(rèn)情況下,策略文件必須命名為 crossdomain.xml,并且必須位于服務(wù)器的根目錄中。但是,SWF 文件可以通過調(diào)用 Security.loadPolicyFile() 方法檢查是否為其它名稱或位于其它目錄中。跨域策略文件僅適用于從其中加載該文件的目錄及其子目錄。因此,根目錄中的策略文件適用于整個(gè)服務(wù)器,但是從任 意子目錄加載的策略文件僅適用于該目錄及其子目錄。
????? 策略文件僅影響對其所在特定服務(wù)器的訪問。例如,位于?https://www.adobe.com:8080/crossdomain.xml?的策略文件只適用于在端口 8080 通過 HTTPS 對?www.adobe.com?進(jìn)行的數(shù)據(jù)加載調(diào)用。
2、針對Socket的策略文件
<cross-domain-policy>?
?? <allow-access-from domain="*" to-ports="507" />?
?? <allow-access-from domain="*.example.com" to-ports="507,516" />?
?? <allow-access-from domain="*.example2.com" to-ports="516-523" />?
?? <allow-access-from domain="www.example2.com" to-ports="507,516-523" />?
?? <allow-access-from domain="www.example3.com" to-ports="*" />?
</cross-domain-policy>
這個(gè)策略文件是指定允許哪些域的主機(jī)通過那些端口鏈接。
參考文章
flash xmlsocket policy 問題
Policy file changes in Flash Player 9
Setting up a socket policy file server
Understanding Flash Player 9 April 2008 Security Update compatibility
獲取策略文件的Java服務(wù)器端代碼
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SecurityXMLServer implements Runnable {
?? private ServerSocket server;
?? private BufferedReader reader;
?? private BufferedWriter writer;
?? private String xml;
???
?? public SecurityXMLServer()?
?? {
???? String path = "policyfile文件路徑";
???? //此處的換成相應(yīng)的讀取xml文檔的方式如dom或sax?
???? //xml = readFile(path, "UTF-8");
?????? /**
???????? 注意此處xml文件的內(nèi)容,為純字符串,沒有xml文檔的版本號
??????? */
???? xml="<cross-domain-policy> "
???? ?? +"<allow-access-from domain=\"*\" to-ports=\"1025-9999\"/>"
???? +"</cross-domain-policy> ";
???? System.out.println("policyfile文件路徑: " + path);
???? System.out.println(xml);
?????
???? //啟動(dòng)843端口
???? createServerSocket(843);
???? new Thread(this).start();
?? }
?? //啟動(dòng)服務(wù)器
?? private void createServerSocket(int port)
?? {
???? try {
?????? server = new ServerSocket(port);
?????? System.out.println("服務(wù)監(jiān)聽端口:" + port);
???? } catch (IOException e) {
?????? System.exit(1);
???? }
?? }
?? //啟動(dòng)服務(wù)器線程
?? public void run()
?? {
???? while (true) {
?????? Socket client = null;
?????? try {
???? ?? //接收客戶端的連接
???????? client = server.accept();
???????? InputStreamReader input = new InputStreamReader(client.getInputStream(), "UTF-8");
???????? reader = new BufferedReader(input);
???????? OutputStreamWriter output = new OutputStreamWriter(client.getOutputStream(), "UTF-8");
???????? writer = new BufferedWriter(output);
???????? //讀取客戶端發(fā)送的數(shù)據(jù)
???????? StringBuilder data = new StringBuilder();
???????? int c = 0;
???????? while ((c = reader.read()) != -1)
???????? {
?????????? if (c != '\0')
???????????? data.append((char) c);
?????????? else
???????????? break;
???????? }
???????? String info = data.toString();
???????? System.out.println("輸入的請求: " + info);
?????????
???????? //接收到客戶端的請求之后,將策略文件發(fā)送出去
???????? if(info.indexOf("<policy-file-request/>") >=0)
???????? {
?????????? writer.write(xml + "\0");
?????????? writer.flush();
?????????? System.out.println("將安全策略文件發(fā)送至: " + client.getInetAddress());
???????? }
???????? else
???????? {
?????????? writer.write("請求無法識別\0");
?????????? writer.flush();
?????????? System.out.println("請求無法識別: "+client.getInetAddress());
???????? }
???????? client.close();
?????? } catch (Exception e) {
???????? e.printStackTrace();
???????? try {
?????????? //發(fā)現(xiàn)異常關(guān)閉連接
?????????? if (client != null) {
???????????? client.close();
???????????? client = null;
?????????? }
???????? } catch (IOException ex) {
?????????? ex.printStackTrace();
???????? } finally {
?????????? //調(diào)用垃圾收集方法
?????????? System.gc();
???????? }
?????? }
???? }
?? }
???
?? //測試主函數(shù)
?? public static void main(String[] args)
?? {
???? new SecurityXMLServer();
?? }
}
轉(zhuǎn)載于:https://www.cnblogs.com/sun11086/archive/2009/07/16/1525038.html
總結(jié)
以上是生活随笔為你收集整理的[转]FlashSocket通信安全策略一点心得的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 Google Chrome 操作系
- 下一篇: 《Man Vs wild》 Notes-