flask static 如何做到防盗链?

最近,自己迷上了 SRS 这个国人做的流媒体服务器软件,直播的推流功能已经搞定,现在有一个问题,那就是在直播的时候,用 ffmpeg 把视频也录制了,同时放在是 static 的静态文件夹里,以方便大家能够在直播之后观看到相关视频。

关于视频播放的技术,我使用的是简单的 html5 内加载视频的方法,那么问题来了,如何防盗链?我的思路是在 flask 的 static 静态文件夹上想办法??

有没有其它的思路呢?

如果没有?在 static 静态文件夹上动手的方法有吗?

阅读 4.8k
4 个回答

static 也走视图, 然后根据 referer 跟踪来源就好办了. 图片的是这样处理的, 如果发现是盗链会返回假图, 视频应该可以类似, 思路大致是:

from flask import app
from flask import request

@app.route("/static/<filepath>", methods=['GET'])
def download_file(filepath):
    # 此处的filepath是文件的路径,但是文件必须存储在static文件夹下
    if request.referrer != "xxxx":
        return app.send_static_file("default")
    return app.send_static_file(filepath)      # 或者send_file

防盗链的原理就是根据请求头中的referer来判断的。
如果请求来源地址不在白名单中就响应错误。

ps:referer头是浏览器自动加入的。

建议直接用CDN,自带防盗链功能。你自己要实现的话比较复杂。简单粗暴的就是加上referer头判断,这个在apache/nginx这个级别就可以做,但是http header可以被伪造,因此如果你期望彻底防止爬虫或者盗链的话,这种方式就不那么可靠了。

建议你把视频文件放到云存储上,比如阿里云的OSS或者七牛的存储,他们已经有现成的防盗链方案了,直接用他们的方案就行了。

印象中(很久没用flask,可能记错了),对static文件夹的访问其实也是走视图函数的(内置的,在启动时自动加入到endpoint),你可以翻翻文档看怎么改访问静态文件的的视图函数

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题