Django跨域请求CSRF的方法示例

yipeiwu_com7年前Python基础

web跨域请求

1.为什么要有跨域限制

举个例子:

1.用户登录了自己的银行页面 http://mybank.com,http://mybank.com向用户的cookie中添加用户标识。
2.用户浏览了恶意页面 http://evil.com。执行了页面中的恶意AJAX请求代码。
3.http://evil.com向http://mybank.com发起AJAX HTTP请求,请求会默认把http://mybank.com对应cookie也同时发送过去。
4.银行页面从发送的cookie中提取用户标识,验证用户无误,response中返回请求数据。此时数据就泄露了。
5.而且由于Ajax在后台执行,用户无法感知这一过程。

以上就是所谓是CSRF(Cross-site request forgery)攻击,跨站请求伪造。接下来说一下 Django中处理csrf的方式

正常情况下直接发起一个psot请求,会报错。错误的意思是csrf校验失败,request请求被丢弃掉。

那么在django中的post失败有两种解决办法:

解决办法一:将csrf中间层注释掉

MIDDLEWARE = [
 
  'django.middleware.security.SecurityMiddleware',
 
  'django.contrib.sessions.middleware.SessionMiddleware',
 
  'django.middleware.common.CommonMiddleware',
 
#  'django.middleware.csrf.CsrfViewMiddleware',
 
  'django.contrib.auth.middleware.AuthenticationMiddleware',
 
  'django.contrib.messages.middleware.MessageMiddleware',
 
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
 
]

此时将不会进行csrf的校验,但如前面所述,这是一种不安全的行为。而且djano也不推荐使用

解决办法二:

在前面的提示中有这样一句话:

<form action="" method="post">{% csrf_token %}

也就是说在网页中加入csrf_token的标签就可以通过csrf校验

Django 提供的 CSRF 防护机制:

1、django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。

2、在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token,在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)

3、在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.

4、在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Python基于回溯法子集树模板解决野人与传教士问题示例

Python基于回溯法子集树模板解决野人与传教士问题示例

本文实例讲述了Python基于回溯法子集树模板解决野人与传教士问题。分享给大家供大家参考,具体如下: 问题 在河的左岸有N个传教士、N个野人和一条船,传教士们想用这条船把所有人都运过河去...

详解详解Python中writelines()方法的使用

 writelines()方法写入字符串序列到文件。该序列可以是任何可迭代的对象产生字符串,字符串为一般列表。没有返回值。 语法 以下是writelines()方法的语法:...

树莓派实现移动拍照

驱动树莓派gpio的中间层库函数有wiringPi,BCM2835,以及PRi.GPIO,这里我选择使用Python语言开发的PRi.GPIO。 1、安装RPi.GPIO (1)先安装p...

5款Python程序员高频使用开发工具推荐

5款Python程序员高频使用开发工具推荐

很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头。后来工作中深刻体会到,合理使用开发的工具的便利和高效。今天,我就把Pyth...

Python pip 安装与使用(安装、更新、删除)

pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。 pip检测更新 命令:pip list –outdated pip升级包 命令...