zoukankan      html  css  js  c++  java
  • Django 的 CSRF 保护机制(转)

    add by zhj:假设用户登录了网站A,而在网站B中有一个CSRF攻击标签,点击这个标签就会访问网站A,如果前端数据(包括sessionid)都放在本地存储的话,

    当在网站B点击CSRF攻击标签时,标签绑定的方法是无法通过js获取网站A本地存储中的sessionid的(因为涉及到了跨域的问题,js只能获取网站B的cookie),

    这样用户在服务端无法通过认证(认证过程见"Django 提供的 CSRF 防护机制"一节),因此也就无法达到CSRF攻击的目的了。

    原文:http://www.cnblogs.com/lins05/archive/2012/12/02/2797996.html

    用 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 攻击。

    在 templete 中, 为每个 POST form 增加一个 {% csrf_token %} tag. 如下: 

    1. 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
    2. 在所有的 POST 表单模板中,加一个{% csrf_token %} 标签,它的功能其实是给form增加一个隐藏的input标签,如下

      <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">,而这个csrf_token = cookie.csrftoken,在渲染模板时context中有context['csrf_token'] = request.COOKIES['csrftoken']

    3. 在通过表单发送POST到服务器时,表单中包含了上面隐藏了crsrmiddlewaretoken这个input项,服务端收到后,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.

    4. 在通过 ajax 发送POST请求到服务器时,要求增加一个x-csrftoken header,其值为 cookie 里的 csrftoken 的值,服务湍收到后,django会验证这个请求的cookie里的csrftoken字段与ajax post消息头中的x-csrftoken header是否相同,如果相同,则表明是一个合法的请求

    Django 里如何使用 CSRF 防护

    • 首先,最基本的原则是:GET 请求不要用有副作用。也就是说任何处理 GET 请求的代码对资源的访问都一定要是“只读“的。
    • 要启用 django.middleware.csrf.CsrfViewMiddleware 这个中间件
    • 再次,在所有的 POST 表单元素时,需要加上一个 {% csrf_token %} tag
    • 在渲染模块时,使用 RequestContext。RequestContext 会处理 csrf_token 这个 tag,  从而自动为表单添加一个名为 csrfmiddlewaretoken 的 input
    • 在发送ajax post时时,需要加x-csrftoken header,其值为cookie中的csrftoken
  • 相关阅读:
    Linux I/O状态实时监控iostat
    Linux系统常用监控系统状态信息命令
    Linux查看网络信息命令
    Linux服务器进程信息查看命令
    Linux服务器的日志管理
    Linux令普通用户拥有root权限
    linux后台运行之&和nohup区别,模拟后台守护进程
    Linux之shell终端使用操作快捷键
    linux解压缩命令之unzip,tar(持续更新)
    Centos7 安装部署redis及其入门使用
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/4262638.html
Copyright © 2011-2022 走看看