代码之家  ›  专栏  ›  技术社区  ›  MariusSiuram

在django-rest框架+角度应用中,建议采用什么方式进行CSRF保护?

  •  0
  • MariusSiuram  · 技术社区  · 7 年前

    我一直在努力在Django和Angular之间进行配置,我错过了一些东西。推荐的方法是什么?

    Angular有一些XSRF保护,但是自从AngularJS和我发现了很多过时的信息或手册之后,它已经改变了。Django使用了一些默认值,但它们在角度方面表现不好。

    解决DRF和Angular之间CSRF的方法包括哪些电池?

    1 回复  |  直到 7 年前
        1
  •  0
  •   MariusSiuram    7 年前

    角度推荐方法在 HTTP Guide 但是,对于我们中的一些人来说,它有一些棘手的步骤。幸运的是,在最近的Angular版本中,您需要进行最小的更改。而且所有默认/推荐的CSRF中间件一旦设置好就可以正常工作。有一些信息 DRF-specific 以及对 Django official documentation

    目前对我有效的最小更改(Django2.1、Angular6和最新版本的依赖项)如下

    丹戈侧

    首先,您需要设置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应该可以被javascript访问,所以 httpOnly 标志不应设置为 True .

    这里我假设您已经有了一个功能验证系统,并且正在使用这两个系统 django.contrib.sessions.middleware.SessionMiddleware django.middleware.csrf.CsrfViewMiddleware (通常,您会在 MIDDLEWARE 变量在 settings.py )

    角侧

    然后,激活角侧的CSRF:

    # app.module.ts
    import {HttpClientModule, HttpClientXsrfModule} from '@angular/common/http';
    
    ...
    
    @NgModule({
      imports: [
        // ...
        HttpClientModule,
        HttpClientXsrfModule,
      ]
    // ...
    

    如果不想更改csrf header和cookie的django默认名称,可以通过更改 HttpClientXsrfModule, 线路:

    HttpClientXsrfModule.withOptions({
      cookieName: 'csrftoken',
      headerName: 'X-CSRFTOKEN',
    }),
    

    我还没有完全测试这个配置。记住,在姜戈那边,你必须稍微改变一下 CSRF_HEADER_NAME (至少:连字符到下划线和 HTTP_ 前缀)。上一个示例应与 HTTP_X_CSRFTOKEN .违约 CSRF_COOKIE_NAME Django设置为 csrftoken (小写)。

    如果自定义动画有问题,请检查Angular插入的实际标题(使用浏览器的开发人员工具),通过调试 request.META