Django与React API安全:如何验证Token与请求中UserID的一致性?
问题解决与安全说明
一、修复Django端的用户数据权限验证
你的核心问题在于依赖URL中的userid参数过滤数据,而这个参数完全可以被篡改。正确的做法是通过JWT认证后的request.user获取当前用户,以此作为过滤依据,步骤如下:
1. 确保模型关联正确
首先确认Mutatie模型与Django内置的User模型有外键关联(如果还没设置):
from django.contrib.auth.models import User class Mutatie(models.Model): # 用外键关联到用户模型,替换原来的userid字段 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="mutaties") # 其他业务字段...
2. 修改ViewSet的get_queryset方法
不再从URL参数中取userid,而是直接从当前认证用户对象过滤:
class MutatieView(viewsets.ModelViewSet): authentication_classes = (JWTAuthentication,) permission_classes = (IsAuthenticated,) serializer_class = MutatieSerializer queryset = Mutatie.objects.all() def get_queryset(self): # 仅返回当前认证用户的Mutatie数据 return self.queryset.filter(user=self.request.user)
3. 调整路由配置
URL中不再需要userid参数,修改路由为:
# urls.py from django.urls import path from rest_framework.routers import DefaultRouter from .views import MutatieView router = DefaultRouter() router.register(r'mutaties', MutatieView) urlpatterns = [ # 其他路由... *router.urls, ]
这样无论前端请求中传什么userid,服务器只会返回当前Token对应的用户数据,彻底避免篡改URL参数导致的越权问题。
二、其他请求篡改方式及跨域限制的局限性
常见的请求篡改方式
除了前端代码篡改,还有这些方式可以伪造请求:
- API调试工具:用Postman、curl、Insomnia等工具直接构造请求,只要拿到有效的Token,就能任意修改请求参数、URL或请求体。
- 浏览器开发者工具:在Chrome/Firefox的控制台或Sources面板中,直接修改前端请求逻辑,篡改请求目标或参数。
- 抓包工具:用Charles、Fiddler、Wireshark等拦截HTTP/HTTPS请求,修改请求内容后再转发给服务器。
- XSS攻击:如果网站存在跨站脚本漏洞,攻击者可以窃取用户的Token,然后用该Token发起任意请求。
跨域限制(CORS)能否被伪造?
CORS是浏览器层面的安全限制,服务器本身不会主动验证请求的来源:
- 非浏览器环境(如Postman、后端脚本)完全不受CORS限制,可以直接发送跨域请求。
- 即使在浏览器中,攻击者也可以通过伪造
Origin或Referer头(部分场景下)绕过简单的来源检查;或者利用代理服务器将请求伪装成允许的域名。 - CORS的作用是防止恶意网站在用户浏览器中发起跨域请求窃取数据,但无法阻止服务器端或非浏览器环境的请求伪造。
内容的提问来源于stack exchange,提问作者ML Rozendale
相关产品推荐
相关产品推荐

