天天看点

浅谈Flash Socket通信安全沙箱

用过flash socket的同学都知道,flash socket通讯有安全沙箱问题。就是在flash player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无法连接到服务端。

首先,什么是flash安全沙箱?

flash安全沙箱是flash socket的一种安全策略,为避免任意flash终端与目标主机建立socket通讯,以授权端口,域名方式限定连接。

那么,flash player怎么获取socket策略?

flash player发起socket通信请求的时候会先连接服务器端的843端口,获取socket策略。当服务器没有开启843端口的时候,flash player会检查发起请求的flash程序中有没有使用security.loadpolicyfile来加载socket策略,如果还是没有就会看这个发起请求的连接的目标端口有没有socket策略。如果都没有,那么flash player将触发连接失败的socket事件,即securityerrorevent.security_error。

备注一下,security.loadpolicyfile的用法为:security.loadpolicyfile("xmlsocket://127.0.0.1:8080");

再来看看socket策略的格式

1、以下是最简单的socket策略,就是不做任何限制的:

2、如果要限制某个域名或者ip,可以这样写:

3、限制端口可以这样定义:

4、完整的socket策略要怎么定义?

看一下这个示例:

其中,site-control告诉flash player,服务端支持哪种socket策略。设为master-only表示这个策略是服务端唯一的策略,flash player不要去支持服务端其他socket策略。还可以设为all和none。all表示所有端口的策略都是可信的,none是拒绝所有连接。

最后,再来看下flash player获取socket策略时发什么请求信息给服务端?

flash player发起socket连接请求会向服务端发23字节的字符数据:<policy-file-request/>

细心的同学会观察到,<policy-file-request/>只有22字节,怎么还多了1个字节呢?

这里有一点要注意,<policy-file-request/>后面还多带了一个null 的字节数据。

参考:

http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html