我正在建立一个网站,任何人都可以通过postMessage命令与我的iFrame交互(即沙盒功能,而不是对窗口的完全控制)。如果不通过XSS暴露访问者的cookie,我怎么能这样做? https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Security_concerns
假设我有以下接收功能:
var secret = localStorage.getItem("secret");
window.addEventListener(message,function(e){
// any e.origin is allowed
if(e.func=="doX"){
var string = e.data.string1 * e.data.string2;
}else if(e.func=="doY"){
// another javascript function, no DOM interaction
config[e.data.key] = e.data.value;
}else if(e.func=="doZ"){
document.getElementById("app")=e.data.title
document.getElementById("description")=e.data.description
}
})
我在Mozilla页面上看到允许来自任何来源的请求非常危险。如何正确防止每个doX,doY和doZ风格的XSS?
我试了一下。这些功能安全吗?
var secret = localStorage.getItem("secret");
window.addEventListener(message,function(e){
// any e.origin is allowed
if(typeof e.func!=Number) return;
if( e.func < 0 || e.func > 2) return;
if(e.func==0){ // we will call this "Safe 0"
if(e.data.num1 > 1000 || e.data.num2 > 1000) return;
var num3 = e.data.num1 * e.data.num2;
}else if(e.func==1){ // safe 1
if(!isHex(e.data.value))return; // see below for isHex func
config['something'] = e.data.value;
}else if(e.func==2){ // safe 2
if(e.data.title.length < 8) document.getElementById("app")=e.data.title;
if(e.data.description.length < 15)document.getElementById("description")=e.data.description
}
})
function isHex(h) {
var a = parseInt(h,16);
return (a.toString(16) === h)
}
我了解到HTML输入元素也将无法从托管站点访问,这意味着这些“postMessage”是漏洞的主要来源。最后声明的来源:Get value of input field inside an iframe
只要我没有对使用postMessage函数发送到窗口的消息运行eval语句,是否有任何方法可以执行任意代码?
任何常见的客户端JS XSS攻击向量都是开放的。
因此,与eval
一样,您有各种eval-by-proxy功能(例如new Function()
),以不安全的方式将数据从消息插入DOM的效果等。
据我所知,在案例特定级别上更好地考虑XSS漏洞。它不仅仅是通过postMessages将变量安全地放入你的窗口,它就是你在那里使用变量做的事情。比如,您不希望接受变量参数并下载脚本,因为可以更改变量以下载恶意脚本。你不会运行eval语句。我仍然不确定“evalByProxy
”是否适用于纯粹的javascript环境(没有HTML /输入元素操作;没有与数据库的通信)。由于我要求其他回答者澄清这个问题并且我无法通过Google找到任何相关信息,我认为这不是真正的问题,只要我不将iFrame消息传达给服务器数据库,即DOM ,或运行eval语句。更多地了解基本的XSS聊天室示例,了解为什么将这些消息发送到服务器是一个坏主意。
在尝试保持iFrame安全的情况下,我发现更大的安全威胁是浏览器扩展(例如广告拦截器)的存在。这些访问权限可以访问网页的每个部分。这意味着他们可以访问您网页中的任何全局变量和任何全局函数。我不确定他们是否可以访问本地范围的变量(例如在对象内)。我不确定他们是否可以访问localStorage,但我猜他们可以。所以我最后在XSS消息的空间中轻轻地继续,并重新考虑涉及localStorage的任何方法。