首页 > 脚本相关 > Data URL Schema 与 如何盗链百度的图片

Data URL Schema 与 如何盗链百度的图片

来源:刺

原文链接:http://hi.baidu.com/aullik5/blog/item/c82a94dc5d37b33d5982dde3.html

百度的图片和很多网站防盗链措施一样,是基于Referer 判断
1. 如果浏览器发送的Referer 中不是从百度的域过来的,则判断为盗链
2. 如果浏览器没有发送Referer 头,则认为是不是盗链

现在网上的很多教程都教人怎么伪造Referer,或者不发送Referer。比如Firefox在 about:config 中,可以有选项把Referer的发送给关闭掉。也有很多浏览器的插件和扩展,可以改掉Referer,比较出名的有 RefControl 等。

除此之外,还有一些方法,比如在9.0.45.0 及以前的Flash中,通过ActionScript构造请求的时候,可以自定义 Referer 头。

但是以上这些方法都太重量级了。对于网站来说,很难要求自己的用户去装插件、扩展。在未来,planet的新版本中可能需要解决这个问题,于是这两天我研究了一下,顺便发现可能是浏览器缺陷的一个问题。

目前我在IE8中没有找到好的办法,没有测试IE的其他版本。

利用 Data URL Schema 绕过Referer Check

关于 Data URL Schema 请参考

http://www-archive.mozilla.org/quality/networking/testing/datatests.html

在 Firefox 中有实现,IE不支持。Opera , Safari 参考的 Firefox 的实现

利用 Data:xxxxxxx 可以写各种不同的内容,甚至能够通过base64嵌入二进制的图片到URL里。

比如,要构造XSS,可以这样:
<a href=”data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=”>test</a>

会弹出个小框。

我经过测试,构造了以下方式可以成功实现不发送Referer的需求

<iframe src=”data:text/html;base64,PGltZyBzcmM9aHR0cDovL2hpcGhvdG9zLmJhaWR1LmNvbS9hdWxsaWs1L3BpYy9pdGVtL2IyY2RiNDQ0YTVlYTQ0MDJjZmZjYTMxNy5qcGVnIC8+” ></iframe>

base64 加密的部分实际上就是

<img src=http://hiphotos.baidu.com/aullik5/pic/item/b2cdb444a5ea4402cffca317.jpeg />

可以查看一下新开iframe的域,使用以下的测试方式
<iframe src=”data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pO2FsZXJ0KHdpbmRvdy5sb2NhdGlvbik7PC9zY3JpcHQ+”></iframe>

在iframe中弹出document.domain,可以看到当前的域还是在 www.a.com

说到这里,就要插两句关于 Firefox 的同源判断和Referer 发送规则了。

一般来说, Firefox 会根据当前的JSContext来寻找当前页面的源,doc->GetPrincipal();

发送的 Referer 头的内容,就是获取的页面源。

在 Firefox 中,点击一个link,或者 <img >, <iframe>等标签获取内容时,都会发送相应的 Referer 出去。甚至右键点击一个link,在新的tab中打开,也会发送referer(在新tab中打开页面本来是不发送referer的,有人提交这个bug后,就fix了)。

这样看来,利用 Data URL Schema 构造一个新的语境,再执行一个访问的请求,就不会发送 Referer, 应该属于一个浏览器的缺陷。要说是 Feature 也可以,又是有争议的地方啊。

分类: 脚本相关 标签: , ,
  1. 2009年7月2日18:43 | #1

    直接下来传图床,太方便了,呵呵

  2. 2009年7月3日16:19 | #2

    非常专业的文章

    谢谢分享

    链接已经给您加上,在首页~

  1. 本文目前尚无任何 trackbacks 和 pingbacks.