flex flash 安全沙箱问题



flex flash 安全沙箱问题

启动时连接失败

windows 下,代码己是这样:

_security = 'xmlsocket://' + _host + ':8003';
Security.loadPolicyFile(_security);
this.connect(_host, _port);

但还是会报出一个安全沙箱错误.

第二次 connect 就正常了.

后台跟进,发现估计是

this.connect(_host, _port);

时会向 connect 的 ip 和端口发一个 ‘’,没回应,就报错了.

然后才用指定的 Security.loadPolicyFile(_security) 去取.

在后台加上:

if (data.startswith('<policy-file-request/>')):
    policy = '''
            <cross-domain-policy>
              <site-control permitted-cross-domain-policies="all"/>
              <allow-access-from domain="192.168.1.4" to-ports="8004" />
            </cross-domain-policy>
            '''
    self.transport.write(policy)
    print policy
    self.transport.loseConnection()
    return

这样还快些.也可以把

_security = 'xmlsocket://' + _host + ':8003';
Security.loadPolicyFile(_security);

去了,直接 connect 就可以.

Socket方式安全沙箱解决(适用于flash 10)

请求端

client.mxml中mx:Application增加属性applicationComplete=“init();” 完成时候会调用init()方法,定义的init()方法中增加这一行:

import flash.system.Security;
Security.loadPolicyFile("xmlsocket://135.34.9.33:8007");

用于指定到哪台主机哪个端口获取crossdomain.xml信息 程序初始化完成时候会去获取一次

服务端

rel://files/sandBox_09T1R52AMX.py 这个文件提供socket安全许可,接收安全许可请求

官方说明

http://kb2.adobe.com/cps/142/tn_14213.html http://livedocs.adobe.com/flash/9.0_cn/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000350.html

网友牢骚

在actionscript里,如果要从其它域里载入swf或数据的话,或者socket要连接服务端的话,就会遇到这个超贱的安全沙箱.在以下情况里(抄自as3 cookbook): 1.swf将要连接的服务器,必须与此swf在同一域中; 2.从网络打开的网页中的swf不能连接到本地服务器(废到无耻的话); 3.本地不受信任的swf不能连接任何服务器或载入任何文件. 4.swf被跨域载入了,但是不能用as控制其中的代码: 5.跨域载入变量,不行. 其中第三个安全规则我很有意见,因为adobe把控制面板放在它自己的网站里,贱得嘀嘀叫.

解决的方法有两个. 这里所说的方法,都是在被载入的域中进行的,一定注意.当然了,你得有被载入文件或被连接服务器管理权限 第一个方法: 1.如果被载入域是以http的方式来提供服务的,那就可以在被载入swf的as里用flash.system.Security.allowDomian(“允许改变此代码的网域”); 2.如果被载入域是以https的方式来提供服务的,那可以在被载入swf的as里用flash.system.Security.allowInsecureDomai(“允许改变此代码的网域”); 上面所说,解决的是开头所列举的第4个安全限制. 第二个方法: 这个方法比第一个方法更方便的解决了跨域被载入swf里as访问限制,而且还解决了跨域载入网页中的变量的安全问题:写访问域方针文件. 另外这个方法也可以解决socket的跨域连接服务器的安全限制. 如下:

<?xml version=“1.0”?> <!DOCTYPE cross-domain-policy SYSTEM ‘http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd'>

把此文件保存为crossdomain.xml放在被载入域的根目录下面,载入变量和访问被载入swf中的as时候,做动作的swf就会自动读取了. to-ports是个可选参数,如果不写的话,默认的是开放web端口,也就是80. 但是在socket连接时,不但跨域方针文件要指定端口(因为一般都不会把80做为socket服务器端口),还得在as中明文载入跨域方针文件:flash.system.Security.loadPolicyFile(“跨域方针文件所在路径”); 注意了,上面所说的”跨域方针文件所在路径”,可以是在任何目录下面,而且它所能控制的就是所在目录和其子目录,权限不能达到上一层目录.