一 基本铺垫
盗链的理解
① 什么是盗链
盗链就是'盗用'别的网站的'链接'
1)'大佬'建一个网站,'提供下载'以提高自己知名度和吸引力,这样你就必须有'空间存储'那些供人们下载的资源
2)'不劳而获者'也建立一个网站,也提供下载服务,自己'不买'网上存储空间
3)而是'盗用你的下载地址',挂在我自己的网站上,并且最主要的是'未经过你同意',这就是盗链
盗链: 通过在自己网站里面'引用别人的资源链接','盗用'人家的劳动和资源
盗链影响: 对'别人'服务器的物理资源进行压榨,影响被盗链者的网站-->'流量在大佬侧产生'
+++++++++++++++++'通俗理解(访问不是自己的资源)'+++++++++++++++++
1)比如你在'盗链者网站'下载一个软件,你'点开连接地址'也就是URL
2)你发现'它的地址'却是引用的'大佬网站'的下载地址,这就是盗链
Referer理解
1)HTTP 协议中有一个用来表示'页面或资源'来源的'请求头',这个请求头叫做 'Referer'
补充:Referer是表示请求是从'哪个网址'跳转过来的
2)'防盗链'功能基于'HTTP协议'的Referer机制,通过Referer'跟踪来源',对来源进行'识别和判断'
Referer的应用
② 经典的现象
在'网页'引用'站外'的图片
当'浏览器'向'Web服务器'发送请求的时候,'一般会带上Referer',告诉服务器我是'从哪个页面'链接过来的,'Server-->服务器'借此可以'获得'一些信息用于'处理'
备注: 如果是直接在浏览器上输入地址,'回车进来',则'没有Refer头'
Refer:代表网页的来源,也即'上一页的地址-->从哪跳转过来的?'
重点:为什么'服务器知道'我们的图片是'从哪引用'的,也知道'客户'从那个'网站链接点击过来'的
细节: Referer与'跨域'关联比较大
③ nginx防盗链的维度
二 http_refer模块
用到'ngx_http_referer_module'模块和'$invalid_referer'变量
① valid_referers
注意事项
1)通过'浏览器直接'打开img的url,这时候是'没有referer的',如果'容许'这一类,那么配置valid_referers'可以包括none'
2)如果'referer不为空',但是里面的内容被'防火墙或者代理服务器'删除了,'也容许'这一类的话,可以通过'配置blocked'来绕过
1)blocked 包含所有'不是以 http(s):// 开头'的referer请求头[包含 "referer:"]
2)不支持'单独只配置' none 或 blocked
② referer_hash_bucket_size referer_hash_max_size
③ valid_referers
备注: 通过'invalid_referere'变量为'0'表示黑名单
场景: 一般'if'指令进行判断
④ 黑白名单
⑤ 简单案例
location ~* \.(gif|jpg|png|swf|flv)$ { 需要'防盗链资源'的'文件类型'
valid_referers none blocked *.ttlsa.com server_names ~\.google\. ~\.baidu\.; 这是'可以盗链的域名或IP地址(白名单)',一般情况可以把google、baidu、sogou、soso等域名'放进来'允许他们来'使用这些资源'
if ($invalid_referer) { '判断有没有referer'
这样设置能够防盗链,不断地'302(永久)重定向'很多次,可能会'加重服务器'的负担,所以'不建议'这么做,除非有单独的图片服务器支持
#rewrite ^/ https://www.wzj.com/picture/images/403.jpg; #如果有人非法盗链资源,则返回一张'防盗链的图片'
return 403; '暴力的方式-->直接返回403错误代码'
}
}
⑥ nginx的案例
典型的允许: 只允许特定的'ip'进行跨域来'获取资源'-->'产生流量'
++++++++++++++++'分割线'++++++++++++++++
设计思路: 两个网站('A和B')、A尝试访问B的图片资源被禁止
测试: 虚拟主机有这个'referer'头没有?
备注: 报错的原因是'语法错误'
++++++++'分割线'++++++++
下面含义: 只允许'172.25.2.200'来盗取'jpg和png图片'
--> '测试1':直接通过'浏览器'访问资源 <--
304状态码或许'不应该认为是一种错误',而是对'客户端有缓存'情况下'服务端的一种响应'
浏览器还是得为'每个资源'生成'一条'条件请求,并且'等到服务器返回'HTTP/304响应,'才能读取客户端缓存'来显示网页.
静态资源缓存 304讲解
--> '测试2':'跨域'跳转是否能获取资源 <--
'A' nginx服务器配置
'B' nginx服务器配置'防盗链'
http://nginx.wzj.com/tupian.html
测试效果:图片'加载不出来'了
+++++++++ 非法跳转过来的给其'友好提示' +++++++++
说明: rewrite生效,也即'Referer'生效
需求:'查看'Referer
'图片超链接'--> '点击图片跳转到百度'
说明: 由于'referer',在'172.25.2.200'发生了一次'rewrite',展示的图片'不是'我们需求的
⑦ curl测试
⑧ 参考链接
链接1
链接2
链接3
1)HTTP Referer头信息是可以'通过程序来伪装生成'的
2)所以通过Referer信息防盗链'并非100%可靠',但是它能够'限制'大部分的盗链
3)防爬虫这些,都是'防君子不防小人'的