Referer反反盗链
0x00 前言
最近用Python非常多,确实感受到了Python的强大与便利。但同时我并没有相见恨晚的感觉,相反我很庆幸自己没有太早接触到Python,而是基本按着C→C++→Java→Python这条路学习下来的,因为过早使用太便利的方法有可能使你对底层细节一无所知。
现在我对HTTP协议的了解完全要归功于当初用Java写爬虫时遇到的各种问题,如果我很早就开始使用Python的urllib2或者requests,那么我现在对HTTP协议的认识可能依然非常肤浅。
好了,如果你对HTTP协议不太熟悉的话,强烈建议你先去看看相关知识,也可以看看《图解HTTP》,会有一个更全面的了解。
0x01 Referer简介
简单来说,Referer是HTTP协议中的一个请求报头,用于告知服务器用户的来源页面。比如说你从Google搜索结果中点击进入了某个页面, 那么该次HTTP请求中的Referer就是Google搜索结果页面的地址。如果你的某篇博客中引用了其他地方的一张图片,那么对该图片的HTTP请求 中的Referer就是你那篇博客的地址。
一般Referer主要用于统计,像CNZZ、百度统计等可以通过Referer统计访问流量的来源和搜索的关键词(包含在URL中)等等,方便站长们有针性对的进行推广和SEO什么的~
当然Referer另一个用处就是防盗链了,主要是图片和网盘服务器使用的较多。盗链的危害不言而喻,侵犯了版权不说,增加了服务器的负荷,却没有给真正的服务提供者带来实际利益(广告点击什么的)
另外要注意的是,Referer是由浏览器自动为我们加上的,以下情况是不带Referer的
- 直接输入网址或通过浏览器书签访问
- 使用
JavaScript的Location.href或者是Location.replace() - HTTPS等加密协议
当然你可以通过在Chrome或者Firefox浏览器中安装一些插件去除Referer甚至进行Referer欺骗。如果是自己写爬虫的话,Referer是完全受我们掌控的,想怎么改就怎么改~
0x02 Referer的安全问题
严格来说Referer并非一些安全问题的根源,只不过充当了一个帮凶。咱们以新浪微博曾经的一个漏洞(新浪微博gsid劫持)为例说明吧~
什么是gsid呢?
gsid是一些网站移动版的认证方式,移动互联网之前较老的手机浏览器不支持cookie,为了能够识别用户身份(实现类似cookie的作 用),就在用户的请求中加入了一个类似“sessionid”的字符串,通过GET方式传递,带有这个id的请求,就代表你的帐号发起的操作。后来又因用 户多次认证体验不好,gsid的失效期是很长甚至永久有效的(即使改了密码也无用哦,这个问题在很多成熟的web产品上仍在发生)。也就是说,一旦攻击者 获取到了这个gsid,就等同于长期拥有了你的身份权限,对你的帐号做任意操作。
相信看到这里你已经能猜到这个漏洞的基本原理了,gsid这个非常重要的参数竟然就在URL里,只要攻击者在微博上给你发一个链接(指向攻击者的服 务器),你通过手机点击进入之后,手机当前页面的URL就通过Referer主动送到了攻击者的服务器上,攻击者自然就可以轻松拿到你的gsid进而控制 你的账号。
当然防范这种攻击的方法很多,了解更多请戳新浪微博gsid劫持
0x03 反反盗链
反盗链的方法这里就不多说了,网上一搜一箩筐,不同平台有不同的实现方法。
加入反盗链机制后,从其他非服务提供者指定的来源的HTTP请求就得不到正常结果了,比如百度的反盗链机制~

注意,上面的不是截图,就是盗链,你可以用审查元素进行查看。
当然,访问用户可以通过给浏览器安装一些插件去除Referer来正常显示,但是并非每一个用户都那么爱折腾。有没有一个简单粗暴跨平台跨浏览器的服务器端解决方案呢?也就是说访问用户什么都不用做就可以正常显示。
当然有,看下面这张图片,你同样可以用审查元素进行查看(这里为了防止缓存我使用的是不一样的图片)
同样是百度域名下面的图片,为什么一张可以正常显示,另一张就显示盗链呢?我们来抓包看看
显示盗链的图片

正常显示的图片

看到了吗?正常显示的那张图片的HTTP请求中没有Referer,所以我们得到了正常的结果
那么问题来了——Referer是怎么去除的呢?
这里我用到了referrer-killer,里面还有一个Demo,具体用法可以查看本篇博客的网页源码,或者那个Demo的网页源码。其实就几行代码~
<script src="/assets/js/ReferrerKiller.js"></script>
<span id="noreferer"></span>
<script>
document.getElementById('noreferer').innerHTML = ReferrerKiller.imageHtml('http://a.hiphotos.baidu.com/ting/pic/item/3bf33a87e950352aa210e8635043fbf2b2118b6c.jpg');
</script>
粗看referrer-killer的原理并不复杂,动态生成了一个iframe,并在这个iframe里面加入img标签来进行显示。
等等,如果仅仅是这样的话Referer依然会存在,要么是iframe父页面的地址,要么是iframe属性中src的地址,详情请戳What is the HTTP Referer if the link is clicked in an <iframe>?,里面有详细解释。
再仔细看代码,发现iframe中src的值为javascript:"<!doctype html>......",原来是把iframe中的HTML代码全部放到了src中,使用这种方法就可以去掉Referer。其实乌云早有大神给出了方法,只不过没有工具化罢了,详情请戳json hijack如何丢掉referer,注意看@Sogili和@gainover同学的回复。
0x04 总结
本篇博客中的Referer和上一篇博客中涉及到的User-Agent都与HTTP协议有关。当遇到一些与底层协议相关的问题时,如果对其不了解,往往只能束手无策或者要浪费很多时间。
因此,即便Python提供了非常强大的功能,花时间去了解HTTP协议依然是十分必要的。
Referer反反盗链的更多相关文章
- 通过设置Referer反"反盗链"
package cn.searchphoto.util; import java.io.File; import java.io.FileOutputStream; import java.io.In ...
- 对付"反盗链"
对付"反盗链" 某些站点有所谓的反盗链设置,其实说穿了很简单, 就是检查你发送请求的header里面,referer站点是不是他自己, 所以我们只需要像把headers的refer ...
- sevlet实现反盗链
有时候为了网站的版权和安全问题,我们需要为我们的网站应用设置防盗链,这样可以保证我们网站的一些资源的安全性.防盗链的主要是通过获取http的请求头referer的信息来和我们的网站地址做对比,如果相同 ...
- 跳过图片反盗链js
页面增加<iframe> <iframe id="ifa" style="display:none" /> 原来html: <im ...
- 关于python 爬虫遇到的反盗链
首先声明:目标网址是从别人案例里得到的,内容你懂的... 本来闲来无事,学习下爬虫的知识,遇到恶心的反盗链,好在目标网址防盗链简单,代码里注明了如何去查看目标网址的防盗检查: 防盗链原理 http标准 ...
- 利用Referer请求头阻止"盗链"
转自:http://wisdomsong2007.blog.163.com/blog/static/47783725200882523820664/ 前言 有一些站点自己没有提供下载空间,但是为了吸引 ...
- python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题
python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述 通过编写程序'模拟浏览器'上网,然后通 ...
- scrapy反反爬虫
反反爬虫相关机制 Some websites implement certain measures to prevent bots from crawling them, with varying d ...
- scrapy反反爬虫策略和settings配置解析
反反爬虫相关机制 Some websites implement certain measures to prevent bots from crawling them, with varying d ...
随机推荐
- CentOS6.5 服务器+apache5.3绑定多个域名+SELinux设置
下面简单的介绍了如何通过设置Apache的http.conf文件,进行多个域名以及其相关的二级域名的绑定(假设我们要绑定的域名是minidx.com和ntt.cc,二级域名是blog.minidx.c ...
- Linux C++ 开发简介(包括Linux守护线程)
阅读目录 简介 操作系统 编辑器 编译器 构建系统 调试 IDE 可执行程序.动态库.静态库 服务 Windows服务简介 创建Windows服务 注册Windows服务 管理Windows服务 Li ...
- 获取操作系统版本Asp.Net
/// <summary> /// 获取操作系统版本号 /// </summary> /// <returns></returns> public st ...
- 用 PS 复制权限
用 PS 复制权限 我们要把源计算机上的文件权限复制到目的计算机上. get-acl .\s.txt | Export-Clixml sddl.xml 把 s.txt 文件的权限保存到 sddl.xm ...
- hdu 4861 Couple doubi(数论)
题目链接:hdu 4861 Couple doubi 题目大意:两个人进行游戏,桌上有k个球,第i个球的值为1i+2i+⋯+(p−1)i%p,两个人轮流取,假设DouBiNan的值大的话就输出YES, ...
- BZOJ 2693: jzptab( 莫比乌斯反演 )
速度居然#2...目测是因为我没用long long.. 求∑ lcm(i, j) (1 <= i <= n, 1 <= j <= m) 化简之后就只须求f(x) = x∑u( ...
- kali 国内镜像源,以及PD_tools,Vm_tools的安装
kali 系统apt-get 更新镜像源,往上分享的有,这里整理下 中科大kali源 deb http://mirrors.ustc.edu.cn/kali sana main non-free co ...
- 使用Java创建RESTful Web Service(转)
REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移).2000年Roy Fielding博士在他的博士论文“Architectural Sty ...
- VC 为静态控件添加事件
操作系统:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为静态控件添加事件,如:STATIC.Picture Control等等 有时候我们找到一个图片,为对话框背景添加 ...
- Java里的日期和时间学习
Date date = new Date();//yyyy-mm-dd hh:mm:ss[.fffffffff] SimpleDateFormat sdf = new SimpleDateFormat ...