做页游的同学都知道,Flash有安全沙箱问题。就是在Flash发起Socket链接时,会向服务端获取安全策略,如果得不到服务端返回的策略或策略不允许的情况,Flash将无法正常工作并向你抛出一个安全沙箱异常。

什么是Flash安全沙箱?

Flash安全沙箱是Flash使用Socket的一种安全策略,为避免任意Flash与目标服务器建立Socket链接,以授权端口,域名方式限定连接。

Flash如何获取Socket策略?

Flash发起Socket链接请求的时,会先连接服务器端的843端口来请求Socket策略。

当服务器没有开启843端口的时候(3秒超时),Flash会检查发起请求的flash程序中有没有使用Security.loadPolicyFile来加载Socket策略,如果还是没有就会看这个发起请求的连接的目标端口有没有Socket策略。

如果都没有,那么Flash将触发连接失败的Socket事件,即SecurityErrorEvent.SECURITY_ERROR。

请求信息(暗号)

Flash发起Socket连接请求会向服务端发23字节的字符数据:

<policy-file-request/>\0

注意:最后的\0,为什么会有这个\0请自行研究那个年代的字符串编码

对服务器来说请求策略是额外的链接

服务器处理响应时,不管策略是由843还是目标端口发送的,发完记得主动断开,不然Flash依然会傻傻的等3秒

Socket策略文件的格式

1、简单的Socket策略,不做任何限制:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>

2、要限制某个域名或者IP:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*.noark.xyz" />
    <allow-access-from domain="192.168.0.92" />
</cross-domain-policy>

3、限制端口:

<?xml version="1.0"?>
<cross-domain-policy> 
   <allow-access-from domain="*" to-ports="12580" /> 
   <allow-access-from domain="*.noark.xyz" to-ports="10010,10086" /> 
   <allow-access-from domain="*.noark.xyz" to-ports="10010-10086" /> 
   <allow-access-from domain="www.noark.xyz" to-ports="10000,10010-10086" /> 
</cross-domain-policy>

服务器响应时也要记得那个\0

安全沙箱服务正常运行时,还有异常建议先查看一下防火墙的配置,太多兄弟被坑了

跨域请求时的安全策略文件

除了Socket的策略还要说一下跨域请求时的安全策略文件,crossdomain.xml

位于A域中的SWF文件要访问B域的文件时,SWF首先会检查B域服务器目录下是否有crossdomain.xml文件,如果没有,则访问不成功;
若crossdomain.xml文件存在,且里边设置了允许A域访问,那么通信正常。

一个通用的跨域文件:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy> 

很多时候,我们都直接使用了无限制的配置文件,能用就不管了,其实这是一个很不好的习惯,你的一个无意将会导致严重的安全隐患,会被有心之人利用

转载请注明原地址: http://blog.noark.xyz/article/2013/4/1/flash安全沙箱问题/