为何VSCode扩展REST Client可绕过CORS规则访问我的Django API
CORS认知误区澄清
CORS 是浏览器同源策略下的安全限制机制,仅对运行在浏览器中的前端页面生效:
- 浏览器会主动在跨域请求时携带
Origin请求头,并且校验响应的CORS头是否符合规则,不符合就会抛出跨域错误拦截响应 - 非浏览器客户端(包括VSCode
REST Client、Postman、curl、爬虫脚本等)不会执行CORS校验逻辑,既不会主动限制请求发送,也不会校验响应头,所以可以直接拿到接口返回结果 - 你用
django-cors-headers配置的规则,完全没有拦截非浏览器请求的能力,它的作用只是告诉浏览器哪些跨域请求是合法的
实际接口防护方案
要限制这类非浏览器客户端的访问,需要用真正的服务端访问控制手段,常见方案如下:
- 身份认证校验
给所有接口增加身份认证逻辑,仅携带有效凭证的请求可以访问。Django生态下可以直接用djangorestframework的认证能力,示例配置:
配置后没有携带有效Token或者Session的请求,不管什么客户端都会直接返回401未授权错误。# settings.py REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] } - 请求频率限制
针对未认证的请求配置频率限制,避免接口被恶意爬取或攻击。可以用DRF自带的限流能力,或者django-ratelimit中间件实现:# settings.py REST_FRAMEWORK 配置补充 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', 'rest_framework.throttling.UserRateThrottle' ], 'DEFAULT_THROTTLE_RATES': { 'anon': '10/minute', 'user': '100/minute' } - 请求签名校验
如果接口仅给你自己控制的客户端调用,可以约定签名规则:客户端将请求参数、时间戳、双方约定的密钥拼接后做哈希生成签名,请求时携带签名和时间戳,服务端用相同规则生成签名比对,不匹配直接拒绝。这种方式即使对方拿到接口地址,没有密钥也无法生成合法签名。 - IP白名单限制
如果接口仅需要特定IP段访问,可以直接在Nginx层面配置IP白名单,或者写Django中间件校验请求IP,不在白名单的IP直接返回403禁止访问。
内容的提问来源于stack exchange,提问作者ggzz
相关产品推荐
相关产品推荐

