`

AS3 Socket安全问题

阅读更多

首先先发泄一下我的高兴,超高兴超高兴... .... .. . .. . .. .

今天才找到了这篇好文章,很感谢作者  

通过这篇文章,我完全解决了一个AS3 中使用Socket的安全问题.

按照这篇文章这样子做,不用看其他的文章,就解决了,而且很简单.

讲一下我的目标和遇到的问题以及解决的路径:

1、首先这是一个网站,通过点击一个按钮,然后发送命令到终端;(类似点对点的聊天)

2、然后我就做了一个类似私聊的功能,把这个功能的代码完全复制到我的项目里面的时候,就出现了这个错误【错误信息: Error #2044: 未处理的 SecurityErrorEvent: text=Error #2048: 安全沙箱冲突:http://web.a.com/online.swf 不能从 10.20.199.182:8000 加载数据】,于是就到网上找解决方案:

3、找到的解决方案都说有三种方式:843端口监听、在客户端代码中使用Security.loadPolicyFile("xmlsocket://22.20.192.149:1038");方法、还有一个我不记得了。然后我就试了第二种方法,就是在服务器端放crossdomain.xml文件(这个我在上一篇博客有写怎么放),试了好久,在昨天终于不报上面的SecurityErrorEvent这个错了,虽然不报错了,但是都连接不上,于是又去找资料;

4、实在没办法,有Debug一下,发现报了一个新的错【[SWF] /BrainpowerBlazeds/bin/BrainpowerBlazeds.swf - 1,309,421 bytes after decompression
警告: 等待 socket 策略文件时在 xmlsocket://10.20.192.149:843 上超时(3 秒钟)。这不会造成任何问题,但可访问 http://www.adobe.com/go/strict_policy_files_cn 以获得说明。】

5、根据这个错,才找到以下的这篇我转载过来的非常好的资料,才完全解决了。

总的来说:服务器端(java端)的主调程序我新建了两个ServerSocketAB。我用一个A监听843端口,如果发来<policy-file-request/>,我就调用一个线程Server843Thread(自定义的类)把策略文件(String)发送回去,接着把这个A关掉。这时候B还是打开的,所以当客户端发来<doopen-file-request/>(这个是客户端发来的我自定义的一个字符串),服务器判断发来的是<doopen-file-request/>而不是<policy-file-request/>,就调用另外一个线程ChatThread(专门处理发送过来的我自定义的信息的线程),就ok了。

注意:客户端连接服务端的时候不用管843端口,这是Adobe设置专门用来发送和接受安全策略文件的端口(据说Adobe准备申请该端口为专属端口),只要连接上面说的ServerSocket B中指定的端口即可(也就是除了843的另外一个,这里用的是9999端口),废话好多(希望能提供多一些说明让大家看懂),其实客户端连服务端的代码就是这样:socket.connect("localhost",9999);

说明一下:这是通过监听843端口发送安全策略文件(crossdomain.xml),用自定义端口9999进行自定义内容通信的例子。

本文转自:http://hi.baidu.com/fsnhf/blog/item/410c5a456e914f3787947356.html

解决AS3 Socket编程中最令人头疼的问题

--解决AS3 Socket安全问题

什么是最令人头疼的问题?也许大家会异口同声的说:安全问题,不错,不仅仅是AS3 Socket,整个AS3语言中最令人头疼的问题也无非就是安全问题了。

很 多同行的兄弟在郁闷的时候就会骂Adobe。但是,骂归骂,问题终归是要解决的,Adobe做这样的限制肯定是有他的用意的,大家都知道,swf文件是很 容易被反编的,那么也就是说你的swf文件内部与服务器通信的方式及路径是很容易被别人发现的,如果你的服务器中没有任何访问限制,那么你的服务器很容易 被一些人攻破,这并不需要很高的水平,只要一直刷,你的服务器就完了。

兄弟,您骂够了吗?我们来解决问题吧?

Java写完Socket服务器后,运行,一切正常,用Flex写全Socket客户端后,运行,一切正常,可是当把生成的swf文件拷到其它地方来运行就出错了,总是无法连接服务器,然后就开始抛securityError,下面我们看一下输出信息。

打 开Flash CS3,打开远程调试器,选择菜单如 Debug->Begin Remote Debug Session->ActionScript3.0(中文版选择菜单如:调试->开始远程调试会话->ActionScript3.0),下面我们打开客户端swf文件(记得此文件一定是调试版swf),则它会自动连接Flash CS3 的调试器,在Flash CS3中输出相关的调试信息。

可以看到输出信息如下:

------------------------------------

[SWF] C:\Users\Administrator\Desktop\MyClientFlash.swf - 1112717 bytes after decompression

警告: [strict] 将忽略 xmlsocket://localhost:9999 处的策略文件,因为出现语法错误。请访问 http://www.adobe.com/go/strict_policy_files_cn 以解决此问题。

*** 安全沙箱冲突 ***

localhost:9999 的连接已停止 - 不允许从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 进行连接

错误: 拒绝请求位于 xmlsocket://localhost:9999 的资源(请求者从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 发出请求),原因是缺乏策略文件权限。

------------------------------------

原因是没有在服务器的9999端口放置安全策略文件(我写的服务器用的是9999端口),那么好吧,我就在此处给客户端返回了一个安全策略文件信息,此文件格式如下:

<?xml version="1.0"?>

<cross-domain-policy>

    <site-control permitted-cross-domain-policies="all"/>

    <allow-access-from domain="localhost" to-ports="9999,300-400" />

</cross-domain-policy>

上述示例中是允许来自localhost域的swf文件访问9999端口和300400端口,你也可以用*来代替localhost以允许来自任何域的swf文件访问。

此时我将客户端文件请求的信息在Java中打印出来,看到的是一段包含<policy-file-request/>的字符串,当Java服务器接收到这个字符串时,立即返回安全策略文件字符串。

我想这样应该没什么问题了吧,可是当我再连接服务器时仍然无法连接,输出信息成了这样:

-------------------------------------

[SWF] C:\Users\Administrator\Desktop\MyClientFlash.swf - 1112717 bytes after decompression

警告: 等待 socket 策略文件时在 xmlsocket://localhost:9999 上超时(3 秒钟)。这不会造成任何问题,但可访问 http://www.adobe.com/go/strict_policy_files_cn 以获得说明。

*** 安全沙箱冲突 ***

localhost:9999 的连接已停止 - 不允许从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 进行连接

错误: 拒绝请求位于 xmlsocket://localhost:9999 的资源(请求者从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 发出请求),原因是缺乏策略文件权限。

-------------------------------------

这时我并不灰心,就按照它的说明去了http://www.adobe.com/go/strict_policy_files_cn这里查看说明了。

等我看到这个页面时,我真的郁闷了,上面全是乱说一通,根本不着边,全是一些没用的信息,亏Adobe想得出来提示我到这里看。

就 在我将要放弃解决这个问题的时候,我发现了另外一个现象,那就是当我刚开始连接服务器时,服务器端并没有打印出来客户端的请求信息 (<policy-file-request/>),而是在Flash CS3的调试器输出了超时错误之后,服务器端才打印出来这个请求信息。

这时我看到了一线希望,那就是服务器端确实出现了等待,这肯定是服务器端的程序问题。服务器端接收请求的处理代码片断如下:

BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));

if(br.readLine().indexOf("<policy-file-request/>")!=-1){

//开始返回授权文件信息

...

}

其中变量sServerSocket实例通过accept方法获得的Socket实例。

此时我开始怀疑是readLine方法的问题了,因为readLine方法是当程序读到\n或者\r时才会返回信息,所以肯定是此方法中出现了等待,因为起初客户端并没有传来换行符或者回车符。

于是我改变了读取字符串的方法,不再用readLine了,而取流中前22个字符,代码片断如下所示:

BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));

char[] ch=new char[22];

br.read(ch, 0, ch.length);

StringBuffer sb=new StringBuffer();

for(int i=0;i< ch.length;i++){

sb.append(ch[i]);

}

String st=sb.toString();

if(st.indexOf("<policy-file-request/>")!=-1){

//开始返回授权文件信息

...

}

当我再连接服务器时,果然不出我所料,成功连接服务器。

但是连接过程有点慢,貌似此过程也正好是3秒钟,莫非在连接此服务器之前已经进行了另外一次连接,而且是失败的。

查看Adobe官网的资料才明白,flashplayer会在连接指定的端口之前连接目标主机的843端口,如果3秒后得不到授权文件才再向指定的端口去请求授权文件,如果再经过3秒还得不到授权文件的话,则断开连接,抛出securityError

那 意思就是说在连接我的服务器的9999端口之前还连接了我的服务器的843端口,并且在843端口等待了3秒,没有得到授权文件,之后开始向我指定的端口请求此授权文件。那好吧,既然你要了,我就给你吧,不给你的话你还再磨矶磨矶,于是我又在843端口开了一个ServerSocket,此处专门处理授权 文件的请求。

这时我再连接服务器,呵呵,特快专列(T843),立即就连接上了。

说明:貌似有很多客户机上的843端被禁用了,所以为了保险,需要在指定端口和843端都要能够处理授权文件的请求。

以下是示例程序及源文件下载:

http://remotedu.net/blog/attachments/month_0905/t2009549429.rar

 

 

分享到:
评论
1 楼 linkerlin 2010-12-16  
悲剧.连接里的文件无法下载.
能不能给我email一份?

linker.m.lin@gmail.com

相关推荐

    socket安全策略,服务器与AS3客户端源码

    socket安全策略,服务器与AS3客户端源码 服务器是C# ,用于演示客户端向服务器请求安全文件,服务器发送安全文件的示例

    java和as3 socket通信 解决安全沙箱问题

    NULL 博文链接:https://renzaihangzhou.iteye.com/blog/2007855

    AS与java socket通讯解决安全沙箱

    AS与java socket通讯 解决安全沙箱 服务端用JAVA写的 用其他语言写的服务端 可以参考一下 都差不多的 这是网上COPY的那种方法所改进的,可以运行的。

    AS3.0安全沙箱 843策略文件

    这是个通用类,里面包含了处理843端口的安全沙箱问题以及socket基本的向服务器send资源问题。 请求方式是,先发整形,然后发id长度,再发id(String) 得到的资源是先得到字符长度,再得到字符串。这个是和后退约定的...

    as3_air_sock.rar_flex_flex socket

    Socket通信程序 AIR端用SocketServer创建端口监听 其他端用Socket连接AIR端的ip+端口 中间可能涉及沙箱安全问题,请自行baidu搜索 GroupSpecifier NetConnection NetGroup 这三个类建立p2p的连接进行通信

    计算机网络第六版答案

    (This is a little bit of a white lie, as modern routers sometimes act as firewalls or caching components, and process Transport layer as well.) Link layer switches process link and physical layers ...

    Http协议 IIS

    Socket socket s as Socket; 创建缓存区 byte[] oldArrText new byte[1024 1024 1]; 开始读取数据并存入缓存区 int txtLength socket Receive oldArrText ; 将数组转换成字符串 string strText Encoding ...

    typed-socket.io:一个用于与socket.io和TypeScript进行完全类型化的客户端-服务器通信的库

    外观如下: server.ts import * as io from "socket.io" ;const server = io ( 8000 ) as TypedServer ;const chatServer = server . of ( "/chat" ) ;chatServer . on ( "connection" , client =&gt; {

    webrtc-voice-demo:使用svelte和socket.io构建的WebRTC语音聊天演示

    WebRTC语音聊天演示 WebRTC语音聊天的实现十分苗条。 像Teamspeak一样,您可以与所有连接的对等方聊天,并定义语音传输的...chromium-browser --unsafely-treat-insecure-origin-as-secure= " http://&lt;hostname&gt;:1337 "

    Windows Sockets网络编程 可能是最清晰版本(Windows Sockets 2规范解释小组负责人亲自执笔。)总共4个包,part1

    12.2.3 16位Windows文件系统不安全 12.2.4 16位Windows使用分段寻址 12.2.5 fork不可用 12.3 移植Berkeley Sockets的其他事项 12.3.1 包含文件 12.3.2 socket域 12.3.3 socket类型 12.3.4 socket句柄 12.3.5 错误值 ...

    Windows Sockets网络编程 总计4个包,part2

    12.2.3 16位Windows文件系统不安全 12.2.4 16位Windows使用分段寻址 12.2.5 fork不可用 12.3 移植Berkeley Sockets的其他事项 12.3.1 包含文件 12.3.2 socket域 12.3.3 socket类型 12.3.4 socket句柄 12.3.5 错误值 ...

    windows网络编程技术

    重定向器452.1 通用命名规范452.2 多UNC提供者472.3 网络提供者472.4 重定向器简介482.5 服务器消息块482.6 安全问题492.6.1 安全描述符492.6.2 访问令牌512.7 网络安全512.8 一个实例522.9 小结53第3章 邮槽543.1 ...

    Windows网络编程(PDF).rar

    441.7 小结 44第2章 重定向器 452.1 通用命名规范 452.2 多UNC提供者 472.3 网络提供者 472.4 重定向器简介 482.5 服务器消息块 482.6 安全问题 492.6.1 安全描述符 492.6.2 访问令牌 512.7 网络安全 512.8 一个实例...

    windows网络编程(PDF)

    重定向器452.1 通用命名规范452.2 多UNC提供者472.3 网络提供者472.4 重定向器简介482.5 服务器消息块482.6 安全问题492.6.1 安全描述符492.6.2 访问令牌512.7 网络安全512.8 一个实例522.9 小结53第3章 邮槽543.1 ...

    Windows网络编程

    441.7 小结 44第2章 重定向器 452.1 通用命名规范 452.2 多UNC提供者 472.3 网络提供者 472.4 重定向器简介 482.5 服务器消息块 482.6 安全问题 492.6.1 安全描述符 492.6.2 访问令牌 512.7 网络安全 512.8 一个实例...

Global site tag (gtag.js) - Google Analytics