fastdfs实现防盗链功能

简介: fastdfs实现防盗链功能



一、实现原理

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

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

二、开启防盗链

vi /etc/fdfs/http.conf

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

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

三、重启nginx

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

四、 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);
    }

五、测试

1 带正确token访问

2 带错误token访问,或直接访问

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

大功告成!!噢耶!

参考:FastDFS FAQ (欢迎反馈,我将及时整理) - 分布式文件系统(FastDFS)-Chinaunix

目录
相关文章
|
应用服务中间件 nginx
nginx防盗链功能
nginx防盗链功能
|
应用服务中间件 nginx
Nginx防盗链配置
Nginx防盗链配置
|
存储 负载均衡 网络协议
|
缓存 应用服务中间件 PHP
Ngnix服务优化与防盗链(下)
Ngnix优化主要有两种,一种是配置上的优化,一种是内核上的优化。 本文将介绍Ngnix在配置方面的优化。 实验准备: 已安装好一台Nginx服务器,IP:172.16.10.101,域名:www.tt.com。
171 0
|
缓存 监控 网络协议
Ngnix服务优化与防盗链(上)
Ngnix优化主要有两种,一种是配置上的优化,一种是内核上的优化。 本文将介绍Ngnix在配置方面的优化。 实验准备: 已安装好一台Nginx服务器,IP:172.16.10.101,域名:www.tt.com。
149 0
|
应用服务中间件 Linux Apache
【防盗链】Nginx与Apache 防盗链教程
一、为什么要用防盗链? 什么是盗链? 一般情况下,别的网站如果直接链接虚拟主机中的网页,是可以提高网站的知名度与访问量,是受到ICP内容提供商或站长的欢迎的,但是,如果别的网站是偷偷直接链接您的网站中的音乐、电影、图片、zip文件及其它下载类资源,让网民免费看你的电影,不但不会提高您网站的知名度,还会让您的网站中产生大量没有意义的流量,如果一台服务器中存在大量这种盗链情况,服务器的速度就会下降。     从ICP内容提供商或站长的角度来看,辛辛苦苦做出来的内容,被别人偷偷使用,肯定心中不好受,显然,这种盗链是侵犯知识产权的行为。对于收费的下载类网站,这意味着有人可以不付费就享受您的服务!更严重
|
缓存 网络协议 应用服务中间件
Nginx的优化与防盗链(二)
1、隐藏版本号 2、修改用户与组 3、缓存时间 4、日志切割 5、连接超时 6、更改进程数 7、配置网页压缩 8、配置防盗链 9、fpm参数优化
Nginx的优化与防盗链(二)
|
缓存 应用服务中间件 Linux
Nginx的优化与防盗链(一)
1、隐藏版本号 2、修改用户与组 3、缓存时间 4、日志切割 5、连接超时 6、更改进程数 7、配置网页压缩 8、配置防盗链 9、fpm参数优化
Nginx的优化与防盗链(一)
|
应用服务中间件 数据安全/隐私保护 nginx
Nginx 实现图片或文件的防盗链
一:一般的防盗链如下: location ~* \.(gif|jpg|png|swf|flv)$ {    valid_referers none blocked www.
1333 0
|
应用服务中间件 nginx 网络安全
下一篇
DataWorks