我正在发送父文档中定义的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都在一个文件中:)
但这样安全吗?
唯一可以修改代码的人就是代码被评估的计算机上的那个人,对吗?
答案 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)
答案 3 :(得分:0)
不,操作要执行的代码和其他东西会很容易,加上eval不是让工作正常工作的好方法
答案 4 :(得分:0)
使用eval()
函数意味着如果有任何攻击者将javascript注入您的网站,他可以在eval函数中执行任何类型的恶意代码。