吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2782|回复: 5
收起左侧

[其他原创] 时间戳防盗链(七牛云 oss 为例)的实现过程

[复制链接]
thepoy 发表于 2021-5-12 11:22

每个对象存储服务商都会提供时间戳防盗链的支持,原理基本一样,本文以七牛云为例,服务端是用 Go 实现的 API。

生成签名的 url 的时候,也要将新生成的 url 保存到 redis 中,防止每次访问都生成新的签名,即浪费服务器资源,又会增加 CDN 流量。

签名代码:

// Sign 每一个图片生成 2 分钟有效期的签名
//
// imgPath 是图片路径,不是完整链接。
func Sign(imgPath string) (string, error) {
    var (
    // 七牛云设置的签名的 Key
        key = "xxxxxxxxxx"

    // 过期时间
        expire = time.Now().Unix() + 60*2
    )

    rawStr := fmt.Sprintf("%s/%s%x", key, imgPath, expire)

    hash := md5.New()
    hash.Write([]byte(rawStr))

    sign := fmt.Sprintf("%x", hash.Sum(nil))

    var newPath string

    newPath = fmt.Sprintf("%s?sign=%s&t=%x", imgPath, sign, expire)

    // 生成签名后放进 redis 中,过期时间比签名过期时间短 1 秒,下次再访问时先从 redis 中查找签名过的链接
    err := redis.CacheSignedURL(imgPath, newPath, 60*2-1)
    if err != nil {
        return "", err
    }

    return newPath, nil
}

如果下次访问时没有从 redis 中获取到签名的 url ,再生成新的签名,伪码:

func GetSignedURL(url string) string {
  cache := redis.GetCacheSignedURL(url)
  if cache != "" {
    return cache
  }
  return Sign(url)
}

这样的好处就是在有效期内服务端返回的图片链接不会改变,浏览器就能够缓存有效期内的图片。

当过有效期时,服务端返回新的签名链接,浏览器就会向七牛 CDN 发出新的请求,进行新一轮的有效期内缓存。

前端从响应 json 中拿到的签名链接渲染页面。


有效期内会在浏览器中缓存:

截屏2021-05-12 10.56.12

过了有效期就返回 403:

截屏2021-05-12 10.57.49

免费评分

参与人数 1热心值 +1 收起 理由
墨诩 + 1 已经处理,感谢您对吾爱破解论坛的支持!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

墨诩 发表于 2021-5-12 11:29
和自动缓存图片有什么区别,小白比较好奇
头像被屏蔽
First丶云心 发表于 2021-5-12 12:25
加奈绘 发表于 2021-5-12 12:44
wuoo563 发表于 2021-5-12 12:59
谢谢分享,学习
 楼主| thepoy 发表于 2021-5-12 14:39
墨诩 发表于 2021-5-12 11:29
和自动缓存图片有什么区别,小白比较好奇

中小型网站的服务器通常是流量计费,自己网站使用一些图片、js、css等静态资源不会产生多高的流量费,但可能会被一些别有用心人利用这些静态资源,从而产生一些超出预计的流量费。为了避免这种现象,就需要为这些静态资源做防盗链处理,本文的时间戳加密就是防盗链技术的一种,能够给每个链接设置一定的时效性,这样一来,当有人想做一些坏事时,只要过了这个有效期,链接就失效了,之后资源就不能访问,也就不会产生太多的额外流量。一些没做过防盗链处理的网站,每个月可能会有超出预计几千到上万的额外流量费。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表