HTML元素还发送跨域请求的cookie?

时间:2014-05-23 07:40:06

标签: javascript html cookies cross-domain

一个主要社交网站(使用旧浏览器)的早期黑客攻击之一是:

  • 登录该网站,因此您获得了一个Cookie
  • 创建引用“获取朋友列表”网址
  • 的脚本标记
  • 通过JS覆盖数组构造函数 并且由于<script>标记 发送了一个cookie,所以请求被认证并且使用纯JSON(不可运行)代码进行响应 - 但是由于我们覆盖了数组ctor,我们可以获取数据。 / LI>

那很好(这是我的问题的预览)。

问题

  • 元素的完整列表是什么,它还为交叉域名请求发送了Cookie?

1 个答案:

答案 0 :(得分:1)

如果说浏览器向某个域请求的任何资源都会在请求中发送cookie,那会不会更准确。实际上,任何从服务器“加载”任何资源的元素都会发送cookie。所以我会说图像,json文件,html / php文件,外部CSS文件以及可能的web字体会发送cookie。 This could be one of the reasons why you would want to host your resources (scripts,CSS files, images) on another domain as an optimisation thing.

JSFiddle主要证明CSS文件可以“记住”

HTML

<link href="remember.php?.css" rel="stylesheet"/>
<a href="#" id="red">Remember Red</a>

Javascript

red.onclick=function(e){
   var img=new Image()
   img.src="remember.php?col=red"
   return false   
}

remember.php

if(isset($_GET["col"])){
    $_SESSION["fav_color"]=$_GET["col"];
}

echo "body {
 color:".htmlentities(@$_SESSION["fav_color"] ?: "blue")."  
}";

所以应该发生的是,当我们加载带有URI remember.php?col=red的图像时,服务器即使在刷新时也会记住颜色值。与图像相同的主体,我会假设网络字体。


另一个例子是图像。哪个应该在加载时发送cookie。但是,例如,stackoverflow.com托管另一个域中的图像(在这种情况下,布局内容在cdn.sstatic.net/stackoverflow/img/sprites.png上)。即使它确实发送了,我们通常也不知道是否发送了cookie,除非cookie以某种方式影响图像。但是,如果我们检查开发人员工具,我们会注意到cookie会被发送。例如:

在php.net上托管的图片

Image hosted on php.net

在不同的域上的相同图像 enter image description here

如您所见,Cookie会被发送。即使是跨域。作为进一步的证明,remember.php演示,但有图像。

Demo

HTML

<img src="http://mfirdaus.net/random/so/remember_image.php"/>
<a href="#" id="toggle">Toggle Image</a>

的Javascript

toggle.onclick=function(){
    var img=new Image()
    img.src="http://mfirdaus.net/random/so/remember_image.php?toggle"
    img.onerror=function(){
        window.location=window.location   
    }
return false
}

remember_image.php

if(isset($_GET["toggle"])){
    $_SESSION["like_cats"]=!@$_SESSION["like_cats"];
    die();
}

echo file_get_contents(@$_SESSION["like_cats"] ? "cat.jpeg" : "duck.jpeg" );

在这个演示中,cookie确实会影响图像,因此更容易判断cookie是否随图像一起发送。


现在该资源是否包含特权数据(例如包含好友列表的JSON数据),并且调用此资源的页面能够使用此特权数据(在这种情况下,通过执行魔法javascript来利用JSON)是另一回事。浏览器应该足够安全,以确保大多数明显的向量。 We can't even access other domain's images directly to put in canvases due to security。但是,浏览器供应商当然会遇到那些讨厌的漏洞和漏洞。

我过去常常使用这个事实来制作一个Firefox扩展,它只是删除网站的经过身份验证的页面,以显示带有解析数据的侧边栏,因为Firefox扩展中的ajax与普通页面没有相同的域限制,而我没有必要做任何特别的事情来进行身份验证,因为ajax会按照人们的预期发送cookie。