django后端修改url,解决图片防盗链

目前大部分文章关于防盗链绕过办法,都是设置参数,使其不携带referrer

<meta name="referrer" content="no-referrer" />

或者使用标签的referrerpolicy属性‌进行局部设置

<img src="http://example.com/image.jpg" referrerpolicy="no-referrer" />

或者通过在一个不可见的 iframe 或嵌入页面中加载图片来绕过 Referer 检查。然而,这种方法并不总是有效,因为有些网站会检查图片的加载上下文,以确保它不是被嵌入在一个不可见的元素中。

但是现在根据referrer来防盗图片都是进行主域名匹配。如果没有携带referrer一样不能请求到图片。所以上述办法基本上都不行了,那就只能使用最原始的办法了。
使用Python中request库携带正确referrer,模拟用户访问活动打开图片,获取到图片数据,然后再传给前端页面
前端代码方面不改动,只需要操作后台返回的数据,利用re批量将img标签src中加上服务器地址即可,使其变为从自己的服务器上获取图片

#改变图片地址
html_content=re.sub(r'<img src="(.*?)".*?>', r'<img src="/get_img/\1" />', html_content)
# 此时前端的页面中img标签就是,
<img src="/get_img/http://example.com/image.jpg" />

然后在后端增加一个接口,专门处理请求,下面给出django的参考代码

from django.urls import re_path
import mimetypes
from django.http import HttpResponse
import requests

session = requests.Session()


def get_img(request, fullpath, *args, **kwargs):
    print("\n\t解析 %s 图片啦\n" % fullpath)
    if "XXXX" in fullpath:
        # 根据原始地址中的特殊字符,来设置相应的请求头,
        session.headers = XXX_header
    session.headers["Connection"] = "keep-alive"

    # 获取图片二进制数据
    img_bit = session.get(fullpath).content
    # 根据图片链接,判断类型,构造返回数据
    content_type, encoding = mimetypes.guess_type(fullpath)
    content_type = content_type or "application/octet-stream"
    response = HttpResponse(img_bit, content_type=content_type)
    # 设置浏览器缓存时间
    response["Cache-Control"] = "public, max-age=31536000"  # 缓存1年

    if encoding:
        response.headers["Content-Encoding"] = encoding
    return response


urlpatterns = [
    # 获取图片的接口,有名分组,将匹配到的图片地址命名fullpath
    re_path("get_img/(?P<fullpath>http.*)", get_img),
]

以后浏览器显示图片时,就自动会向我们的服务器发送get请求,并在/get_img/后面携带图片地址了,此时服务器会根据携带地址去拿到图片数据,然后返回给浏览器,并缓存1年。
当然,你也可以将解析过图片保存,下次直接返回图片,减少二次访问原始网站的次数

posted @ 2024-12-20 22:47  喝茶看狗叫  阅读(9)  评论(0编辑  收藏  举报