从postMessage事件收到的eval()代码有多安全?

时间:2012-06-22 18:47:13

标签: javascript jquery security eval postmessage

我正在发送父文档中定义的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都在一个文件中:)

但这样安全吗?

唯一可以修改代码的人就是代码被评估的计算机上的那个人,对吗?

5 个答案:

答案 0 :(得分:4)

the general rule that eval should be avoided if possible外,您当前的代码不安全。

Cross-document messaging应该是跨源通信的安全技术。这里最重要的方面是尊重起源:发送者可以决定哪些文件来源可以发送哪个消息,接收者可以决定哪些来源可以接收消息。

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

因此,为了确保您的跨文档消息传递安全,请始终在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;
}

答案 1 :(得分:2)

关于" safe",您正在谈论一个窗口,它在技术上完全由用户控制(如果用户足够精明),与另一个这样的窗口或iframe进行通信。所以基本上它都在用户的控制之下。它和客户端上的任何其他东西一样安全,也就是说,客户端上没有任何东西是安全的;它是狂野的西部。如果用户不想保护用户,则无法保护用户。

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

答案 2 :(得分:1)

  

eval()的安全性如何?

根本不安全。

Why is using the JavaScript eval function a bad idea?

答案 3 :(得分:0)

不,操作要执行的代码和其他东西会很容易,加上eval不是让工作正常工作的好方法

答案 4 :(得分:0)

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