<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SpookZanG &#187; Referer</title>
	<atom:link href="http://www.spookzang.net/article/tag/referer/feed" rel="self" type="application/rss+xml" />
	<link>http://www.spookzang.net</link>
	<description>安全,漏洞,发现,共享,交流</description>
	<lastBuildDate>Tue, 27 Jul 2010 15:28:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Data URL Schema 与 如何盗链百度的图片</title>
		<link>http://www.spookzang.net/article/801</link>
		<comments>http://www.spookzang.net/article/801#comments</comments>
		<pubDate>Thu, 02 Jul 2009 06:19:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[脚本相关]]></category>
		<category><![CDATA[baidu]]></category>
		<category><![CDATA[Referer]]></category>
		<category><![CDATA[盗链]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=801</guid>
		<description><![CDATA[百度的图片和很多网站防盗链措施一样，是基于Referer 判断的.如果浏览器发送的Referer 中不是从百度的域过来的，则判断为盗链.如果浏览器没有发送Referer 头，则认为是不是盗链.....]]></description>
			<content:encoded><![CDATA[<p>来源：刺</p>
<p>原文链接：<a href="http://hi.baidu.com/aullik5/blog/item/c82a94dc5d37b33d5982dde3.html">http://hi.baidu.com/aullik5/blog/item/c82a94dc5d37b33d5982dde3.html</a></p>
<p>百度的图片和很多网站防盗链措施一样，是<span style="color: #0000ff;"><strong>基于Referer 判断</strong></span>的<br />
<strong>1. 如果浏览器发送的Referer 中不是从百度的域过来的，则判断为盗链<br />
2. 如果浏览器没有发送Referer 头，则认为是<span style="color: #ff0000;">不是</span>盗链</strong></p>
<p>现在网上的很多教程都教人怎么伪造Referer，或者不发送Referer。比如Firefox在 about:config 中，可以有选项把Referer的发送给关闭掉。也有很多浏览器的插件和扩展，可以改掉Referer，比较出名的有 RefControl 等。</p>
<p>除此之外，还有一些方法，比如在9.0.45.0 及以前的Flash中，通过ActionScript构造请求的时候，可以自定义 Referer 头。</p>
<p>但是以上这些方法都太重量级了。对于网站来说，很难要求自己的用户去装插件、扩展。在未来，planet的新版本中可能需要解决这个问题，于是这两天我研究了一下，顺便发现可能是浏览器缺陷的一个问题。</p>
<p>目前我在IE8中没有找到好的办法，没有测试IE的其他版本。</p>
<p><span style="color: #0000ff;"><strong>利用 Data URL Schema 绕过Referer Check</strong></span></p>
<p>关于 Data URL Schema 请参考</p>
<p><a href="http://www-archive.mozilla.org/quality/networking/testing/datatests.html" target="_blank">http://www-archive.mozilla.org/quality/networking/testing/datatests.html</a></p>
<p>在 Firefox 中有实现，IE不支持。Opera , Safari 参考的 Firefox 的实现</p>
<p>利用 Data:xxxxxxx 可以写各种不同的内容，甚至能够通过base64嵌入二进制的图片到URL里。</p>
<p>比如，要构造XSS，可以这样：<br />
&lt;a href=&#8221;data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=&#8221;&gt;test&lt;/a&gt;</p>
<p>会弹出个小框。</p>
<p>我经过测试，构造了以下方式可以成功实现不发送Referer的需求</p>
<p><span style="color: #0000ff;">&lt;iframe src=&#8221;data:text/html;base64,PGltZyBzcmM9aHR0cDovL2hpcGhvdG9zLmJhaWR1LmNvbS9hdWxsaWs1L3BpYy9pdGVtL2IyY2RiNDQ0YTVlYTQ0MDJjZmZjYTMxNy5qcGVnIC8+&#8221; &gt;&lt;/iframe&gt;</span></p>
<p>base64 加密的部分实际上就是</p>
<p>&lt;img src=http://hiphotos.baidu.com/aullik5/pic/item/b2cdb444a5ea4402cffca317.jpeg /&gt;</p>
<p>可以查看一下新开iframe的域，使用以下的测试方式<br />
&lt;iframe src=&#8221;data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pO2FsZXJ0KHdpbmRvdy5sb2NhdGlvbik7PC9zY3JpcHQ+&#8221;&gt;&lt;/iframe&gt;</p>
<div><img src="http://hiphotos.baidu.com/aullik5/pic/item/58e03a009312c1287bec2c3a.jpg" border="0" alt="" /></div>
<p>在iframe中弹出document.domain，可以看到当前的域还是在 www.a.com</p>
<p>说到这里，就要插两句关于 Firefox 的同源判断和Referer 发送规则了。</p>
<p>一般来说， Firefox 会根据当前的JSContext来寻找当前页面的源，doc-&gt;GetPrincipal();</p>
<p>发送的 Referer 头的内容，就是获取的页面源。</p>
<p>在 Firefox 中，点击一个link，或者 &lt;img &gt;, &lt;iframe&gt;等标签获取内容时，都会发送相应的 Referer 出去。甚至右键点击一个link，在新的tab中打开，也会发送referer（在新tab中打开页面本来是不发送referer的，有人提交这个bug后，就fix了）。</p>
<p>这样看来，利用 Data URL Schema 构造一个新的语境，再执行一个访问的请求，就不会发送 Referer, 应该属于一个浏览器的缺陷。要说是 Feature 也可以，又是有争议的地方啊。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/article/801/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
