Django Rest Framework中模拟CSRF攻击遇阻及相关疑问
关于CSRF攻击场景构建的问题
环境与配置
- 本地部署两个Django应用,分别通过
localhost:8000(目标应用)和127.0.0.1:5000(恶意站点)访问,二者不共享Cookie。 - 目标应用API视图
ModifyDB(仅允许已认证用户访问):
class ModifyDB(APIView): def post(self,request,format=None): if request.user.is_authenticated: return Response({'db modified'}) else: return Response({'you need to be authenticated'})
- 恶意站点触发攻击的axios请求代码:
const Modify = () => { const onClick = async e => { e.preventDefault(); const instance = axios.create({ withCredentials: true, baseURL: 'http://localhost:8000', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', } }) const res = await instance.post('/api/modifydb'); return res.data } return ( <button class = 'btn' onClick = {onClick}> send request </button> ) }
- 目标应用认证相关配置:
- REST框架认证类配置:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'my_proj.settings.CsrfExemptSessionAuthentication', ], }- 自定义关闭CSRF防护的认证类:
class CsrfExemptSessionAuthentication(SessionAuthentication): def enforce_csrf(self, request): return- 已禁用
django.middleware.csrf.CsrfViewMiddleware,且CORS_ALLOW_ALL_ORIGINS和CORS_ALLOW_CREDENTIALS均设为true。
核心问题
登录目标站点后,恶意站点的axios请求返回“you need to be authenticated”响应,预期应携带sessionid Cookie并请求成功,请问问题出在哪里?
更新尝试
用表单请求替代axios请求:
<form action="http://localhost:8000/api/modifydb" method="POST"> <input type="submit" value="make a malicious request"/> </form>
添加SESSION_COOKIE_SAMESITE = None配置后,表单请求成功,但原axios请求仍失败。
后续疑问
- 表单提交的POST请求和axios发起的POST请求,在Cookie附加逻辑上有什么差异?
- 启用
SESSION_COOKIE_SAMESITE配置能否完全阻止这类CSRF攻击?
内容的提问来源于stack exchange,提问作者Leonid
相关产品推荐
相关产品推荐

