一、Referer是什么?用途?
二、盗链是什么?危害?
三、防盗链小技巧
四、反防盗链
五、利用好盗链,也是一门生意!
一、Referer是什么?用途?
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
用途:
1、获取访问来源,统计访问流量的来源和搜索的关键词
比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
像CNZZ、百度统计等可以通过Referer统计访问流量的来源和搜索的关键词(包含在URL中)等等,方便站长们有针性对的进行推广和SEO。
2、防盗链
通过分析访问源,拒绝非法访问,主要是图片和网盘服务器使用的较多。
二、盗链是什么?危害?
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。
危害:
1、大量的盗链,会消耗原生网站带宽,导致服务器运行缓慢,影响原生网站用户体验。如果没有良好的防盗链技术,一般服务器数周之内就会被盗链拖垮,并且不能给原生网站带来任何流量。
2、版权被无偿使用,侵犯了著作人的权益。
3、倒链一旦猖獗,会严重阻碍了互联网的健康发展,没人愿意为正版付费,自然也就没有了正版生长的土壤,最后受害的还是广大网民。
三、防盗链小技巧
本文主要介绍两种方法做防盗链处理:
1、nginx配置方式防盗链
主要是利用valid_referers指令防盗链,例如防止未经允许的网站盗链图片、文件等。
因为HTTPReferer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链
该指令"valid_referers"的语法:
valid_referers [none|blocked|server_names] ...
默认值:none
使用环境:server,location
该指令会根据Referer Header头的内容分配一个值为0或1给变量$invalid_referer。
如果RefererHeader头不符合valid_referers指令设置的有效Referer,变量$invalid_referer
将被设置为1.
该指令的参数可以为下面的内容:
none:表示无Referer值的情况。
blocked:表示Referer值被防火墙进行伪装。
server_names:表示一个或多个主机名称。从Nginx0.5.33版本开始,server_names中可以使用通配符"*"号。
实例演示:
修改nginx.conf:
第一行:
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
其中“gif|jpg|jpeg|png|bmp|swf”设置防盗链文件类型,自行修改,每个后缀用“|”符号分开!
第三行:
valid_referers none blocked *.http://sosogoto.com sosogoto.com;
就是白名单,允许文件链出的域名白名单,自行修改成您的域名!*.http://sosogoto.com这个指的是子域名,域名与域名之间使用空格隔开!
第五行:
rewrite ^/ http://qita/cdn/404.jpg;
这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。
这样设置差不多就可以起到防盗链作用了,上面说了,这样并不是彻底地实现真正意义上的防盗链!
我们来看第三行:valid_referers 里有 “none blocked”,我们把“none blocked”删掉,改成如下配置:
这样您在浏览器直接输入图片地址就不会再显示图片出来了,也不可能会再右键另存什么的。
第五行:
rewrite ^/ http://qita/cdn/404.jpg
这个是给图片防盗链设置的防盗链返回图片。
如果文件也需要防盗链下载,把第五行:
rewrite ^/ http://qita/cdn/404.jpg
改成一个链接,可以是您主站的链接,比如把第五行改成:
rewrite ^/ http://www.sosogoto.com;
这样,当别人输入文件下载地址,由于防盗链下载的作用就会跳转到您设置的这个链接!
最后,重启nginx生效!
2、Fileter拦截器方式防盗链
通过在应用程序设置Fileter拦截器的方式,对每一个需要处理的请求分别动态处理。
本文采用正则表达式的范式对请求链接做辨别,另本文效仿Spring的filter做法,加了个shouldBeFilter的方法。考虑到,比如假如你要拦截*.Action的一部分方法,而不是全部时,我们就可以先看看请求的URL是否shouldBeFilter,如果不是的话,那么就直接放行,在效率上有所提高。
代码如下:
文件
/WEB-INF/classes/preventLink.properties
用于限制的url正则,用逗号分隔多个
url.limit=/.+/index/!.+//.action.*,/index/!.+.action?.+
这里是Http Refer是否以指定前缀开始,前两个是本地调试用的
url.allow=http://127.0.0.1,http://localhost,http://www.csdn.net
这里是被盗链后,response到以下的错误页面
url.error=http://www.csdn.net/error.html
这篇文章是拦截所有的请求的,他fileter中的url-pattern是/*,这样的话,连/css
/jpg等都话被filter拦截到,要么在里面进行shouldBeFilter的判断,要么就在url-pattern中缩写拦截范围,这个要看具体你要拦截什么样的请求,另外图片防盗链,下载反盗链也是一样的原理的。
四、反防盗链
攻防相生相克,此消彼长,没有什么是绝对的安全,有的只是付出的成本和代价与所得利益的权衡。
上文介绍了防盗链的基本原理,以及具体实现方法。如果要反防盗链,自然要逆向操作了,其基本原理也就是伪造Referer。
列举2个伪造Referer的方法:
1、使用反盗链js
调用方式:
showImg('图片地址');
关于此类盗链的防御方法,有以下3点:
1、不允许referer为空(不建议,因在某些开启隐私模式的浏览器中,或https页面引用下,referer是空的)
2、地址变更(lighttpd的是根据有效时间,nginx的根据是md5)
3、登录校验(如必须登录网站帐号后才能访问)
2、 通过过滤器修改Referer
发送请求时,通过过滤器对每次请求做处理,主要是设置Referer的值。
对于不同语言开发者而言去操作这个http中的request的referer这个值得方式是不一样的,就比如说servlet来处理这个referer的话就是先得到这个http请求request中的referer,通过一个拦截器的方式去拦截这个请求,然后对这个referer值进行修改。
那么如何修改呢?
肯定是修改为盗链网站的域名。用一个拦截器去请求,或者是让请求指向特定的请求地址,在特定的请求地址中对这个referer进行包装。
比如我想盗链http://www.aaa.com上的一个图片,这个图片的请求地址是http://www.aaa.com/image/1.jpg。那么在请求的时候我们可以让请求指向http://www.ourserver.com/handleRequest.asp?url=www.aaa.com/image/1.jpg中,在这个处理器中对referer进行重新的包装。
怎么包装呢?
就是将referer的值制定为http://www.aaa.com。这样http://www.aaa.com在接到图片请求地址的时候就会去判断请求中的referer值,这时,因为我们对referer值已经进行了重新的包装,就可以通过http://www.aaa.com的校验,盗链成功!
我们用一段php的代码加以演示:
以上案例的原理是sock构造http头来senddata。其他语言什么的比如perl也可以,
目前比较简单的防御伪造referer的方法是用验证码(Session)。
现在有一些能防盗链软件的商业公司比如UUDOG,linkgate,VirtualWall什么的,都是开发的应用于IIS上面的dll。
有的是采用cookies验证、线程控制,有的是能随机生成文件名然后做URL重写。有的方法能的确达到不错的效果。
所以,以上盗链的技巧,还是能破解的。
Javascript document.referer来路判断
上面提到的伪造referer的方法都是通过服务器端的脚本来实现的,但它们并不能欺骗客户端。而JS是在客户端执行的,它并不会理会服务器端的headers信息,
所以,利用js的 document.referer 方法可以准确地判断网页的真实来路。
几乎所有的第三方统计不约而同地采用了
document.referer 来判断来路,为什么?正是基于 js 下的 referer来路
是不可伪造的(不是100%啊,下面就有例子)。即使在服务器端成功地伪造了referer的网页脚本,在第三方统计里也是无法被统计到的,
原因正是由于这些三方统计采用了 document.referer 来判别真实的来路。 所以,为了对抗虚假的 referer 伪造信息,我们只需要利用 js 的 document.referer 来判别,就可以将伪造的信息拒之门外,从而更好的保护站内资源。
JavaScript 伪造 Referer 来路方法
因为服务器端脚本可以轻易伪造referer,所以各大统计站点cnzz,百度统计,ga,51la等都是通过js来判断来路,不过现在有个方法js的referer也可以伪造了。
WinHttp.WinHttpRequest.5.1 是 msxml 4.0 的底层对象,也就是说 XMLHTTP/ServerXMLHTTP 也是在它的基础上封装而来。用 WinHttpRequest 发的请求,Fiddler 监测不到。
Google一下发现它居然用可以成功伪造所有 http 请求的 header 信息!下面的代码通过伪造 referer 的值,假装从百度首页提交一个表单到指定的 url 去:
Referer是不安全的,客户端可以通过设置改变 Request中的值,尽量不要用来进行安全验证等方面。
下面介绍默认情况下Referer可能出现为空的场景:
1、直接输入网址或通过浏览器书签、收藏夹访问
2、单击’主页’或者自定义的地址
3、https—>http
由于FF提供了很强大的自定义参数设置功能,所以我们可以通过about:config页面修改以下两个选项的默认设置:network.http.sendRefererHeader
(default=2),设置Referer的发送方式,0为完全不发送,1为只在点击链接时发送,在访问页面中的图像什么的时候不发送,2为始终发送。network.http.sendSecureXSiteReferrer
(default=true),设置从一个Https访问到另外Https页面的时候是否发送Referer,true为发送,false为不发送。
4、使用 JavaScript 的 Location.href 或者是 Location.replace()
5、 当然你可以通过在Chrome或者Firefox浏览器中安装一些插件去除Referer甚至进行Referer欺骗。如果是自己写爬虫的话,Referer是完全受我们掌控的,想怎么改就怎么改。
6、使用html5中noreferrer
noreferrer
noreferrer
很明显IE8以及以下肯定是不支持的chrome正常点击的话没问题,但是假如是右击链接然后重新窗口或标签打开,同样会传递referer。
7、使用 meta refresh 重定向的网址,这个会多出来个跳转页面,IE8支持,chrome同样携带referer。
8、在PHP中可以通过预定义变量$_SERVER获取HTTP的Referer
即:$_SERVER['HTTP_REFERER']
五、利用好被盗链,也是一门生意!
自己辛苦租了服务器,结果为人作嫁,于是就形成了一个恶性循环,自己使用本地资源,那么就被人盗链,还不如自己也去盗链别人的,所以越来越多的人放弃了使用自己的服务器资源,而去盗链别人的资源。
那么有什么办法可以合理的利用这些疯狂的盗链者的流量呢?
可以采取如下方法:
1、 按月租赁服务器,这个样子费用比较低,一个月几百块钱,也可以租赁VPS。
2、 找寻一些比较热门的下载资源,挑选出小于5M的资源,单个资源越小,被下载的总人数就越多。
3、 制作一个论坛,然后每个帖子是一个下载资源,直接给出的就是资源的直接目录。
4、 对每个资源都进行压缩包装,在压缩以前,在文件里面加上你的广告页快捷链接,命名为"免费电影.html"。
5、 不断的添加新资源,每个资源都进行压缩包装。
6、 这些资源很快就会被别人盗链了,因为网络上有大量的扫描软件,自动扫描资源。
这些软件每天整体被下载次数要超过10万次,别人盗链你一次,就给你把广告页宣传出去一次,所以你的广告页,每天都会为几万人所浏览,一般情况下,一台VPS虚拟服务器,一天可以带来5万IP。
这种流量质量不是很高,使用这些流量做短信注册类广告,平均每IP一分钱左右的收入,5万IP约有500块收入,VPS一个月的租赁费是350元。
名词解释:
1、VPS
VPS为虚拟服务器的意思,就是把一台服务器虚拟成多个服务器操作界面,出售给多个需要服务器的人,VPS和独立服务器的操作界面完全一样,也是独立IP的,VPS比独立服务器的稳定性要差一些,
比一般网站空间容量要大一些,同时还是独立IP,可以开通多个网站。VPS主要用于制作下载站以及一些流量10万IP以上30万IP以下的网站。
2、热门下载资源查询
在迅雷站上,有资源下载排行榜,可以根据这个排行榜查看目前比较热门的下载资源列表。
转载请注明出处。