安全沙箱违规,无法通过套接字连接到服务器。

4
在我开始之前,我应该声明我已经阅读了所有内容,我在跟随这个这个这个(以及更多...)的指导,并且仍然无法通过Socket连接到我们正在运行的服务器。

以下是我在AS3中尝试的内容:

        var host :String = "192.168.2.11";
        Security.allowDomain(host);
        Security.allowInsecureDomain(host);
        Security.loadPolicyFile("xmlsocket://" + host + ":" +  "843");

        // TTS server socket
        _socket = new Socket();
        _socket.addEventListener(Event.CLOSE, handleClose);
        _socket.addEventListener(IOErrorEvent.IO_ERROR, handleError);
        _socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleSecError);
        _socket.addEventListener(ProgressEvent.SOCKET_DATA, handleIncomingData);
        _socket.addEventListener(Event.CONNECT, handleConnect);
        _socket.connect(host, 1337);

您可以看到,主机是一个本地地址,但只要我在这个本地网络中,这应该不会有问题。而且我确实在这个网络中,因为从我的IDE(FD4)中运行它可以正常工作。 此外,swf文件和应用程序尝试连接的服务器位于同一台服务器上,但位于另一个端口。

服务器发送的策略文件(我们尝试过从端口843和1337)如下:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-access-from domain="*" to-ports="*" /> 
</cross-domain-policy>

我们可以从服务器的日志输出中看到,这确实被发送到连接套接字。在xml数据之后,当然会发送一个空字节。之后,服务器会关闭连接。但是,似乎Flash不喜欢它,因为大约3秒钟后仍然出现“错误#2048”。我们真的没有更多的想法了...

1
端口843被保留用于主策略,而应使用您正在连接的端口1337,并在您连接到的套接字上提供文件。删除Security.allowInsecureDomain行,这是针对https连接的。服务器端使用什么语言? - The_asMan
这是我使用的策略(添加了一些额外的反斜杠以便格式化)<?xml version="1.0" encoding="UTF-8"?><cross-domain-policy xmlns:xsi="http:////www.w3.org//2001//XMLSchema-instance" xsi:noNamespaceSchemaLocation="http:////www.adobe.com//xml//schemas//PolicyFileSocket.xsd"><allow-access-from domain="\*" to-ports="\*" /></cross-domain-policy> - The_asMan
嘿,谢谢,我们最终实现了主策略文件。问题在于服务器返回的XML未包含“<site-control permitted-cross-domain-policies =”master-only“/>”标签。回答你的问题,我们在服务器端使用C/C++。 - TheSHEEEP
1个回答

2
我们通过添加另一个标签成功让它工作:
<site-control permitted-cross-domain-policies="master-only"/>

看起来这个标签是必要的,才能使它正常工作。无论我们尝试哪个端口,如果没有这个标签,我们都无法让它正常工作。

因此,在我们的情况下,完整的XML现在看起来像这样(当然可以轻松修改以适应任何情况):

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <site-control permitted-cross-domain-policies="master-only"/>
   <allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>

真遗憾这行代码没有被包含在Adobe的示例中(!!)。我的意思是,它被包含在示例文件中,但不在文章中。我不知道有多少人因此卡在了这个阶段...


以这种方式做会为你的SWF文件打开所有端口和所有域,相当不安全。 - The_asMan
这只是我们公司内部网络的测试,安全性在这种情况下并不重要 ;) 但是,在任何生产发布中,限制域和端口当然是必须的。 - TheSHEEEP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接