在跨源iframe邮件中正确防止XSS

时间:2019-02-20 17:58:01

标签: iframe cross-domain xss

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

2 个答案:

答案 0 :(得分:2)

  

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

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

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

答案 1 :(得分:0)

据我所知,最好在特定案例的级别上考虑XSS漏洞。这不仅仅是通过postMessages将变量安全地放入窗口中,而是在变量出现后做什么。就像,您不想接受变量参数并下载脚本,因为可以将变量更改为下载恶意脚本。您不会运行eval语句。我仍然不确定“ evalByProxy”是否适用于纯JavaScript环境(没有HTML /输入元素操作;没有与数据库的通信)。由于我要求其他答复者对此进行澄清,并且我无法通过Google找到任何信息,因此我认为只要我不将iFrame消息传递给服务器数据库DOM,这就不是问题。 ,或运行eval语句。查看更多有关基本XSS聊天室示例的示例,以了解为什么将这些消息发送到服务器不是一个好主意。

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