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

nic*_*way 6 xss iframe cross-domain

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


Run Code Online (Sandbox Code Playgroud)

我在 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)

}

Run Code Online (Sandbox Code Playgroud)

据我所知,HTML 输入元素也无法从托管站点访问,这意味着这些“postMessage”是漏洞的主要来源。最后一条语句的来源:Get value of input field inside an iframe

nic*_*way 1

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

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