• Django 的 CSRF 保护机制


    用 django 有多久,我跟 csrf 这个概念打交道就有久了。

    • 每次初始化一个项目时都能看到 django.middleware.csrf.CsrfViewMiddleware 这个中间件
    • 每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag
    • 每次发 ajax POST 请求,都需要加一个 X_CSRFTOKEN 的 header

    但是一直我都是知其然而不知其所以然,没有把 csrf 的机制弄清楚。昨天稍微研究了一下,总结如下。

    什么是 CSRF 

    CSRF, Cross Site Request Forgery, 跨站点伪造请求。举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果

    某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,

    你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的。

    具体的细节及其危害见 wikipedia

    Django 提供的 CSRF 防护机制

    django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,

    这样就能避免被 CSRF 攻击。

    1. 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
    2. 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)
    3. 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.
    4. 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

    Django 里如何使用 CSRF 防护

    • 首先,最基本的原则是:GET 请求不要用有副作用。也就是说任何处理 GET 请求的代码对资源的访问都一定要是“只读“的。
    • 要启用 django.middleware.csrf.CsrfViewMiddleware 这个中间件
    • 再次,在所有的 POST 表单元素时,需要加上一个 {% csrf_token %} tag
    • 在渲染模块时,使用 RequestContext。RequestContext 会处理 csrf_token 这个 tag,  从而自动为表单添加一个名为 csrfmiddlewaretoken 的 input

    方法一:

    在发送post请求的html页面前加入{% csrf_token %}

    方法二:

    在处理post数据的view前加@csrf_exempt装饰符

    @csrf_exempt  
    def profile_delte(request):   
      del_file=request.POST.get("delete_file",'')  
  • 相关阅读:
    第三章web安全基础—IIS发布网站(其中包括服务器IIS搭建、DNS搭建)
    第三章web安全基础—web系统架构
    第二章网络协议安全—网络协议看安全
    第一章信息收集—漏洞利用框架metasploit基本实用
    第一章信息收集—漏洞扫描awvs和appscan
    第一章信息收集—扫描技术与抓包分析
    Pikachu——Unsafe Fileupload不安全文件上传
    Pikachu——Unsafe Filedownload 不安全的文件下载
    Pikachu——File Inclusion(文件包含)
    拿什么拯救你,红果果的小磁盘?
  • 原文地址:https://www.cnblogs.com/deepminer/p/9175445.html
Copyright © 2020-2023  润新知