8

如何打开“跨域安全”,以便页面上的 JavaScript 可以与 SWF 自由通信,即使它托管在另一个域上?

我确定这个函数通信在默认情况下被阻止,但是通过使用一个名为“crossdomain.xml”的文件和 actionscript 3 函数:system.Security.allowDomain("*")。不过,我并没有完全成功,而且我没有洞察力知道哪个是开放的。

在这种情况下,我是否需要考虑其他隐藏的安全层?

我是否通过执行此设置以某种方式为潜在的黑客开放了我的代码?

(如果您想知道:是的,我必须在一个场景中进行这项工作,其中 html 托管在一个域上,JavaScript 是从另一个域外部添加的,而 SWF 是由来自第三个域的 JavaScript 嵌入的- 不要问为什么,解释起来太复杂了 - 我也希望我可以将整个东西托管在一个域中)。

4

2 回答 2

17

在 SWF 中使用Security.allowDomain("www.example.com")将允许来自 www.example.com 的页面中的 JS 调用在 SWF 中使用ExternalInterface.addCallback(). 域和子域必须完全匹配。使用"*"将允许任何域与 SWF 通信,但如果您有一个特定的域,最好使用它。

在 HTML 嵌入代码中设置allowScriptAccessalways将允许 SWF 调用 JavaScript 函数。

吸引许多开发人员的一件事是,在 SWF 加载完成之前,JavaScript 将无法调用 SWF 上的函数。不幸的是,没有基于 JS 的事件可以告诉您 SWF 何时准备就绪(至少我发现)。为了解决这个问题,我通常会在 SWF 完成加载后立即从 SWF 调用 JS 函数,以通知页面 SWF 已准备好。

这里和那里都有一些抽象,但是如果你看一下YUI Charts的源代码,你可能会弄清楚 Yahoo! 让跨域 JS/SWF 通信正常工作。

于 2009-01-16T23:53:39.607 回答
1

我要在上一个答案中添加一件事:如果您尝试上述代码但它不起作用,请检查您的网站地址是否包含“www”。如果我把它写成,我的没有,也没有工作

Security.allowDomain("www.jeremy-knight.com");

我需要把它写成:

Security.allowDomain("jeremy-knight.com");
于 2012-06-29T22:50:03.627 回答