在Django Rest Framework + Angular应用程序中建议使用CSRF保护的方法是什么?

时间:2018-12-17 11:02:20

标签: django angular django-rest-framework csrf-protection django-csrf

我一直在努力在Django和Angular之间进行配置,但我缺少一些东西。建议这样做的方法是什么?

Angular具有一些XSRF保护,但是自从AngularJS以来,它已经发生了变化,我发现了很多过时的信息或手册。 Django使用了一些默认设置,但是它们在Angular中表现不佳。

在DRF和Angular之间解决CSRF的电池方式是什么?

1 个答案:

答案 0 :(得分:0)

HTTP Guide中介绍了Angular推荐的方法,但是对于我们中的某些人来说,它有一些棘手的步骤。幸运的是,在最新版本的Angular中,您需要进行的更改很少。一旦设置完成,所有默认/推荐的CSRF中间件都将表现良好。这里有一些信息DRF-specific,也有对Django official documentation

的引用

目前对我有用的最小更改(Django 2.1,Angular 6和最新版本的依赖项)如下

Django方面

首先,您需要设置Django以按照Angular的期望发送cookie:

# settings.py
CSRF_USE_SESSIONS = False
CSRF_COOKIE_HTTPONLY = False  # this is the default, and should be kept this way
CSRF_COOKIE_NAME = 'XSRF-TOKEN'
CSRF_HEADER_NAME = 'HTTP_X_XSRF_TOKEN'
  

注意!!请记住,cookie名称是区分大小写的。我在那里浪费了很多时间:(

请注意,CSRF cookie应该可以被Java脚本访问,因此httpOnly标志不应设置为True

在这里,我假设您已经具有功能验证系统,并且同时使用django.contrib.sessions.middleware.SessionMiddlewaredjango.middleware.csrf.CsrfViewMiddleware(通常您会在{{ 1}})。

角侧

然后,在斜角侧激活CSRF:

MIDDLEWARE

如果您不想更改CSRF标头和Cookie的Django默认名称,则可以改为Angular端,方法是将settings.py行更改为:

# app.module.ts
import {HttpClientModule, HttpClientXsrfModule} from '@angular/common/http';

...

@NgModule({
  imports: [
    // ...
    HttpClientModule,
    HttpClientXsrfModule,
  ]
// ...

我尚未完全测试此配置。请记住,在Django方面,您必须稍微更改HttpClientXsrfModule,(至少:连字符到下划线和HttpClientXsrfModule.withOptions({ cookieName: 'csrftoken', headerName: 'X-CSRFTOKEN', }), 前缀)。前面的示例应与CSRF_HEADER_NAME的默认值匹配。缺省的HTTP_ Django设置为HTTP_X_CSRFTOKEN(小写)。

如果您对自定义命名有疑问,请检查Angular插入的实际标头(使用浏览器的开发人员工具),然后可以通过调试CSRF_COOKIE_NAME的内容来再次检查如何在Django中接收标头< / p>