首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[ 403 ]石墨烯-django。不要使用csrf_exempt

[ 403 ]石墨烯-django。不要使用csrf_exempt
EN

Stack Overflow用户
提问于 2018-08-09 10:19:39
回答 4查看 3.5K关注 0票数 7

我用graphene-django。创建应用程序时,GraphiQL在登录和其他功能方面工作得很好。但是当我使用Insomnia时,我会得到一个403 Forbidden错误。

我参考了这个文档,https://github.com/howtographql/howtographql/blob/master/content/backend/graphql-python/4-authentication.md

我试过:

  1. 使用csrf_exempt;它工作得很好,但我当然不会使用它。
  2. 使用django-cors-headers;它使而不是工作得很好。

如何解决这个403错误?

EN

回答 4

Stack Overflow用户

发布于 2020-03-24 23:59:07

我不推荐@yestema的第二种方法来解决你面临的问题。

避免使用GET方法查询GraphQL端点

如果一个人想要实现这个解决方案,并且也在为mutations使用Graphql,那么它看起来就像是糟糕的设计。

GET请求不应更改服务器或数据库的状态,这已被确立为一种标准,大多数情况下,mutations用于更改某个或另一个状态(可能只有数据库,因为您的应用程序应该是无状态的)。

请注意,您也可以使用query方法来更改后端的状态,但是,同样,这将违背既定的标准,正如笔墨文档中所解释的那样。

..。在REST中,任何请求最终都可能对服务器造成一些副作用,但按照惯例,不使用GET请求来修改数据。GraphQL类似--从技术上讲,任何查询都可以实现以导致数据写入。但是,建立一种约定是有用的,即任何导致写入的操作都应该通过突变显式地发送。

什么时候使用csrf_exempt装饰器是安全的?

为了给那些想知道摆脱默认CSRF支票有多糟糕的人提供提示,这里是我的两分解释。

当浏览器自动发送身份验证参数时,服务将暴露于CSRF攻击,默认的Django基于会话的身份验证系统就是这种情况。

如果只将Django应用程序用作API后端,则很可能依赖另一种身份验证机制,如DRF's TokenAuthentication或某种JWT实现

基本上,这些身份验证系统不受CSRF攻击的影响,因为如果恶意网站希望代表您的用户访问您的服务器--这就是CSRF的全部内容--它将无法设置服务器所期望的- HTTP报头来实际验证请求(前提是您安全地将令牌存储在只能由您的前端应用程序域访问的cookie中.)。

tl;博士

继续使用GraphQL请求发送POST查询,这是最佳实践。

如果您的GraphQL端点只能由经过身份验证的用户访问,并且您的身份验证系统不依赖Django的会话,那么可以免除端点对CSRF的检查。

但是,如果您使用Django的默认身份验证系统csrf verification. --即存储在cookie中的sessionid,则必须在此时强制执行sessionid,您唯一的机会是,正如前面的答案所述,在您的HTTP请求中添加X-CSRFToken头,并将以前的请求自动设置的csrftoken cookie的值赋给服务器。

我最初在GitHub上发布了这个答案,但在这里我认为它也是有用的。

票数 5
EN

Stack Overflow用户

发布于 2020-05-10 00:07:58

您要寻找的是csrf_exempt在您的url(r'^graphql', csrf_exempt(GraphQLView.as_view(graphiql=True))),

您可以像这样导入它:from django.views.decorators.csrf import csrf_exempt

GraphQL端点不需要csrf令牌,因为它是一个API。

默认情况下,CSRF令牌在生产中是必需的,因为django不知道哪个POST请求是表单的,哪个不是。另外,CSRF在您只想在您的网站上使用GraphQL端点的情况下可能很有用(因此拥有令牌是一种额外的安全措施)。但是对于您来说,在生产中删除CSRF令牌检查是完全可以的。

票数 4
EN

Stack Overflow用户

发布于 2019-07-17 08:53:55

Var。1)设置头X-CSRFToken (也可以尝试X-CSRFTOKENcsrftoken)

Var。( 2)不是很正确的解决办法,但它很容易&它有效!使用GET请求而不是POST的。不知怎么起作用了..。

Var。3) 也没有为我工作,也不工作。您可以尝试正确的方式添加到Cookie automaticly ( a)单击Cookie TAB (管理Cookie按钮c)动作->添加cookie P.S。实际上,失眠自动注入csrftoken,您可以尝试通常的REST,您会发现,它工作正常,并且有自动增加失眠的csrftoken .

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51764452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档