django系列6--Ajax04 请求设置(设置csrf_token)

Ajax请求设置csrf_token

  官方文档 csrf_token: https://docs.djangoproject.com/en/1.11/ref/csrf/

CSRF** 跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的

  在用form表单提交时,要在标签内加上{% csrf_token %}参数,而用ajax post方式请求时,也要设置csrf_token.

有三种方式可以设置:

方式1.

{%csrf_token%}在页面打开时是一个隐藏的input标签,通过获取这个标签中的csrfmiddlewaretoken值,放置在data中发送

首先要在html中加入{% csrf_toke %}标签

script部分:

$.ajax({
  url: "/cookie_ajax/",
  type: "POST",
  data: {
    "username": "chao",
    "password": 123456,
    "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()  // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data中
  },
  success: function (data) {
    console.log(data);
  }
})

方式2

$.ajaxSetup({
    data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});

方式3

通过获取返回的cookie中的字符串,放置在请求头中发送.

需要引入一个jquery.cookie.js文件

<script src="{% static 'js/jquery.cookie.js' %}"></script>

$.ajax({
    headers:{"X-CSRFToken":$.cookie('csrftoken')},
})

示例:

$.ajax({
  url: "/cookie_ajax/",
  type: "POST",
  headers: {"X-CSRFToken": $.cookie('csrftoken')},  // 从Cookie取csrftoken,并设置到请求头中
  data: {"username": "robertx", "password": 123},
  success: function (data) {
    console.log(data);
  }
})

还可以自己写一个getCookie方法

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

每一次都要写非常麻烦,可以使用$.ajaxSetup()方法为ajax请求统一设置

function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
  beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});
  1. 如果使用从cookie中取csrftoken的方式,需要确保cookie存在csrftoken值。
  2. 如果你的视图渲染的HTML文件中没有包含 {% csrf_token %},Django可能不会设置CSRFtoken的cookie。
  3. 这个时候需要使用ensure_csrf_cookie()装饰器强制设置Cookie。
    django.views.decorators.csrf import ensure_csrf_cookie
    
    @ensure_csrf_cookie
    def login(request):
        pass

原文地址:https://www.cnblogs.com/robertx/p/10485266.html

时间: 2024-10-10 07:48:39

django系列6--Ajax04 请求设置(设置csrf_token)的相关文章

Django 系列博客(二)

Django 系列博客(二) 前言 今天博客的内容为使用 Django 完成第一个 Django 页面,并进行一些简单页面的搭建和转跳. 命令行搭建 Django 项目 创建纯净虚拟环境 在上一篇博客中已经安装好了虚拟环境,所以用虚拟环境来安装指定版本的 Django.为了可以从头到尾的走一遍流程,我重新创建了一个虚拟环境. 激活虚拟环境并安装 Django 首先进入虚拟环境路径下的 bin 目录 使用命令激活虚拟环境 安装指定版本 Django 首先使用 pip3 list 命令查看 可以看到

Ajax请求如何设置csrf_token

1. 方式一 通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送. $.ajax({ url: "/cookie_ajax/", type: "POST", data: { "username": "yang", "password": 123, // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data总 "csrfmiddl

Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05-17, 修改日期: 2014-05-18 在Django 1.6中的settings.py中可以修改130多项设置, 但大多数都继承自默认值. 设置是在web服务器启动时首次载入的, 服务器重启时重新载入, 因此, 程序员们应尽量避免修改正式服务器上使用的settings.py文件. 以下是一些我们

AFNetwoworking 网络请求时间设置

AFNetwoworking 网络请求时间设置 前言: 最近用了AFNetwoworking 网路请求框架. 如果大家想要认真学习请下载文档(中文+英文)双语:文档下载 我们可能会这样:调用AFHTTPRequestOperationManager 的GET 和 POST 方法时,网络请求时间60秒,就像我会觉得时间有点长,我想改为10 秒: 方法: 1.首先我们找到AFURLRequestSerialization.m文件 2.然后找到找到下面这个函数: - (NSMutableURLRequ

ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之9.ABP设置管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由山东-李伟提供翻译 介绍 每个应用程序需要存储一些设置并在应用程序的某个地方使用这些设置.A

利用volley进行http设置请求头、超时及请求参数设置(post)

这里以post请求说明,get请求相似设置请求头及超时. 1.自定义request,继承com.android.volley.Request 2.构造方法实现(basecallback,为自定义的监听,实现Response.Listener,ErrorListener接口)--post请求 public BaseRequest(String url,String params, BaseCallback<T> callback)      {   super(Method.POST, url,

get和post请求的设置

1.post的请求设置 2.get请求的设置 get和post请求的设置

【web开发】☆★之利用POI操作Excel表格系列教程【8】设置单元格对其方式

[web开发]☆★之利用POI操作Excel表格系列教程[8]设置单元格对其方式 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HS

接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头

转自:https://www.cnblogs.com/hong-fithing/p/7617855.html https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, HTTPS以保密为目标研发, 简单讲HTTPS协议是由SSL+HTTP协议构建的可进行加密传输. 身份认证的网络协议, 其安全基础是SSL协议, 因此加密的详细内容请看SSL. 全称Hypertext Transfer Protocol overSecure