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 也可以,又是有争议的地方啊。

直接下来传图床,太方便了,呵呵
非常专业的文章
谢谢分享
链接已经给您加上,在首页~