zoukankan      html  css  js  c++  java
  • nginx 防盗链配置

    原文:https://www.cnblogs.com/imcati/p/11743922.html

    背景:防止第三方引用链接访问我们的图片,消耗服务器资源和网络流量,我们可以在服务器上做防盗链限制。

    实现防盗链的方式有两种:refer方式和签名方式。 

    refer方式实现防盗链

    工作模块:ngx_http_referer_module。

    作用变量:$invalid_referer,全局变量。

    配置域:server, location

    配置:

    复制代码

    server {
       listen 80;
       server_name www.imcati.com refer-test.imcati.com;
       root /usr/share/nginx/html;
       location ~*.(gif|jpg|jpeg|png|bmp|swf)$ {
            valid_referers none blocked www.imcati.com;
            if ($invalid_referer) {

            #rewrite ^/ http://www.youdomain.com/404.jpg;
                return 403;
               }
          }
       }

    valid_referers: 指定资源访问是通过以下几种方式为合法,即白名单。
    none:允许缺失的头部访问。
    blocked:允许referer没有对应值的请求。
    server_names:若referer站点域名与server_name中本机配的域名一样允许访问。

    复制代码

    访问refer-test.imcati.com/index.html测试:

    index.html

    复制代码
    <!DOCTYPE html>
    <html>
    <head>
    <title>test</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <p>image address:<a href="http://www.imcati.com/test.jpg">image</a></p>
    </body>
    </html>
    复制代码

    点击图片地址:

    可以把none去掉,防止别人通过右键另存图片地址,当然别人也可以通过伪造refer来进行访问。

    那么如何从根本上解决防盗链问题呢?

    我们可以通过签名方式实现。

    签名方式实现防盗链

    工作模块:第三方模块HttpAccessKeyModule。

    配置:

    复制代码
    server {
        listen       80;
        server_name  www.imcati.com refer-test.imcati.com;
        root /usr/share/nginx/html;
    
        location ~*.(gif|jpg|jpeg|png|bmp|swf)$ {
            accesskey on;
            accesskey_hashmethod md5;
            accesskey_arg "key";
            accesskey_signature "mypass$remote_addr";
        }
    }
    }
    复制代码

    accesskey on | off: 模块开关
    accesskey_hashmethod md5|sha—1: 签名加密方式
    accesskey_arg: GET参数名称
    accesskey_sign: 加密规则

    $sign = md5('mypass' . $_SERVICE['REMOTE_ADDR']);
    //img src=/test.png?key=<?=$sign?>

    扩展:

    secure_link 实现文件防盗链

    工作模块:http_secure_link_module 模块。

    配置段:location。

    配置:

    复制代码

    server {
      listen 80;
      server_name www.imcati.com;
      root /usr/share/nginx/html;

      location ~* .(rar|zip|7z|tar)?$ {
        #这里配置了2个参数一个是st,一个是e
        secure_link $arg_st,$arg_e;
        #st的哈希格式为自定义秘钥+url+e,e为时间戳单位s,url为请求地址
        secure_link_md5 key$uri$arg_e;
        if ( $secure_link = "" ) {
        #资源不存在或哈希比对失败
        return 403;
          }
       if ( $secure_link = "0" ) {
        #时间戳过期
        return 403;
          }
      }
    }

    复制代码

    secure_link : secure_link md5_hash [,expiration_time] 

    secure_link_md5 : secure_link_md5 secret_token_concatenated_with_protected_uri 

    Java生成防盗链地址(使用Apache commons-codec jar包)
    注意:进行md5运算时,视频名字前加斜杆 如:/link.zip

    public static void main(String[] args) {
    String time = String.valueOf(System.currentTimeMillis() / 1000 + Long.valueOf(600));// +600代表600秒后地址失效
    String md5 = Base64.encodeBase64URLSafeString(DigestUtils.md5("key" + "/link.zip" + time));
    return "http://127.0.0.1/link.zip?st=" + md5 + "?e=" + time;
    }

    最终请求url:http://127.0.0.1/link.zip?st=xxxxxxx?e=xxxxxx

  • 相关阅读:
    DOM2DOM3续
    总结 @ 在 C# 中的用法 (装载)
    ORACLE10G卸载过程
    .net中访问oracle数据库的几种方式(转载)
    试图运行项目时出错,无法启动调试。没有正确安装调试器。请运行安装程序安装或修复调试器
    设计模式 构造器
    设计模式 抽象工厂
    linq中日期格式转换或者比较,程序报错说不支持方法的解决办法
    bootstrap图标字体不出来问题的解决办法
    JavaScript对象属性访问的两种方式
  • 原文地址:https://www.cnblogs.com/lshan/p/15176444.html
Copyright © 2011-2022 走看看