热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Nginx构建防盗链、资源防盗服务(如CSDN积分下载服务)

前言大家都知道现在很多站点下载资料都是要收费的,无论是积分还是金币,想免费只能说很少很少了,那么这些网站是如何做到资源防盗链的呢

前言

大家都知道现在很多站点下载资料都是要收费的,无论是积分还是金币,想免费只能说很少很少了,那么这些网站是如何做到资源防盗链的呢?

这里推荐一款比较容易上手的神器,Nginx本身提供了secure_link来完成防盗链功能,可以给服务器文件链接添加时间戳和校验码,从而保护服务器文件不被任意下载盗用。

注:应用服务器后台进行扣除积分逻辑,大家可自行分析CSDN下载地址。


Nginx配置

如何安装Nginx这里不再赘述,安装的时候记得开启 ngxhttpsecurelinkmodule 即可。


./configure --with-http_secure_link_module


安装完成检测:


nginx  -V


如果出现以下说明配置成功:


configure arguments: --with-http_secure_link_module --prefix=/usr/local/nginx --with-http_stub_status_module



实例配置

server {listen       80;server_name  download.52itstyle.com;charset utf-8;location / {#这里配置了2个参数一个是md5,一个是expiressecure_link $arg_md5,$arg_expires;#md5的哈希格式为 secret+url+expires,expires为时间戳单位s,url为请求地址secure_link_md5 52itstyle$uri$arg_e;#这里我们的md5是我们按照secure_link_md5的方式计算的哈希,secure_link会比对它计算的哈希值是否与我们的md5参数一致if ($secure_link = "") {#资源不存在或哈希比对失败return 402;}if ($secure_link = "0") {#失效超时return 405;}#重命名文件名add_header Content-Disposition "attachment;filename=$arg_f";alias  /data/site/down.52itstyle.com/;}error_page   500 502 503 504  /50x.html;error_page   402 405 /40x.html;location = /50x.html {root   html;}location = /40x.html {root   html;}
}

参数详解

secure_link


语法 : secure_link expression;

默认值: 无

配置段:http, server, location


expression由校验值和过期时间组成,其中校验值将会与 securelinkmd5中的指定参数的MD5哈希值进行对比。

如果两个值不一致,$securelink变量的值是空;如果两个值一致,则进行过期检查;如果过期了,则$securelink变量值是0;如果没过期,则为1。

如果链接是有时效性的,那么过期时间用时间戳进行设置,在MD5哈希值后面声明,用逗号隔开。如果没有设置过期时间,该链接永久有效。

securelinkmd5


语法 : securelinkmd5 expression;

默认值: 无

配置段:http, server, location


expression指定计算md5哈希值的参数,该md5值将会和url中传递的md5值进行对比校验。

expression一般包含uri(如demo.com/s/link uri则为/s/link)以及加密 密钥secret

如该链接具有时效,则expression需包含$securelinkexpires,expression还可加入客户端信息,如访问IP,浏览器版本信息等。


Java后端配置(案例,仅供参考)

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
/**
* 生成加密連接
*/
public class SecureLink {private static String site = "https://down.52itstyle.com/";private static String secret = "52itstyle";public static String createLink(String path,String fileName){String time = String.valueOf((System.currentTimeMillis() / 1000) + 300); // 5分钟有效String md5 = Base64.encodeBase64URLSafeString(DigestUtils.md5(secret + path + time));String url = site + path + "?md5=" + md5 + "&expires=" + time + "&f="+fileName;return url;}public static void main(String[] args) {//https://down.52itstyle.com/2018101025689452.pdf?md5=FnDYyFzCooI9q8sh1Ffkxg&expires=1539847995&f=分布式秒杀架构.pdfSystem.out.println(createLink("2018101025689452.pdf","分布式秒杀架构.pdf"));}
}

总结

整个加密过程有点对称加密的意思,应用服务根据密钥生成加密地址,Nginx代{过}{滤}理服务器进行解密校验,如果通过则允许下载。

测试中还发现一个问题,生成的链接有时会报超时失效,可能是由于后端服务器和下载服务器时间不统一导致的,同步更下系统时间即可,

如果有做积分下载服务的小伙伴这的确是一个不错的选择,需要注意的是一定要不定期的更换密钥,防止泄露。

 

参考链接:

http://nginx.org/en/docs/http/ngx_http_secure_link_module.html;

https://www.52pojie.cn/thread-823778-1-14.html;


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
author-avatar
醉苏芳华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有