正确防止跨域 iframe 消息中的 XSS
Properly-preventing XSS in cross-origin iframe messages
我正在构建一个网站,任何人都可以通过 postMessage 命令与我的 iFrame 进行交互(即沙盒功能,而不是 window 的完全控制)。我怎样才能在不通过 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
As long as I don't run an eval statement on messages sent using the postMessage function to my window, is there any way arbitrary code can be executed?
任何常见的客户端 JS XSS 攻击向量都是开放的。
所以和eval
一样,你有各种eval-by-proxy特性(比如new Function()
),将消息中的数据插入到DOM中的效果不安全的时尚等
据我所知,XSS 漏洞最好在特定案例级别考虑。这不仅仅是通过 postMessages 将变量安全地放入您的 window,它是 您对变量所做的操作 一旦它在那里。比如,您不想接受变量参数并下载脚本,因为可以更改变量以下载恶意脚本。您不会 运行 eval 语句。我仍然不确定“evalByProxy
”是否适用于纯粹的 javascript 环境(没有 HTML / 输入元素操作;没有与数据库的通信)。由于我要求其他回答者对此进行澄清,但我无法通过 Google 找到任何相关信息,我认为只要我不将 iFrame 消息传达给服务器,这就不是真正的问题数据库、DOM 或 运行 一个 eval 语句。更多地查看基本的 XSS 聊天室示例,以了解为什么将这些消息发送到服务器是一个坏主意的示例。
在尝试保持 iFrame 安全的情况下,我发现更大的安全威胁是存在浏览器扩展(例如广告拦截器)。这些获得访问网页每个部分的权限。这意味着他们可以访问您网页中的任何全局变量和任何全局函数。我不确定他们是否可以访问局部范围的变量(例如在对象内部)。我不确定他们是否可以访问 localStorage,但我猜他们可以。所以我最终在 XSS 消息的 space 中轻轻地继续,并且正在重新考虑涉及 localStorage 的任何方法。
我正在构建一个网站,任何人都可以通过 postMessage 命令与我的 iFrame 进行交互(即沙盒功能,而不是 window 的完全控制)。我怎样才能在不通过 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
As long as I don't run an eval statement on messages sent using the postMessage function to my window, is there any way arbitrary code can be executed?
任何常见的客户端 JS XSS 攻击向量都是开放的。
所以和eval
一样,你有各种eval-by-proxy特性(比如new Function()
),将消息中的数据插入到DOM中的效果不安全的时尚等
据我所知,XSS 漏洞最好在特定案例级别考虑。这不仅仅是通过 postMessages 将变量安全地放入您的 window,它是 您对变量所做的操作 一旦它在那里。比如,您不想接受变量参数并下载脚本,因为可以更改变量以下载恶意脚本。您不会 运行 eval 语句。我仍然不确定“evalByProxy
”是否适用于纯粹的 javascript 环境(没有 HTML / 输入元素操作;没有与数据库的通信)。由于我要求其他回答者对此进行澄清,但我无法通过 Google 找到任何相关信息,我认为只要我不将 iFrame 消息传达给服务器,这就不是真正的问题数据库、DOM 或 运行 一个 eval 语句。更多地查看基本的 XSS 聊天室示例,以了解为什么将这些消息发送到服务器是一个坏主意的示例。
在尝试保持 iFrame 安全的情况下,我发现更大的安全威胁是存在浏览器扩展(例如广告拦截器)。这些获得访问网页每个部分的权限。这意味着他们可以访问您网页中的任何全局变量和任何全局函数。我不确定他们是否可以访问局部范围的变量(例如在对象内部)。我不确定他们是否可以访问 localStorage,但我猜他们可以。所以我最终在 XSS 消息的 space 中轻轻地继续,并且正在重新考虑涉及 localStorage 的任何方法。