You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:18:13