盗链的概念
指在自己的页面上展示一些并不在自己服务器上的内容。也就是获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。如,小站盗用大站的图片、音乐、视频、软件等资源来减轻自己服务器的负担。

防盗链的概念
防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源。绕开本站资源展示页面的资源链接失效就达到了防盗链。

防盗链的工作原理
通过Referer或者签名,网站可以检测到目标页面访问的来源页面,如果是资源文件,则可以跟踪到显示它的网址页面。一旦检测到来源不是本站即进行组织或者返回指定的页面。
观察一下NetWork中Request Header中的Referer,可以根据此方法判断是不是盗链。
还比如用签名,就是在请求图片的时候,带一个参数,这个参数是彼此之前约定好的签名,服务器在显示图片的时候判断签名是否正确来判断,通常签名是很复杂的。

Referer方法
Nginx模块ngx_http_referer_module用于阻挡来源非法的域名请求。
Nginx指令valid_referers,全局变量$invalid_referer。也就是如果想用这个模块,那么就用这个变量。
使用方法
valid_referers none | blocked | server_names | string ...;
node :代表是referer是否为空,写none表示也是合法的,不写none表示来源不合法(Referer来源头部为空的情况下)
blocked :"Referer"来源头部不为空,但是里面的值被代理了或者防火墙删除了,这些值都不以http://或者htps://开头
server_names : "Referer"来源头部包含当前的server_names,也就是被允许的源的列表。

下面在虚拟机上做一下测试,WEB服务器是Nginx。

分别是192.168.136.135(实际文件源服务器)   192.168.136.138(盗用连接的服务器)

进入192.168.136.135的网站根目录,上传图片,编写一个访问页面并链接图片,访问查看NetWork

下面开始编辑192.168.136.135的Nginx配置

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$

其中“gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico”设置防盗链文件类型,自行修改,每个后缀用“|”符号分开!

valid_referers none blocked *.baidu.com baidu.com;

就是白名单,允许文件链出的域名白名单,自行修改成您的域名!*.baidu.com这个指的是子域名,域名与域名之间使用空格隔开!

rewrite ^/ http://www.baidu.com/img/bd_logo1.png;

这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
#通过valid_referers做防盗链,写了三项
#node :表示referer为空的时候也可以显示(直接在浏览器访问图片)
#blocked :表示防火墙或者代理删除我们的referer的时候也可以
#server_names : "Referer" 来源头部包含当前的server_names,也就是被允许的源的列表,直接通过IP也可以(测试用的IP)
valid_referers none blocked 192.168.136.135;
if ($invalid_referer ) {
#return ; #如果开启此项,http状态码为403
rewrite ^/ http://www.baidu.com/img/bd_logo1.png; #百度LOGO
}
expires 30d;
access_log off;
}
/usr/local/nginx/sbin/nginx -s reload   //修改完成之后,别忘了重新加载一下Nginx配置,平滑重启

下面在盗用的服务器上做一下测试,图片的连接地址是http://192.168.136.135/img/1.png,然后访问192.168.136.138查看响应

当然也可以针对目录进行防盗链

location /img/ {
#通过valid_referers做防盗链,写了三项
#node :表示referer为空的时候也可以显示(直接在浏览器访问图片)
#blocked :表示防火墙或者代理删除我们的referer的时候也可以
#server_names : "Referer" 来源头部包含当前的server_names,也就是被允许的源的列表,直接通过IP也可以(测试用的IP)
valid_referers none blocked 192.168.136.135;
if ($invalid_referer ) {
#return ; #如果开启此项,http状态码为403
rewrite ^/ http://www.baidu.com/img/bd_logo1.png; #百度LOGO
}
expires 30d;
access_log off;
}

这样设置差不多就可以起到防盗链作用了,上面说了,这样并不是彻底地实现真正意义上的防盗链!当然也可以把前两项去掉:valid_referers 192.168.136.135;,更严谨一步防止盗链。因为可以伪造Referer。

加密签名方法

请求图片的时候带签名过去,当返回图片的时候判断签名是否正确,也就是暗号。

加密签名的时候需要使用第三方模块HttpAccessKeyModule,因为在服务端php里需要显示图片的时候跟一个签名,交给Nginx的时候,Nginx需要做一个判断,判断前面是否正确,Nginx在判断的时候就需要这个模块了。

链接:https://pan.baidu.com/s/1bqekisB 密码:h24h  //下载地址

用法:
用之前需要安装,安装好配置指令

accesskey on | off //模块开关

开启之后

accesskey_hashmethod md5 | sha- //签名加密的方式
accesskey_arg GET 参数名称 //我们去请求图片或者资源的时候,后面带的参数名称是什么,需要传递签名,但是前提需要知道签名的key(名称)是多少
accesskey_signature //加密规则,需要跟Nginx说我们的加密规则是什么,需要PHP的规则和Nginx的规则保持一致,那么才会控制图片的显示
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg sign; #参数键名
accesskey_signaurre "mytest$remote_addr"; #mytest字符串拼接客户端ip然后md5加密
expires 30d;
}

保存reload

然后再我们的PHP端模拟访问一个图片

<?php
$accesskey = "mytest"; //自定义的秘钥串
$user_addr = $_SERVER['REMOTE_ADDR']; //客户端IP
$urlkey = md5($accesskey .$user_addr );
echo '<img src="./img/1.png?sing="'. $urlkey .'">'; //sign是Nginx配置中的参数键
echo '<img src="./img/1.png">'; //对比测试

测试以下,OK,NetWork图片referer带参数,实现了防盗链~

WEB服务器防盗链_HttpAccessKeyModule_Referer(Nginx&&PHP)的更多相关文章

  1. Nginx系列二:(Nginx Rewrite 规则、Nginx 防盗链、Nginx 动静分离、Nginx+keepalived 实现高可用)

    一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含义就是某个URL重写成特定的URL(类似于Redirect),从某种意义上说为了美观或者对搜索引擎友好, ...

  2. PHP及相关服务器防盗链

    服务器防盗链 假设域名为www.localhost.com 1.apache配置httpd.conf SetEnvIfNoCase Referer "^http://www.localhos ...

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

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

  4. nginx高性能WEB服务器系列之九--nginx运维故障日常解决方案

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  5. Nginx作为web静态资源服务器——防盗链

    ​ 基于http_refer防盗链配置模块 Syntax:valid_referers none | blocked | server_names | string ...; Default:—— C ...

  6. nginx实践(四)之静态资源web服务(防盗链)

    防盗链目的 防止资源被盗用 http_refer 主要是判断refer信息,判断请求来源是不是合法身份 语法 实例 参数说明: none表示允许没有代理的头信息过来,blocked表示refer信息不 ...

  7. nginx之旅(第二篇):nginx日志管理、nginx防盗链、nginx虚拟主机

    一.nginx日志管理 Nginx访问日志主要有两个参数控制 1) log_format #用来定义记录日志的格式(可以定义多种日志格式,取不不同名字即可) log_format log_name s ...

  8. web页面防盗链功能使用--request.getHeader("Referer")

    使用Request对象设置页面的防盗链 所谓的防盗链就是当你以一个非正常渠道去访问某一个Web资源的时候,服务器会将你的请求忽略并且将你的当前请求变为按正常渠道访问时的请求并返回到相应的页面,用户只有 ...

  9. Web服务器的反向代理nginx

    nginx作为web服务器一个重要的功能就是反向代理. Nginx配置详解   序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭 ...

随机推荐

  1. 网口up不起来问题排查

    最近处理一个问题,发现有的网口up不起来.       ethtool eth6   Settings for eth6:   Supported ports: [ FIBRE ]   Support ...

  2. 关于今天esp8266运行失控问题和oled与串口共存尝试成功的总结

    今天2017-12-1720:24:22下午esp8266再次无法刷入固件,导致我一度崩溃,本来已经认为esp8266已经相当稳定了,没想到今天又运行出错,总结如下 今天2017-12-17esp无法 ...

  3. 开发步骤Dubbo、spring mvc、springboot、SSM开发步骤

    一.Dubbo开发步骤: 链接:https://pan.baidu.com/s/1pMPO1kf 密码:9zaa 第一: 1.创建consumer工程2.在pom.xml文件下添加配置3.添加appl ...

  4. 学会配置nginx

    一.作为一名开发人员,大家可能经常会用到服务器,但是一般线上的服务器可能都是公司公用的,而且线上的服务器一般也不是能随随便便给个人用的,所以部署本地服务器看来是一遍必不可少的事情和能力呀,所以,ngi ...

  5. HTML学习——表单标签

    1.type: 当 type="radio" 时,控件为单选框 当 type="checkbox" 时,控件为复选框 2.value:提交数据到服务器的值(后台 ...

  6. scala 小结(一)

    Scala 是什么?(What is scala?)   引用百度百科对于scala的定义: Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编 ...

  7. VS中代码覆盖问题

    在VS中编写代码时,需要插入代码是,经常是将插入点后面的代码覆盖掉而不是将它向后推. 解决这样的问题,只需要按   Insert 键即可, 我的笔记本是   Fn 加 del

  8. ORACLE 建表语句(表名及字段名大写)

    ORACLE建表时如果表名或者字段名存在大小写同时存在的情况下,默认为区分大小写,此时在select/updata等操作时需要在表名或者字段名上添加双引号,否则会报"视图不存在"的 ...

  9. 导入一个新项目需要注意的几大问题(jdk1.6+eclipse4.4+tomcat6)

    今天导项目犯了一个很低级的错误,浪费了半个小时,所以在此罗列出在导一个新的项目到eclipse中时需要注意的几个问题,希望对大家有所帮助. 将项目从svn或者github等项目版本控制软件上拷贝下来, ...

  10. HTTP协议篇(一):多工、数据流

    管道机制.多工 管道机制(Pipelining) HTTP 1.1 引入了管道机制(Pipelining),即客户端可通过同一个TCP连接同时发送多个请求.如果客户端需要请求两个资源,以前的做法是在同 ...