zoukankan      html  css  js  c++  java
  • 防盗链的原理以及实现

    大家在访问网站的时候,经常会看到图片展示不出来的时候,如下图

    大家有没有想过这是为什么嘛?其实这是一种简单的防盗链的处理,那么盗链是什么呢?为什么需要防呢?咱们今天来一起揭开它神秘的面纱。

    盗链的概念

    盗链是指在自己的页面上展示一些并不在自己服务器上的一些内容, 获取别人的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。 一般被盗链的都是图片、 音乐、视频、软件等资源。通过盗链的手段可以减轻自己服务器的负担

    比如我直接在自己的网站上

    <img src="http:www.baidu.com/imagepath/image.png">
    

    这样就可以直接展示百度的图片,但是实际上是无法展示的(如下图),之所以无法展示是因为百度的图片做过防盗链处理

    防盗链的工作原理

    通过Refer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以追踪到显示他的网页地址 一旦检测到来源不是本站,即进行阻止或者返回指定的页面

    防盗链的实现方法

    Nginx模块,
    ngx_http_referer_module用于阻挡来源非法域名的请求 nginx指令valid_refers,全局变量$invalid_refer
    对资源的防盗链nginx配置为

    location ~.*.(gif|jpg|png|flv|swf|rar|zip)$
    {
        valid_referers none blocked test.com *.test.com;   //加none的目的是确保浏览器可以直接访问资源
        if($invalid_referer)
        {
            #return 403;  // 直接返回403
            rewrite ^/ http://www.test.com/403.jpg;//返回指定提示图片
        }
    }
    

    对目录的防盗链nginx配置为

    location /images/
    {
        valid_referers none blocked test.com *.test.com;
        if($invalid_referer)
        {
            #return 403;
            rewrite ^/ http://www.test.com/403.jpg;
        }
    

    但是传统的防盗链也会存在一些问题,因为refer是可以伪造的, 所以可以使用加密签名的方式来解决这个问题。 什么是加密签名?就是当我们请求一个图片的时候,我要给他带一些签名过去,然后返回图片的时候我们判断下签名是否正确,相当于对一个暗号。

    可以使用第三方模块HttpAccessKeyModule来解决防盗链的问题,我们需要去安装。

    安装好有这样一个指令:

    accesskey on|off 模块开关

    accesskey_hashmethod md5 | sha-1 签名加密方式

    accesskey_arg GET参数名称

    accesskey_signature 加密规则

    location ~.*.(gif|jpg|png|flv|swf|rar|zip)$
    {
        accesskey on;
        accesskey_hashmethod md5;
        accesskey_arg sign;
        accesskey_signature "mypass$remote_addr";
    }
    

    意思是mypass加客户端ip通过md5加密 图片文件代码:

    <?php
    $sign = md5('mypass' . $_SERVER['REMOTE_ADDR']);
    echo '<img src="./photo.jpg?sign='. $sign .'">';
    ?>
    

    以上就是防盗链的两种形式,欢迎伙伴们进行讨论留言。

  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/xuehao/p/14622091.html
Copyright © 2011-2022 走看看