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

时间:2017-05-24 01:14:37

标签: security cookies cross-domain

我在域content下有两个子域wwwexample.com。来自content.example.com的内容通过iframe显示在www.example.com中。

由于content.example.com上的内容需要与www.example.com进行通信,因此我设置了document.domain="example.com"并在iframe上设置了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?我在那里的域名和路径上有许多其他的cookie,而_ga cookies却没有发送。这样做还有其他安全风险吗?理想情况下,我希望它只能用于content.example.comwww.example.com之间的通信,看起来它主要是这样做的,除了谷歌分析cookie,这意味着其他人也可以这样做。

1 个答案:

答案 0 :(得分:0)

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

但是,JSONP要求服务器端使用返回的数据作为参数构建回调函数。

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

假设您在data.js中有一个Javascript文件content.example.com,或者返回与响应中的文件相同内容的服务, 使用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;
})();