本文作者:IMWeb 王少飞 原文出处:IMWeb社区 未经同意,禁止转载
最近的项目涉及到flash通过socket和服务器连接,刚接触这方面的内容,遇到了flash通信时安全策略的问题,这里记录下,有遇到相同问题的同学可以参考下。
HTML中的flash和服务器链接最初报错:[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]
。抓包:
flash有发请求但服务器端业务接口中并没有收到请求,抓包可以看到,flash先请求了843接口,但没有成功,重试了一次后,请求了80端口,三次握手之后,发送了一段数据: <policy-file-request/>
, 同时在as文件中触发了SecurityErrorEvent.SECURITY_ERROR
事件,通过排查发现是flash要请求安全策略文件。
当封装在页面的flash发起socket通信请求的时候会先寻找服务器端的843端口,获取Crossdomain.xml文件,当服务器没有开启843的时候,flashPlayer会检查发起请求的swf文件中中有没有使用Security.loadPolicyFile来加载策略文件Crossdomain.xml,如果还是没有就会看这个发起请求的swf要连接的目标端口有没有策略文件。如果都没有那么连接失败,返回如上的出错提示
由于测试服务器无法监听843端口,我们想通过监听8080端口来发送策略文件,操作方法是在socket.connect(ip, port)之前调用SWF Security.loadPolicyFile("xmlsocket://server.com:8080");
,再试还是相同的错误:
8080端口返回了策略文件但是flash仍然请求了80端口获取获取策略文件,本来是按照文档操作的,带着疑问看了as的文档
as文档描述如下:
默认情况下禁止访问套接字和 XML 套接字连接,即使所要连接的套接字与 SWF 文件位于同一个域中也是如此。可以从下列 任意位置提供套接字策略文件,从而允许套接字级别访问: • 端口 843 (主策略文件的位置) • 与主套接字连接相同的端口 • 主套接字连接端口之外的端口 默认情况下, Flash Player 在端口 843 和主套接字连接所在的端口上查找套接字策略文件。如果要从其它端口提供套接字策略文件, SWF 文件必须调用 Security.loadPolicyFile()。 套接字策略文件具有与 URL 策略文件相同的语法,只是前者还必须指定要对哪些端口授予访问权限。如果套接字策略文件来自低于 1024 的端口号,则它可以对任何端口授予访问权限;如果策略文件来自 1024 或更高的端口,则它只能对 1024 端口和更高的端口授予访问权限。允许的端口在 标记中的 to-ports 属性中指定。单个端口号、端口范围和通配符都是允许值。
也就是我们用了8080端口提供的策略文件并不能控制80端口的访问权限。
所以必须开启843端口,或者还是从8080端口获取侧略文件, 但要将主业务的端口改成大于1024。
参考: