Django 的 CSRF 保护机制(转)

add by zhj:其实我个人推荐前端不要将数据放在cookie中,而是放在其它本地存储(HTML5中称之为Web Storage),本地存储与cookie的一

个重要区别在于:本地数据不会自动加在http请求中。这样也就不会有CSRF了。假设用户登录了网站A,而在网站B中有一个CSRF攻击标签,点

击这个标签就会访问网站A,如果前端数据(包括sessionid)都放在本地存储的话,当在网站B点击CSRF攻击标签时,标签绑定的方法是无法获

取网站A本地存储中的sessionid的,这样用户在服务端无法通过认证,因此也就无法达到CSRF攻击的目的了。这样就可能保证所以请求都是来自

网站A的。

原文: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 攻击。

  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
时间: 2024-08-03 09:32:26

Django 的 CSRF 保护机制(转)的相关文章

Django 的 CSRF 保护机制

用 django 有多久,我跟 csrf 这个概念打交道就有久了. 每次初始化一个项目时都能看到 django.middleware.csrf.CsrfViewMiddleware 这个中间件 每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag 每次发 ajax POST 请求,都需要加一个 X_CSRFTOKEN 的 header 但是一直我都是知其然而不知其所以然,没有把 csrf 的机制弄清楚.昨天稍微研究了一下,总结如下. 什么是 CSRF CSRF,

前后端分离,解决跨域问题及django的csrf跨站请求保护

1. 前后端分离解决跨域问题 解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现: 关于跨域,前端会先发送OPTIONS请求,进行预检,检查后端是否允许前端设置的相应的请求头,请求内容 function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie

Django的CSRF机制

原文链接:http://www.cnblogs.com/lins05/archive/2012/12/02/2797996.html 必须有的是: 1.每次初始化一个项目时,都能看到django.middleware.csrf.CsrfViewMiddleware这个中间件 2.每次在模板里写form时都知道要加一个{% csrf_token %}tag 3.每次发ajax POST请求时,都需要加一个X_CSRFTOKEN 的header

Django POST CSRF verification failed. Request abor

环境 Window 7 Python2.7 Django1.4.1 sqlite3 问题 在使用Django搭建好测试环境后,写了一个提交POST表单提交留言的测试页面. 如图: 填写表单,点击“提交留言”按钮提交到服务器,却出现 Forbidden (403) CSRF verification failed. Request aborted. 由于之前使用GET方式提交表单内容测试均正常,就以为这个问题估计是配置问题没细看后边的帮助提示直接在网上搜索解决方案. 一搜索发现相关网页很多,看来大

Django之CSRF

网页向后端传送数据的时候有两种方式,get和post.通过设置form中的method来达到是否采用get或者是post <form action="/show_all/" method="POST"> 但是django中使用post的话会遇到如下的错误 这个错误的意思是csrf校验失败,request请求被丢弃掉.我们先来了解下什么是csrf. CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站

Django之CSRF以及CBV补充

1.CSRF a.基本应用 form表单中添加 {% csrf_token %} b.全栈禁用 # 'django.middleware.csrf.CsrfViewMiddleware', c. 局部禁用            'django.middleware.csrf.CsrfViewMiddleware', from django.views.decorators.csrf import csrf_exempt @csrf_exempt def  csrf1(request): if r

HTTP层 —— CSRF保护

简介 跨站请求伪造是一种通过伪装授权用户的请求来利用授信网站的恶意漏洞.Laravel 使得防止应用遭到跨站请求伪造攻击变得简单. Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF "令牌",该令牌用于验证授权用户和发起请求者是否是同一个人. 任何时候在 Laravel 应用中定义HTML表单,都需要在表单中引入CSRF令牌字段,这样CSRF保护中间件才能够正常验证请求.想要生成包含 CSRF 令牌的隐藏输入字段,可以使用辅助函数 csrf_field 来实现:

Django文件上传机制用法详解(转)

Django文件上传机制用法详解 http://www.jbxue.com/article/24283.html 分享下Django文件上传机制的用法,包括基本上传文件的原理,以及如何处理上传文件的方法,需要的朋友参考下. 当Django处理上传一个文件时,文件数据被放在request.FILES中. 这个文档解释文件怎么样被存储在磁盘上或者内存中,怎样定制默认的行为. 一,基本文件上传考虑一个包含FileField的简单的表单: 复制代码 代码示例: from  django  import 

解决django出现CSRF token missing or incorrect.错误

给template中的每个POST form添加{% csrf_token %}标签. <form action="/contact/" method="post">     {% csrf_token %}     <p>Subject: <input type="text" name="subject"></p>     <p>Your e-mail (optio