为什么Flash Player会在这种情况下抛出沙箱错误?

时间:2009-11-10 16:55:09

标签: flex flash sockets sandbox

连接到Java(1.5)服务器上的Socket后,我收到了Flex 3沙箱错误#2048。服务器代码都是我的,即不在Apache下运行。 Flash Player 10.0 r32。

序列如下......

1 Java服务器启动,在端口843上侦听策略文件请求,在端口45455上侦听我的其他请求。

2 Apache服务的Flex客户端(虽然如果我从文件系统运行它会得到相同的结果),在主机上进行套接字连接:45455。

3 Flash Player从端口843请求策略文件。这是使用新安全设置查找主文件的标准行为。无论是否指定了不同的策略文件,都会发生这种情况。

4我通过端口843从Java提供以下XML:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
</cross-domain-policy>

5播放器将以下内容写入调试策略日志...

OK: Root-level SWF loaded: http://localhost/bst/BasicSocketTest.swf
OK: Searching for <allow-access-from> in policy files to authorize data loading from resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf
OK: Policy file accepted: xmlsocket://192.168.2.3:843
OK: Request for resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf is permitted due to policy file at xmlsocket://192.168.2.3:843

6我使用writeUTFBytes()flush()在端口45455上从客户端向服务器发送文本消息(这是我自己的自制消息协议,并在每端正确处理)< / p>

REG/REGISTER;simon;Si

7侦听端口45455的Java服务器线程以

响应
REG:0/REGISTER:SUCCESS;simon;Si

8 Flex客户端接收ProgressEvent,并且调用绑定到套接字的事件侦听器。我处理消息(将其写入屏幕上的文本框)

9 Flash播放器抛出2048沙盒错误,套接字断开连接!在收到并成功处理邮件后,这是。实际上它大概是在12秒之后。通过套接字没有其他工作。

我尝试在Flex客户端中通过调用Security.loadPolicyFile()显式加载策略文件,但新玩家安全性的实际情况是它基本上被忽略了。步骤是在发生套接字i / o操作之前不会发送策略请求。此时,播放器总是首先进入端口843寻找主策略文件。如果它找到一个,并且它是允许的,它就不会再进一步​​了。

我尝试了多种替代方法来终止策略文件和策略文件内容,包括故意错误,只是为了查看Flash Player是否处于唤醒状态。

我看不出有什么理由让我被抛出2048。我准确地在指定的主安全端口上提供套接字策略文件,播放器本身记录正确。然后套接字成功发送并接收来自服务器的消息,其中的内容可用于我的代码。

有没有人知道为什么会发生这种情况? Flash Player错误?

PS 不要告诉我使用BlazeDS或LCDS或Granite,或其他什么作为服务器,我正在寻找解决此问题的方法,不是重新设计。请不要让我使用XMLSocket - 我试过并得到完全相同的结果。我仔细而谨慎地选择了我的架构,我想要一个二进制套接字。

修改 在回应James Ward的评论请求时,这是完整的错误消息:

Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.

我有一个精简测试客户端,它为每个套接字事件都有一个处理程序,并向屏幕输出一条消息。这就是它所显示的:

RequestPolicy: 192.168.2.3:843
Create Socket: 192.168.2.3:45455
Connect: [Event type="connect" bubbles=false cancelable=false eventPhase=2]
Sending: REG/REGISTER;simon.palmer@gmail.com;Si
Receiving: REG:0/REGISTER:SUCCESS;simon.palmer@gmail.com;Si/
Close: [Event type="close" bubbles=false cancelable=false eventPhase=2]
Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.

成功从服务器接收响应后立即触发close事件,但是错误#2048直到大约20秒后才会出现。如果我在关闭后尝试发送另一条消息,但在错误发生之前,Flash Player会抛出无效的套接字异常。

我对此有logged a bug at Adobe

如果有兴趣的话,我可以提供客户端和服务器的完整源代码。

9 个答案:

答案 0 :(得分:3)

我一直在本地测试这个,一切似乎工作正常,直到套接字关闭。套接字不应该关闭吗?将消息发送到Flex客户端后,Java代码执行:

_in.close();
_out.close();
_socket.close();

然后Flex客户端在下次尝试与套接字通信时获取沙箱违规。如果我再次创建一个新的套接字连接,那么发送和接收工作正常,然后关闭。但过了一分钟左右,我又遇到了一个沙箱违规行为。我想知道Flash是否正在尝试ping套接字,因为它已关闭它会引发沙箱违规?

答案 1 :(得分:2)

您是否尝试过添加allow-http-request-headers-from元素?

<allow-http-request-headers-from domain="*" headers="*" />

或者为allow-access-from元素指定实际的端口而不是*?

<allow-access-from domain="*" to-ports="843,45455" />

答案 2 :(得分:1)

类似的问题here表示localhost未被解析为127.0.0.1。

您可以尝试切换到IP地址,看看是否有帮助。

答案 3 :(得分:1)

除了yoru crossdomain.xml之外,你可以在代码中使用Security类进一步尝试一些事情

尝试:

Security.allowDomain("*")
Security.allowInsecureDomain("*")

或者,如果您从aporoved允许的主机外部的外部服务器加载:

Security.allowDomain(loader.contentLoaderInfo.url)

然后慢慢将其重新打开直到您遇到错误。

确保您可以直接点击策略文件,并且该端口上没有运行阻止或其他应用程序。通常,当我运行套接字时,我会高于5000只是为了确保没有任何东西用完了端口。或尝试几个不同的端口。

同样,只需进行简单检查,确保将其命名为crossdomain.xml,并且全部为小写。我让程序员把头发拉出来,结果证明这是原因。

答案 4 :(得分:1)

尝试在xml结束标记“/&gt;”之前设置一个空格,就像在dan_nl建议中一样,例如:

  

&lt; allow-access-from domain =“*”/&gt;

不要嘲笑它,我刚刚解决了一个与你非常相似的问题(这看起来像是一个解析错误恕我直言)

答案 5 :(得分:1)

任何机会......这是在Windows Vista上发生的吗? IP地址是否指定为主机名?如果是,请参阅this

或者也许是在分析器处于活动状态时发生的?如果是,请参阅this

答案 6 :(得分:1)

发送策略文件时,服务器应始终在策略xml之后发送零字节。从上面的描述中不清楚是否发送了零字节,这最终可能会使Flash播放器混淆。

答案 7 :(得分:1)

这可能会或可能不会帮助您,但我们遇到了类似的问题。我们收到了安全错误,但是它不一致。我构建了前端并与正在处理用PHP编写的Socket的开发人员合作。问题似乎是确实存在竞争条件,Flash会在接收策略文件之前尝试连接到套接字。所以在前端我在安全错误处理程序中创建了一个重试,它在放弃之前会运行一定次数,也会将默认值设置为默认的20秒到6或8。它通常会在2号时捕获尝试这确实有所帮助,但有时需要8-10秒才能连接,而不是最佳解决方案。

在我的搜索中遇到了一些链接,这个说了一些关于在服务器上设置延迟的内容,第7个帖子下来: http://projectdarkstar.com/forum/?action=printpage;topic=1134.0

最后我们从这篇Adobe文章下载并使用了Python策略文件服务器,它一直运行完美,我无法解释原因,我不是服务器人,但它可能值得一试:< / p> 好吧,我只能发布1个超链接,因为我是新用户,很奇怪。搜索“设置套接字策略文件服务器”,它应该会出现,Adobe网站上的文章中有示例文件。

答案 8 :(得分:0)

我认为James Ward是对的 - 我现在正在使用套接字,前几天我遇到了这个问题。我发现一篇帖子暗示如果Flash客户端在调度COMPLETE事件时没有关闭Socket,这可能会导致您看到的错误。我添加了代码来关闭COMPLETE上的客户端Socket,到目前为止一切正常。