2010-07-26 61 views
5

我有一个https页面(https://example.com/main.php),它具有带非HTTPS源(http://example.com/inner.php)的iframe。这两个文件都在同一台服务器上 - 只有一个是使用https访问的,另一个则不是。我需要的非HTTPS页面可以使用下面的代码的HTTPS main.php网页上执行JavaScript作为parent.myfunction()允许HTTP iFrame在HTTPS父框架上调用JavaScript

然而,当我尝试,我得到了以下错误:

Unsafe JavaScript attempt to access frame with URL https://example.com/main.php from frame with url http://example.com/inner.php . Domains, protocols and ports must match.

我已经设置document.domain = 'example.com'这两个文件,我认为这会解决它,但是,它不。有什么办法可以让框架在父框架上执行javascripts,反之亦然?如果是这样,这会对安全产生什么影响? PS:对于那些建议在两个页面中只使用https或http的人,我正在研究这个问题。但是,由于iframe页面中存在进程,由于服务器负载问题,这可能不是一个可行的选项。

回答

5

“相同来源策略”涵盖协议(“http”或“https”),主机名和端口号。所有这些都必须匹配或者你输了。

如果您的服务器负载真的会因为必须对页面应用加密而受到影响,那么我怀疑您还有其他更严重的问题。在这个时代,这真的不应该成为一个问题。如果您的网站拥有大量流量,那么您可能应该使用前端来完成SSL。

0

您无法通过JavaScript进行跨域/跨协议/跨端口访问。这就是所谓的“跨域脚本”,这是一个问题,因为没有像这样的安全性,我可以在iframe中打开GMail,获得“u”和“p”文本框,并拥有用户的登录信息。

除了使用echo服务器之外,您在PS中放置的是唯一可以使用的真正解决方案......这可能会过度。

4

如果它是有史以来可能做你要求做的事情,没有SSL保护的网站永远不会安全。

让我来描述这个问题。比方说,一个用户,爱丽丝,去PayPal.com访问她的帐户。我,马洛里,介于贝宝和爱丽丝之间。当Alice访问Paypal时,我拦截她的请求并返回一个包含两件东西的页面:一个框架为https://paypal.com,另一个框架包含一个声称为'http://my.paypal.com'的页面,这是我自己制作的。 HTTPS框架验证正确,因为它实际上来自Paypal。 HTTP框架包含我的设备的一些Javascript,它将进入HTTPS框架,当Alice输入密码时,它会发送给我!

因此,不要从不安全的内容中访问安全内容,即使在同一个域中也是不行的。

+0

您的示例不起作用:因为_whole_域(包含所有现有和不存在的子域)属于paypal,所以无法使用域“my.paypal.com”。所以我认为这不是这个安全限制的原因。原因是一样的,就好像你想在https站点上通过http加载任何内容一样。 – rudi 2012-11-05 18:10:15

+1

@鲁道夫我不认为你完全明白我说的话。攻击者返回一个包含两个*帧*的页面。一个框架包含真正的https://paypal.com。另一个包含恶意的JavaScript。恶意JavaScript“是从paypal.com发送的” - 但实际上,我拦截了请求并返回了我想要的任何内容(可能是因为它不是安全的连接)。因此,两个框架“通过同源检查”,但结果是灾难。 – Borealid 2012-11-05 20:25:24