- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我真的被困住了。这就是我想要做的。
本地一切正常。一旦将其投入生产,我就开始收到 CSRF 错误。以下是一切的运作方式。
我看到了所有的答案,从关闭 CSRF 到允许所有的一切。我想正确地做这件事,而不是关闭所有东西然后打开所有东西,然后以安全漏洞告终。
所以,这就是我所拥有的。
已安装:django-cors-标题django-rest-框架drf-嵌套路由器...和其他
我的 api 在 api.websitename.com 上运行,Vue.js 应用程序在 websitename.com 上运行。
GET 请求非常有效。OPTION 请求似乎有效。
任何有风险的请求都不行。
对于我的 CORS,我在其他 MIDDLEWARE
之前安装了 'corsheaders.middleware.CorsMiddleware',
。
那么我的 CORS 设置是:
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'*.websitename.com',
)
我的 CSRF 设置是:
CSRF_TRUSTED_ORIGINS = [
"api.websitename.com",
]
无论我怎么玩这些,我最终都会遇到 CSRF token 错误。
我已经尝试在我的 Vue App.vue 文件中执行类似的操作:
mounted () {
this.getCSRFToken()
},
methods: {
getCSRFToken () {
return axios.get('token/').then(response => {
axios.defaults.headers.common['x-csrftoken'] = Cookies.get('csrftoken')
}).catch(error => {
return Promise.reject(error.response.data)
})
}
}
我的想法是,一旦应用程序加载到浏览器中,我就会获得一个 CSRF token 。但即便如此,当应用程序尝试执行除 GET 或 OPTION 之外的任何操作时,我仍会收到失败的 CSRF token 错误。
这是返回 token 的 View ,以防您好奇:
class CSRFTokenView(APIView):
permission_classes = (permissions.AllowAny,)
@method_decorator(ensure_csrf_cookie)
def get(self, request):
return HttpResponse()
我意识到我可能会在这里混淆问题,但欢迎任何可以帮助我解决问题的建议。
最佳答案
首先你要使用SessionAuthentication :
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
)
}
这将强制执行 CSRF,匿名用户除外(稍后会详细介绍)。对于浏览器前端,最简单的解决方案是让(浏览器)前端和后端都在同一个域下——这可以让你避免 CORS——正如上面评论所建议的那样。如果您有其他客户端,则只需使用 token (DRF token 或 JWT)——但由于存在 XSS 攻击的危险,这些对于浏览器的使用并不安全(将 token 存储在 localStorage 中本质上是不安全的)。
由于您使用的是 axios,因此 CSRF 设置非常简单:
import axios from 'axios'
axios.defaults.xsrfHeaderName = 'X-CSRFToken'
axios.defaults.xsrfCookieName = 'csrftoken'
因此,您应该在强制执行 CSRF 的情况下进行安全 session 。几乎。引用上面的链接页面:
Warning: Always use Django's standard login view when creating login pages. This will ensure your login views are properly protected.
CSRF validation in REST framework works slightly differently to standard Django due to the need to support both session and non-session based authentication to the same views. This means that only authenticated requests require CSRF tokens, and anonymous requests may be sent without CSRF tokens. This behaviour is not suitable for login views, which should always have CSRF validation applied.
这很棘手 - 您要么只使用 Django 服务器端 View ,这会使您的 SPA 设计稍微复杂一些,要么在 DRF 中重新创建登录和其他身份验证 View ,但要注意使用 @csrf_protect方法装饰器在这些“匿名” View 上强制执行 CSRF。显然,这样的 View 会破坏使用 token 的客户端,因此您可能希望为这些使用不同的端点(可能重新使用相同的基类)。因此,您的浏览器登录使用 /auth/browser/login/ 和您的移动登录 /auth/mobile/login/,前者使用 @csrf_protect 包裹>.
在研究了 contrib auth 源代码之后,应该仔细地从头开始重新创建登录和其他 auth View ;对于 Vanilla 要求,我会推荐预先存在的解决方案,如 django-rest-auth和 django-all-auth .然而,django-rest-auth 包并不是为浏览器前端设计的,它强制使用 token 生成,而且您需要如上所述包装 View 。另一方面,all-auth 为 JS 客户端提供 AJAX 响应,可能是更好的选择。
关于django - 让 Django、VUE、CORS 和 CSRF 与真实世界的例子一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822736/
我尝试访问此 API click here for more info POST https://api.line.me/v2/oauth/accessToken 但总是得到错误: XMLHttpRe
我在掌握 CORS 概念时遇到问题... 我认为同源策略保护应用程序不会对“不受信任的域”进行 ajax 调用。所以, mydomain.com 向 发出 ajax 调用somedomain.com
一个技术性很强的问题,可能只有了解浏览器内部结构的人才能回答...... 浏览器缓存 CORS 预检响应的准确程度如何(假设在对 OPTIONS 预检请求的响应中返回了 Access-Control-
我一直在阅读 CORS以及它是如何工作的,但我发现很多事情令人困惑。例如,有很多关于事情的细节,比如 User Joe is using browser BrowserX to get data fr
在 OWASP site 上看到这个矛盾,我感到很困惑。 CORS 备忘单: 使用 Access-Control-Allow-Credentials: true 响应 header 时要特别小心。将允
我们无法在飞行前恢复使用 cors:任何帮助都非常感谢 ==========错误========================== About to connect() to localhost p
跨域请求字体文件时,您必须确保允许请求域使用 CORS header 访问字体文件: 访问控制允许来源 访问控制允许凭据 然而,这在请求图像时不是必需的,无论是对于 img元素或 background
CORS 规范没有说明服务器应如何响应无效的 CORS 请求。例如,如果请求 Origin 无效,则 CORS spec states :“终止这组步骤。请求超出了本规范的范围。”其他错误情况也有类似
我在理解同源策略和“解决”它的不同方法时遇到了一些麻烦。 很明显,同源策略是作为一种安全措施而存在的,因此来自服务器/域的一个脚本无法访问来自另一个服务器/域的数据。 也很明显,有时能够打破此规则很有
我正在尝试使用 cloudformation 在 API Gateway 中部署 API。这些方法需要启用 CORS,我遵循此处的模板 Enable CORS for API Gateway in C
我正在构建一个使用 CORS 的 REST 应用程序。每个 REST 调用都是不同的,我发现获取预检 OPTIONS 调用会产生很大的开销。有没有办法缓存并应用预检选项结果,以便对同一域的任何后续调用
我正在将我的 WebApi 升级到 MVC6。 在 WebApi 中,我可以拦截每个 HTTP 请求,如果是预检,我可以用浏览器可以接受的 header 进行响应。 我正在尝试找出如何在 MVC6 W
假设一个 CORS 预检请求进来了,但它为一个或多个 Access-Control-Request-* 指定了一个不受支持的值。标题。服务器应该如何将其传达回浏览器? 一些例子: 浏览器发送带有 Ac
问题中的一切。 附加信息: 使用 Win 10,GraphDB 免费,9.1.1 • RDF4J 3.0.1 • Connectors 12.0.2 我在控制台 => 设置中添加了 graphdb.w
我正在尝试通过 jQuery 调用 Sonar 网络服务之一。由于调用是跨域进行的,因此调用在 Chrome 上失败并出现以下错误: 请求的资源上不存在“Access-Control-Allow-Or
我想使用 NestJs api,但我在每个 fetch 中都收到相同的错误消息: Access to fetch at 'http://localhost:3000/articles' from or
我不确定这是否属于这里,但我在开发我的 svelte 应用程序时遇到了问题。 在开发过程中,它目前在独立服务器上运行(遵循使用 rollup 和 sirv 的指南)并针对不同端口上的后端 API。 稍
如果在服务器上正确设置 CORS 以仅允许某些来源访问服务器,这是否足以防止 XSRF 攻击? 最佳答案 更具体地说,很容易错误地认为如果 evil.com 由于 CORS 无法向 good.com
我在 Istio 入口上启用 CORS 时遇到问题。正如 Istio Ingress 文档所述,“ingresskubernetes.io”注释将被忽略。是否可以在 Istio 入口上启用 CORS?
我在 Istio 入口上启用 CORS 时遇到问题。正如 Istio Ingress 文档所述,“ingresskubernetes.io”注释将被忽略。是否可以在 Istio 入口上启用 CORS?
我是一名优秀的程序员,十分优秀!