secure_link

作用:文件防盗链,传统下载方式存在容易被三方引用的问题,通过referer也并不能很好的解决,因为http客户端的header很容易篡改,通过secure_link模块可以很好的实现安全和控制下载链接生效周期

python生成下载链接

import hashlib
import base64
import time

secret_download_salt = 'LotusChing'
def generate_secret_link(url):
    expire_ts = int(time.time()+300)
    secure_link = "{}{} {}".format(expire_ts, url, secret_download_salt)
    hash = hashlib.md5(secure_link.encode('utf-8')).digest()
    md5_secret = base64.urlsafe_b64encode(hash).rstrip('='.encode('utf-8'))
    return '{}?md5={}&expires={}'.format(url, md5_secret.decode(), expire_ts)

server_name="www.download.com"
url = '/test.img'
secret_download_url = generate_secret_link(url)
print("Download url: {}".format("http://" + server_name + secret_download_url))

配置语法

server {
    listen         80;
        server_name    www.download.com;
        sendfile       on;
        root           /opt/app/download;

    location / {
        secure_link $arg_md5,$arg_expires;
        secure_link_md5 "$secure_link_expires$uri LotusChing";

        if ($secure_link = "") {
            return 403;
        }

        if ($secure_link = "0") {
            return 410;
        }
    }

}

校验失败返回403,url过期返回410

参考实例:某国外视频站

点击播放后,播放一小段广告,广告结束后,请求视频链接206部分请求,st应该就是哈希的值,e就是过期时间 http://1.1.1.1/MEF-ZWJDeQ5dXXU=.mp4?st=7gzY5qOC6zRiDjULCVwGDQ&e=1517882096"

这个站点除了以下几个安全手段

  • hash & expire
  • referrer
  • 单点下载,同一IP只允许并行下载一个视频
  • 下载限速

results matching ""

    No results matching ""