在 iframe 内容中设置 document.domain 的安全隐患

Posted

技术标签:

【中文标题】在 iframe 内容中设置 document.domain 的安全隐患【英文标题】:Security implications for setting document.domain in iframed content 【发布时间】:2017-10-24 03:34:42 【问题描述】:

我在域example.com 下有两个子域contentwww。来自content.example.com 的内容正在通过 iframe 在www.example.com 中呈现。

因为content.example.com上的内容需要和www.example.com通信,所以我在iframe上设置了document.domain="example.com",同时还设置了allow-scriptsallow-same-origin

我担心如果用户可以上传要在 iframe 中显示的内容,它可能会被利用,即将 cookie 的内容发送到远程域以劫持会话或其他安全漏洞。

我已经设置了另一个域www.example2.com,并在content.example.com 的 iframed 内容中放置了一个 AJAX 请求,以测试我的理论并将document.cookie 发送到远程域。这导致_ga cookie 被发送到远程域。我已经在远程域上允许了header('Access-Control-Allow-Origin: *'),所以它不会引起任何问题。

为什么只发送 _ga cookie?我在与 _ga cookie 相同的域和路径上还有许多其他 cookie,但它们没有被发送。这样做是否存在其他安全风险?理想情况下,我希望只能在 content.example.comwww.example.com 之间进行通信,而且看起来它主要是这样做的,除了 Google Analytics cookie,这意味着其他人也可以这样做。

【问题讨论】:

我有两个域,content.example.comwww.example.com content.example.comexample.com 的子域 是的,抱歉,我有两个子域。 要从子域访问域cookie,您不必太繁重。这是一件容易的事 *.domain.com 或设置路径'/' 我可以正常访问它,更重要的是,将安全数据从一个域发送到另一个外部 example.com 的安全隐患。 _ga 正在发送,但没有其他内容。攻击者可以得到其他东西吗?为什么_ga特别?我在 _ga cookie 的值中看不到任何允许将其发送到外部域的内容。 【参考方案1】:

无论跨域设置和策略如何,您都可以使用 JSONP 与不同域通信。

但是JSONP需要服务器端以返回的数据为参数构建回调函数。

我建议从服务器加载纯 javascript 内容,它具有与 JSON 请求相同的跨域独立性和安全性。

假设您在content.example.com 中有一个Javascript 文件data.js,或者一个服务返回与响应中的文件相同的内容, 带有一个 JSON 对象,前缀为变量赋值:

result = 
  "string1": "text1",
  "object1": 
    "string2": "text2",
    "number1": 5.6
  ,
  "number2": 7,
  "array1": ["text3", "text4"]

然后,在您的网页中,在www.example.com 中,您可以拥有一个具有函数loadJS 的脚本, 它将服务器响应加载为脚本:

var loadJS = function (url, callback) 
  var script = document.createElement('script');
  script.type = "text/javascript";
  script.src = url;
  script.onload = function (ev) 
    callback(window.result);
    delete window.result;
    this.parentNode.removeChild(this);
  ;
  document.body.appendChild(script);
;

window.onload = function () 
  loadJS('http://content.example.com/data.js', function (data) 
    console.log(data);
  );
;

同样的函数可以在content.example.com中用于相反方向的请求。

为了设置 cookie 或执行 JS 中可用的任何其他功能, 响应脚本 data.js 可能包含一个函数而不是 JSON 对象:

result = (function () 
  document.cookie = "cookie1=Value1; cookie2=Value2;";
  return true;
)();

【讨论】:

我对你的回答有点迷茫。攻击者将无法控制 iframe 父级中的内容,因此无法向其中添加 javascript (loadJS)。从我之前对 JSONP 的使用来看,就访问 cookie 而言,它仍然绑定到与标准 AJAX 请求相同的规则,但是它可以帮助您在可能无法完全控制服务器的情况下进行服务器通信并获得交叉站点脚本预防,因为标头响应不允许它。对吗? 不是 JSONP 也不是 JS 被绑定到与 AJAX 相同的规则。可以使用 AJAX 加载 JSON 对象,但是会遇到跨域问题,而且更重要的是,在安全性方面,接收到的内容在目标文档中是可见的,而作为脚本加载的 JSONP 和 JS 是沙盒的,即执行但不可读,不受跨域限制的原因。 无论如何,这只是一个建议,以最简单的方式实现安全的跨域通信。更详细的解决方案将需要强大的客户端-服务器加密技术。

以上是关于在 iframe 内容中设置 document.domain 的安全隐患的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iframe 中设置 Chrome 打印对话框的默认文件名?

在 iframe 中设置 cookie - 不同的域

无法在 Firefox 中设置 IFrame 的 document.body.innerHTML

如何在 iframe 的“srcdoc”属性中设置 HTML 代码?

在 jQuery 中设置“接受”标头以在 iframe 中检索数据

在iframe中设置bokeh属性