1、背景

我们可以通过fastdfs实现一个分布式文件系统,如果我们的fastdfs部署在外网,那么任何一个人知道了我们的上传接口,那么它就可以文件的上传和访问。那么我们如何阻止他人访问我们fastdfs服务器上的文件呢?此处就需要使用fastdfs的防盗链功能。

2、实现原理

fastdfs的防盗链是通过token机制来实现的。当我们开启防盗链功能后,需要在url后增加2个额外的参数tokentstokents的生成都是需要在服务端。

2.1 开启防盗链

vim /etc/fdfs/http.conf

# true 表示开启防盗链
http.anti_steal.check_token = true
# token的过期时间,单位为秒
http.anti_steal.token_ttl = 60
# 密钥,不可泄漏,用于生成token
http.anti_steal.secret_key = thisisasecuritykey
# 当图片拒绝访问后,显示的图片,此图片需要可访问,不然可能会出现问题
http.anti_steal.token_check_fail = /data/fastdfs/401.jpg

http.anti_steal.token_check_fail 指定的图片需要可访问,否则可能会出现问题

2.2 重启 nginx

/usr/local/nginx/sbin/nginx -s reload

2.3 Java代码生成token

1、token生成规则

token = md5(文件ID+私钥+时间戳)

文件ID:不能包含group

group1/M00/00/00/wKh5iWNBl7-AKvj1AAAwWD4VeAg577.jpg
`需要替换成`
M00/00/00/wKh5iWNBl7-AKvj1AAAwWD4VeAg577.jpg

私钥:需要和 /etc/fdfs/http.conf 中的 http.anti_steal.secret_key 值一致

时间戳:单位秒

2、java生成token

/**
* 生成token
*
* @param fileId the filename return by FastDFS server,不能含有组
* @param timestampSecond 时间戳 单位秒
* @return token
* @throws NoSuchAlgorithmException
*/
private String generatorToken(String fileId, Long timestampSecond) throws NoSuchAlgorithmException {
// 需要去掉 group
fileId = fileId.substring(fileId.indexOf("/") + 1);
byte[] bsFilename = fileId.getBytes(StandardCharsets.UTF_8);
byte[] bsTimestamp = timestampSecond.toString().getBytes(StandardCharsets.UTF_8);
// thisisasecuritykey 需要和 /etc/fdfs/http.conf 中的 http.anti_steal.secret_key 值一致
byte[] bsKey = "thisisasecuritykey".getBytes(StandardCharsets.UTF_8); byte[] buff = new byte[bsFilename.length + bsKey.length + bsTimestamp.length];
System.arraycopy(bsFilename, 0, buff, 0, bsFilename.length);
System.arraycopy(bsKey, 0, buff, bsFilename.length, bsKey.length);
System.arraycopy(bsTimestamp, 0, buff, bsFilename.length + bsKey.length, bsTimestamp.length); return md5(buff);
} public static String md5(byte[] source) throws NoSuchAlgorithmException {
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
md.update(source);
byte tmp[] = md.digest();
char str[] = new char[32];
int k = 0;
for (int i = 0; i < 16; i++) {
str[k++] = hexDigits[tmp[i] >>> 4 & 0xf];
str[k++] = hexDigits[tmp[i] & 0xf];
} return new String(str);
}

3、测试

3.1 带正确token访问

3.2 带错误token访问

这个地方返回的图片是 http.anti_steal.token_check_fail = /data/fastdfs/401.jpg 这个配置中配置的图片。

4、项目代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-fastdfs

5、参考链接

  1. 使用FastDFS的内置防盗链功能官方文章 http://bbs.chinaunix.net/thread-1916999-1-1.html
  2. fastdfs faq http://bbs.chinaunix.net/thread-1920470-1-1.html

实现fastdfs防盗链功能的更多相关文章

  1. ASP.net UrlRewrite的防盗链功能

    ASP.net中如何实现基于UrlRewrite的防盗链. ASP.net中最快实现UrlRewrite的方法这篇文章中说了如何做UrlRewrite,那只是一个最简单的应用 其实利用UrlRewri ...

  2. FastDFS防盗链

    FastDFS扩展模块内置了通过token来实现防盗链的功能.开启防盗链后,访问文件是需要在url中加两个参数:token和ts.ts为时间戳,token为系统根据时间戳和密码生成的信物.为了系统的安 ...

  3. nginx——防盗链功能

    我们经常会看到在浏览某一图片时会弹出一“403权限禁止”错误,这说明有可能正在浏览的这个网站用到的图片在盗用别的网站图片,而被盗用的网站采用了防盗链技术.那么怎样才能不让自己的网站受害呢? 下面我来介 ...

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

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

  5. 关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)

    以数据库后台驱动的动态内容的网站,经常会遇到这些的问题: 当在浏览器的地址栏输入一个无效的参数时,会出现数据库的错误提示,这是一个安全的隐患 搜索引擎无法收录你的所有网页 网页的链接地址是一系列的参数 ...

  6. 如何利用jsp实现防盗链功能

    index.jsp ----------------------------- Place your content here here is index jsp get header info a. ...

  7. Nginx缓存功能、防盗链、URL重写

    nginx做为反向代理时,能够将来自upstream的响应缓存至本地,并在后续的客户端请求同样内容时直接从本地构造响应报文. nginx的缓存数据结构: 共享内存:存储键和缓存对象元数据 磁盘空间:存 ...

  8. nginx跨域、防盗链、压缩等小功能详解

    原文链接:http://www.studyshare.cn/software/details/1173/0 一.跨域 跨域由来,是因为W3C组织制定的浏览器安全规范,不允许一个域名内的网站在没有别的域 ...

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

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

随机推荐

  1. 技术分享 | ARM下中标麒麟系统ky10使用Xtrabackup-8.0.25

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 一.需求背景 查询Percona官方手册,Xtrabackup 8.0可以备份M ...

  2. 常见docker命令(二)-容器生命周期相关

    docker run 命令主要参数-d 后台运行,返回容器id-i 以交互模式运行,通常与-t连用-t 为容器重新分配一个伪输入终端,通常与-i连用-P(大写) 随机端口映射,容器内部端口随机映射到主 ...

  3. thinkphp 5 及一下或php项目里实现模糊查询

    想在thinkPHP或者PHP项目实现模糊查询怎么实现呢? 今天在网上搜了一下用 mysql里的 like 就可以实现 怎么用呢? 看代码: 错误用法: where('title','like',$s ...

  4. kubernetes之Endpoint引入外部资源实践;

    1. 什么是Endpoint? 我们创建Service的时候会自动给我们创建一个同名的Endpoint资源,每一个同名的 Servie都有一个Endpoints资源,因为Service自己并不直接匹配 ...

  5. RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  6. Python小游戏——外星人入侵(保姆级教程)第一章 05重构模块game_functions

    系列文章目录 第一章:武装飞船 05:重构:模块game_functions 一.重构 在大型项目中,经常需要在添加新代码前重构既有代码.重构旨在简化既有代码的结构,使其更容易扩展.在本节中,我们将创 ...

  7. java中String使用+

    String str1 = "hello"; String str2 = "hel" + new String("lo"); String ...

  8. 漂亮简洁的PHP导航源码-蘑菇导航

    蘑菇导航 蘑菇导航是根据SimpleWebNavigation修改而来的一个php网址导航.支持php8,支持左侧锚点,支持自定义fontawesome图标. 可以作为群组导航.图床导航.vps导航等 ...

  9. PostgreSQL 大对象导出报错问题分析

    1.前言 在处理用户问题过程遇到一个问题.用户通过pg_dump导出 bytea 对象时,当行的大小超过 1G时,会报错: [v8r6c5b41@dbhost01 ~]$ sys_dump -t t1 ...

  10. KingbaseES R6 集群repmgr.conf参数'recovery'测试案例(三)

    案例三:测试'recovery = manual' 1.查看集群节点状态信息: [kingbase@node1 bin]$ ./repmgr cluster show ID | Name | Role ...