正确防止跨源iframe消息中的XSS

问题描述 投票:3回答:2

我正在建立一个网站,任何人都可以通过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

iframe cross-domain xss
2个回答
2
投票

只要我没有对使用postMessage函数发送到窗口的消息运行eval语句,是否有任何方法可以执行任意代码?

任何常见的客户端JS XSS攻击向量都是开放的。

因此,与eval一样,您有各种eval-by-proxy功能(例如new Function()),以不安全的方式将数据从消息插入DOM的效果等。


0
投票

据我所知,在案例特定级别上更好地考虑XSS漏洞。它不仅仅是通过postMessages将变量安全地放入你的窗口,它就是你在那里使用变量做的事情。比如,您不希望接受变量参数并下载脚本,因为可以更改变量以下载恶意脚本。你不会运行eval语句。我仍然不确定“evalByProxy”是否适用于纯粹的javascript环境(没有HTML /输入元素操作;没有与数据库的通信)。由于我要求其他回答者澄清这个问题并且我无法通过Google找到任何相关信息,我认为这不是真正的问题,只要我不将iFrame消息传达给服务器数据库,即DOM ,或运行eval语句。更多地了解基本的XSS聊天室示例,了解为什么将这些消息发送到服务器是一个坏主意。

在尝试保持iFrame安全的情况下,我发现更大的安全威胁是浏览器扩展(例如广告拦截器)的存在。这些访问权限可以访问网页的每个部分。这意味着他们可以访问您网页中的任何全局变量和任何全局函数。我不确定他们是否可以访问本地范围的变量(例如在对象内)。我不确定他们是否可以访问localStorage,但我猜他们可以。所以我最后在XSS消息的空间中轻轻地继续,并重新考虑涉及localStorage的任何方法。

© www.soinside.com 2019 - 2024. All rights reserved.