在Django Rest Framework中如何获取用户请求来源URL?
在Django Rest Framework中安全获取请求来源URL
前端主动传递URL的方式确实存在被篡改的风险,后端可以通过读取请求头字段来获取来源信息,以下是具体实现方案:
1. 读取HTTP_REFERER请求头
这个请求头会记录发起当前请求的页面完整URL,直接通过Django的request对象即可获取:
from rest_framework.views import APIView from rest_framework.response import Response class PostsAPIView(APIView): def get(self, request): # 获取来源URL,为空时返回None referer_url = request.META.get('HTTP_REFERER') # 后续业务逻辑 return Response({'source_url': referer_url})
注意:HTTP_REFERER可能为空(比如用户直接访问API地址、浏览器禁用该字段或代理拦截),所以必须做空值判断。
2. 跨域场景用HTTP_ORIGIN请求头
如果是跨域请求,浏览器会发送Origin头,它仅包含协议、域名和端口(不包含具体路径),适合验证来源域名:
class PostsAPIView(APIView): def get(self, request): origin_url = request.META.get('HTTP_ORIGIN') return Response({'origin_url': origin_url})
安全性增强方案
请求头仍存在被伪造的可能,若需严格验证来源合法性,可结合域名白名单:
# 提前配置允许的前端域名列表 ALLOWED_ORIGINS = ['https://your-official-frontend.com', 'http://localhost:3000'] class PostsAPIView(APIView): def get(self, request): origin = request.META.get('HTTP_ORIGIN') or request.META.get('HTTP_REFERER') # 提取域名部分(适配Referer的完整URL格式) if origin: from urllib.parse import urlparse parsed_origin = urlparse(origin).netloc allowed_netlocs = [urlparse(allowed).netloc for allowed in ALLOWED_ORIGINS] if parsed_origin not in allowed_netlocs: return Response({'error': '非法来源'}, status=403) # 合法来源,执行后续逻辑 return Response({'source_info': origin})
内容的提问来源于stack exchange,提问作者Yusuf Mayowa
相关产品推荐
相关产品推荐

