盗链是一种损害原有网站合法权益,给原网站所在服务器造成额外负担的非法行为。

盗链的实现原理:

客户端向服务器请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回给客户端。比如在请求一个网页时,首先会传回该网页的文本内容。当客户端浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将请求图片资源再发送给客户端。在这个过程中,如果该服务器上只包含了网页的文本内容,并没有存储相关图片资源,而是将图片资源链接到其他的服务器,这就是形成了盗链的行为。这种情况下,客户端请求的图片资源实际上是来自于其他服务器的。

要实现防盗链,需要了解http的referer头域和采用URL的格式表示访问当前网页或者文件的原地址。通过referer头域,我们可以检测到访问目标资源的源地址。这样如果我们检测到的referer头域中的值并不是自己站点内的URL,就采取阻止措施,实现防盗链。

需要说明的是referer头域的值,可以被修改,因此该方法并不能完全阻止所有的盗链行为。

通过一个实例来说明referer头域和防盗链的设置。

先看一个html代码,这是nginx自带的默认的页面,我们在页面中加入了一个img标签,插入一张图片,插入的图片的URL地址,是来自另一个服务器!

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
<div> <!-- 插入的图片 -->
<h4>我的测试图片</h4>
<img src="http://www.test.com/one.jpg"> </div>
</body>
</html>

然后我们在浏览器中访问这个web页面:

在www.test.com服务器上查看访问日志,如下:

192.168.1.103 - - [04/Nov/2018:18:06:44 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
192.168.1.103 - - [04/Nov/2018:18:06:45 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
192.168.1.103 - - [04/Nov/2018:18:06:46 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
192.168.1.103 - - [04/Nov/2018:18:06:46 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"

在如上的日志中标记的就是referer头域,该头域指明了此次访问来自哪里?说明这些访问日志来自www.test.com这个URL。

知道了上面的知识,再来说防盗链,当www.abcc.om再来www.test.com这个服务器上拉取图片时,test服务器拒绝abc的访问,怎么拒绝呢?就是根据访问的referer头域,确定的!

在www.test.com上做如下设置:

        location ~* ^.*\.(gif|jpg|png)$
{
valid_referers none blocked www.test.com;
if ($invalid_referer)
{
return 403;
}
} #如上在test服务器的配置文件中加上如上配置,上面是针对gif,jpg,png格式做的防盗链。
#valid_referers: 这个相当于白名单,出现在valid_referers中的值,都是允许访问的;如果当前访问的referer不符合valid_referers定义的值,则给invalid_referer赋值为1.
如果当前访问的referer的值符合valid_referers定义的值,则给invalid_referer定义为0. #valid_referers的取值可以有三种形式:
  • none表示检查referer头域不存在的情况。
  • blocked,检查referer头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况下头域的值不是以“http”或者“https”开头的。
  • server_namse: 设置一个或多个URL,检查referer头域的值是否是这些URL中的某一个。nginx0.5.33之后支持使用通配符“*”;

按照以上的设置判断一下www.abc.com页面的访问,因为www.abc.com不在valid_referers设置的可访问头域中,因此给invalid_referer赋值为1,则拉取图片时返回403错误,也就是访问不到图片资源,

访问结果如下:

nginx作防盗链设置的更多相关文章

  1. 完美的nginx图片防盗链设置详解

    一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!依然可以下载?这样就不是彻底的防盗链了! [r ...

  2. nginx 有关防盗链的设置

    http://blog.csdn.net/longjef/article/details/53284108 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链 ...

  3. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  4. Nginx中防盗链(下载防盗链和图片防盗链)及图片访问地址操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  5. Nginx图片防盗链【实战】

    访问我的博客 前言 博主目前在一家原创小说网站公司工作,由于站内的作品全部是原创,于是乎不可避免地会被一些盗版网站爬取盗版,对于防盗版一直没有很好的对策,让公司很是苦恼. 最近去一些盗版网站上搜索我们 ...

  6. 什么是防盗链设置中的空Referer

    设置防盗链时候指明和不指明空Referer的差别及实现后的效果? 什么是Referer? 这里的 Referer 指的是HTTP头部的一个字段,也称为HTTP来源地址(HTTP Referer).用来 ...

  7. 【转载】 IIS服务器防盗链设置

    在实际运行的服务器环境中,我们自己网站中的资源一般不希望被外部网站引用,被外部网站引用IIS网站中的资源文件,一是会加重了服务器的负担,二是占用了你自己服务器的外网带宽资源,因此我们希望防止盗链这种情 ...

  8. Nginx 防盗链设置

    何谓'盗链' 此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容. 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址( ...

  9. NGINX 如何防盗链

    一.安装Nginx: 1.解决依赖关系 # yum groupinstall "Development Tools" "Server Platform Deveopmen ...

随机推荐

  1. HDU 1243 反恐训练营(最长公共序列)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  2. poj3168 Barn Expansion【计算几何 平面扫描】

    Farmer John has N (1 <= N <= 25,000) rectangular barns on his farm, all with sides parallel to ...

  3. Shiro - 轻量级Java 安全框架

    Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证.授权.加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务. 并且相对于其他安全框架,Shi ...

  4. canvas API笔记

    HTML5添加的最受欢迎的功能就是<canvas>元素,这个元素负责在页面的指定区域通过js动态地在这个区域绘制图形. <canvas> 由几组API构成. 准备: <c ...

  5. Django模板的加深

    网站模板的设计,一般的,都有一些通用的设计,有导航.底部.统计等相关代码:nav.html.bottom.html.tongji.html 在我前面Django工程的基础上建立一个base.html包 ...

  6. 静默方式安装10g数据库软件+升级patch+手工建库

    通常我们安装Oracle数据库软件,都是用OUI图形界面来完成的,但有些Unix/Linux系统中并未安装图形系统,也就无法使用图形界面来安装Oracle的产品了,对于这种场景,就只能采用静默方式来安 ...

  7. Python面向对象:继承和多态

    继承与多态简介: 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写. 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的. ...

  8. 2018/04/18 每日一学Linux 之 ssh关闭密码登录

    在平常工作中,常常需要关闭 SSH 的密码登录,只留 SSH 证书登录. 好处显而易见,避免了经常输入密码导致的密码泄露,和设置密码导致被暴力破解的可能性. -- 方法也很简单,首先 你是可以 登录 ...

  9. JAVA中只有值传递

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...

  10. spring security积累

    使用数据库管理用户权限: Spring Security默认情况下需要两张表,用户表和权限表 create table users( username varchar_ignorecase(50) n ...