1

我正在发送父文档中定义的 javascript 函数的代码:

var fn = function(){ 
           // code here that is going to be eval'd
         };

$('#iframe').get(0).contentWindow.postMessage(encodeURI(fn.toString()));

要在 iframe 中评估:

$(window).bind('message', function(e){
  eval('(' + decodeURI(e.originalEvent.data) + ')();');
}); 

我这样做的原因是因为我可以更轻松地管理代码,因为这样所有的 js 都在一个文件中:)

但它安全吗?

唯一可以修改代码的人是在哪台计算机上评估代码的同一个人,对吧?

4

5 回答 5

4

除了应尽可能避免的一般规则eval外,您当前的代码并不安全。

跨文档消息传递应该是跨域通信的安全技术。这里最重要的方面是尊重来源:发送者可以决定消息可以发送到哪个来源的文档,而接收者可以决定它可以接受来自哪个来源的消息。

但在您的情况下,您的发件人既没有指定收件人来源,也没有收件人检查发件人来源。这是一个安全漏洞,因为您的发件人可以将消息发送给错误的收件人(您的框架的文档更改),或者您的收件人接受来自错误发件人的带有潜在恶意代码的消息(您的文档嵌入在恶意页面中)。

因此,为了使您的跨文档消息传递安全,请始终在postMessage调用中指定发件人的来源:

otherWindow.postMessage(message, "http://example.org:8080");

并在收到消息时始终检查来源:

function receiveMessage(event) {  
    if (event.origin !== "http://example.org:8080") return;
    // ...
}
window.addEventListener("message", receiveMessage, false);

如果您在同一来源内进行通信,则可以使用window.location.origin

// sender
otherWindow.postMessage(message, window.location.origin);

// recipient
if (event.origin !== window.location.origin) return;

window.location.origin似乎仅在 WebKit 中可用,这里有一个解决方法:

if (!window.location.hasOwnProperty("origin")) {
    window.location.origin = window.location.protocol + "//" + window.location.host;
}
于 2012-06-22T19:16:38.523 回答
2

关于“安全”,你说的是一个窗口,它在技术上完全由用户控制(如果用户足够精明的话),与另一个这样的窗口或 iframe 通信。所以基本上这一切都在用户的控制之下。它和客户端上的其他任何东西一样安全,也就是说,客户端上没有任何东西是安全的;那里是狂野的西部。如果用户不想受到保护,您就无法保护用户免受他/她自己的伤害。

话虽如此,通常有更好的方法来完成这项工作eval()。几乎总是。

于 2012-06-22T18:57:20.967 回答
1

eval() 有多安全?

一点都不安全。

为什么使用 JavaScript eval 函数是个坏主意?

于 2012-06-22T18:51:40.103 回答
0

不,操纵要执行的代码和其他东西很容易,而且 eval 不是让事情正常工作的好方法

于 2012-06-22T18:51:06.377 回答
0

使用该eval()函数意味着如果任何攻击者将 javascript 注入您的站点,他可以在 eval 函数中执行任何类型的流氓代码。

于 2012-06-22T18:54:32.393 回答