Django 的 CSRF 保护机制
来源:互联网 发布:小罐茶 知乎 编辑:程序博客网 时间:2024/05/21 06:36
Django 的 CSRF 保护机制
2012-12-02 11:45 by 林帅的博客, 119 阅读, 0 评论, 收藏, 编辑用 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 攻击。
- 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
- 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)
- 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。(可以用JS修改这两个值为任意值,只要一致即可。)如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.
- 在所有 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
- Django 的 CSRF 保护机制
- Django 的 CSRF 保护机制
- Django 的 CSRF 保护机制理解
- Django的CSRF保护引起的403 FORBIDDEN
- Django-CSRF的理解
- django post出现403的解决办法 据说,从django1.x开始,加入了CSRF保护。
- Django: csrf防御机制 以及解决方法
- Django有关CSRF的设置
- Django, csrf
- django CSRF
- flask csrf保护的使用技巧
- 我理解的django的CSRF防御!
- django中CSRF的问题及解决
- 关于Django中Csrf问题的解决方法
- django 对于csrf错误的处理
- CSRF攻击原理&Django的应用方法
- django csrf 引起的403解决方法
- Django csrf报错问题的解决方法
- WebSocket Learn to sharing
- weblogic web core
- iOS开发之---静态库的编译以及相关问题的处理
- Mac OS X 安装 nginx + php fcgi
- Erlang open_port极度影响性能的因素
- Django 的 CSRF 保护机制
- Git 基础知识
- NYOJ 673 悟空的难题
- 求祝福
- Android - adb
- 主题模型 LDA 源码分享
- iOS Safari/WebKit对DeviceOrientationEvent的实现
- Erlang port巧用环境变量
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】