Django 安全之跨站点请求伪造(CSRF)保护

by:授客 QQ1033553122

测试环境

Win7

Django 1.11

 

跨站点请求伪造(CSRF)保护

中间件配置

默认的CSRF中间件在MIDDLEWARE中定义并处于激活状态。如果需要变更默认配置,修改settings.py中的MIDDLEWARE配置即可,如下,假设要开启CSRF,确保列表包含  'django.middleware.csrf.CsrfViewMiddleware',并且其位置位于其它会对CSRF攻击进行处理的中间件之前,假设要禁用CSRF中间件,去掉列表中的'django.middleware.csrf.CsrfViewMiddleware',或者采用注释方式,把 'django.middleware.csrf.CsrfViewMiddleware' 注释掉。注意:更改配置后需要重启web服务器。

 
MIDDLEWARE = [
    ……,
'django.middleware.csrf.CsrfViewMiddleware',
……
]

如果CSRF中间件被禁用(不推荐),又想对特定视图启用中间件保护,则可以针对特定视图使用csrf_protect()修饰器,如下:

from django.views.decorators.csrf import csrf_protect
 
@csrf_protect
def specific_view(request):
    do something
 
参考链接:https://docs.djangoproject.com/en/2.1/ref/csrf/#django.views.decorators.csrf.csrf_protect
 
 

相反的,如果中间件已经开启,但是又不想针对特定视图使用中间件保护,则可以针对特定视图使用csrf_exempt() 修饰器

from django.views.decorators.csrf import csrf_exempt
 
 
@csrf_exempt
def specific_view(request):
do something
 
参考链接:https://docs.djangoproject.com/en/2.1/ref/csrf/#utilities

 

html模板配置

开启CSRF中间件的情况下,要在html模板中为使用post方法的form表单新增 csrf_token tag,如下:

<form method="post">

{% csrf_token %}

<input ...>... </input>

...

</form>

注意:如果被渲染的view视图未使用csrf_token模板标签,Django可能不会设置CSRF token cookie。这种情况下,假如有必要,可以使用Django提供的 @ensure_csrf_cookie()装饰器强制view视图发送CSRF cookie。

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie()

def specific_view(request):
do something

view视图函数

对应的视图函数中,确保使用了RequestContext来渲染response,以便{%csrf_token %}可以正常运行。因为 render()函数使用了RequestContext,所以一般的view中,使用render()也是可以的。

前端js脚本

注意:如果已开启CSRF 的情况下,需要给请求添加X_CSRFTOKEN 请求头,否则会报403错误

/**

 * 验证不需要CSRF保护的HTTP方法名(GET|HEAD|OPTIONS|TRACE

 */

function csrfSafeMethod(method) {

return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

}

/**

 * 获取cookie项的值

 * key:cookie名称

 */

function getCookie(key) {

var cookies = document.cookie.split(';'); // 获取每个cookie项(不含会话id)

var value = undefined;

for (var i in cookies) {

var kv = cookies[i].split('='); // 每个cookie项的名称和cookie的值

var temp_key = kv[0].replace(' ', ''); // 获取的cookie项有多个值,第二个开始,键 的值 的左侧会加个空格

if (key == temp_key) {

var value = kv[1];

break;

}

}

return value;

}

/**

 * Created by shouke on 2018/11/1.

 */

 

//全局变量设置

var loginURL = '/platform/api/v1/login'; // 注册api地址

var loginFormID = 'login-form';           // 登录表单ID

var registerRightNowID = 'registerRightNow' // 立即注册链接ID

 

/**

 * 初始化

 */

$(document).ready(function() {

// 设置顶部导航

setTopNav();

var resources = $.session.get('resources');

if (resources) {

resources = JSON.parse(resources).resources;

// 设置立即注册url

$("#" + registerRightNowID).attr("href", resources.register_url.url);

} else {

alert('获取资源失败,导致设置立即注册连接失败');

}

// 为登录表单绑定提交事件

$('#' + loginFormID).submit(function() {

/**

         * 提交登录信息

         */

var dataArray = $('#' + loginFormID).serializeArray();

var data = {}

$.each(dataArray, function () {

data[this.name] = this.value;

});

var csrfToken = getCookie('csrftoken');

if (csrfToken == undefined) {

alert('获取Cookie失败');

return false;

      }

$.ajax({

type: "POST",

url: loginURL,

async: false,

data: data,

beforeSend: function (xhr, settings) {

if (!csrfSafeMethod(settings.type) && !this.crossDomain) {

                    xhr.setRequestHeader("X-CSRFTOKEN", csrfToken);

             }

         },

success: function (result) {

if (result.success == 'true') {

alert(result.msg);

$.session.remove('resources');                // 清空登录前获取的资源,以便重新获取资源

                 // 重定向返回登录前的页面

window.location.href = result.next;

} else {

alert(result.msg + "," + result.reason);

}

},

error: function(XmlHttpRequest, textStatus, errorThrown) {

alert('登录请求失败' + XmlHttpRequest.responseText);

}

});

return false;

});

});

注意:这里最后面添加的return false; 主要是用于 避免跳转到django后台的返回结果数据页

参考链接

https://docs.djangoproject.com/en/2.1/ref/csrf/#using-csrf

https://docs.djangoproject.com/en/2.1/topics/security/#cross-site-request-forgery-csrf-protection

Django 安全之跨站点请求伪造(CSRF)保护的更多相关文章

  1. 跨站点请求伪造(CSRF)总结和防御

    什么是CRSF 构建一个地址,比如说是删除某个博客网站博客的链接,然后诱使已经登录过该网站的用户点击恶意链接,可能会导致用户通过自己的手将曾经发布在该网站的博客在不知情的情况下删除了.这种构建恶意链接 ...

  2. mvc3.0防止跨站点请求伪造(CSRF)攻击

    众所周知,asp.net mvc程序在浏览器运行是产生标准的Html标签,包括浏览器要发送的关键数据等内容都在html内容里面.听起来不错,但是假如我们伪造类似的html内容,更改里面的关键数据,在浏 ...

  3. Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造

    (一)数据分页  可以参考  https://docs.djangoproject.com/en/2.0/topics/pagination/ 模板:如果只要显示 1.2.3.4.5.6....的话, ...

  4. 密码学系列之:csrf跨站点请求伪造

    目录 简介 CSRF的特点 CSRF的历史 CSRF攻击的限制 CSRF攻击的防范 STP技术 Cookie-to-header token Double Submit Cookie SameSite ...

  5. 跨站点请求伪造(CSRF)学习

    一.CSRF介绍 伪造一个站点,在站点中伪造一个向其他站点的请求,在用户访问该站点时让用户执行 假设有如下URL能删除一篇文章: 攻击者在自己的域中构造一个页面: 内容为: 使用一个img标签,其地址 ...

  6. python---xss(Cross Site Scripting)跨站脚本攻击和csrf(xsrf)跨站点请求伪造(Cross—Site Request Forgery)攻击

    xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而 ...

  7. 跨站点请求伪造(CSRF)

    一.前言 跨站点请求伪造(Cross-SiteRequest Forgeries, CSRF),是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动 ...

  8. [不常用] - CSRF(跨站点请求伪造)

    CSRF,Cross Site Request Forgery,即跨站点请求伪造.   这种攻击是指,在用户正常登录系统以后,攻击者诱使用户访问一些非法链接,以执行一些非法操作. 比如:如果删除用户操 ...

  9. django之跨站请求伪造csrf

    目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...

  10. Appscan漏洞之跨站点请求伪造(CSRF)

    公司前段时间使用了Fortify扫描项目代码,在修复完这些Fortify漏洞后,最近又启用了Appscan对项目代码进行漏洞扫描,同样也是安排了本人对这些漏洞进行修复.现在,针对修复过的Appscan ...

随机推荐

  1. 图解JDK7及其早期版本HashMap扩容死锁问题

    在JDK7及其早期版本中HashMap在多线程环境下会发生扩容死锁的问题. HashMap中在创建时默认会有16个桶,有一个默认加载因子0.75,如果Map中的Entry数量达到阈值(16*0.75) ...

  2. ChatGPT-4o模型功能介绍

    1.概述 OpenAI 持续突破人工智能的边界,推出了其最新模型 ChatGPT-4o,作为 ChatGPT-4 的继承者,该模型有望带来显著的提升和创新功能.本文将深入解析 ChatGPT-4 与 ...

  3. NumPy 均匀分布模拟及 Seaborn 可视化教程

    均匀分布 简介 均匀分布是一种连续概率分布,表示在指定范围内的所有事件具有相等的发生概率.它常用于模拟随机事件,例如生成随机数或选择随机样本. 参数 均匀分布用两个参数来定义: a:下限,表示分布的最 ...

  4. 记第一次用python写界面

    花了两三个小时学了Tkinter,做了一个将数据绘制成图的小工具. 1. 获取路径下的所有文件or获取路径下指定名称的文件 1.1  打开文件 //1. 用来放文本框中的文字filename = St ...

  5. webpack配置css预处理

    webpack默认只支持js的打包,不支持其它类型,为了让它支持样式的打包就需要加载一些loader 打包css文件 在webpack中配置对应的loader 在入口js文件中通过import导入样式 ...

  6. 剑指Offer-59.按之字形顺序打印二叉树(C++/Java)

    题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 实际上是二叉树的层次遍历,只不过每一行 ...

  7. C#.NET 操作FTP

    工具类: using System; using System.Collections.Generic; using System.IO; using System.Net; namespace Co ...

  8. 通俗理解GAN -- 基础认知

    Smiling & Weeping ---- 你已春风摇曳,我仍一身旧雪 1.GAN的基本思想 GAN全称对抗生成网络,顾名思义是生成模型的一种,而他的训练则是一种对抗博弈状态中的.下面我们举 ...

  9. FolkMQ 1.6.0(纯血国产,适合信创)

    FolkMQ 是个"新式"的消息中间件.强调:"简而强".可内嵌,可单机,可集群(部署包为 9Mb). 功能简表 角色 功能 生产者(客户端) 发布普通消息.Q ...

  10. Linux 内核:sysfs 有关的API

    背景 相关文章:1.sysfs与kobject基类 下面内容基本上参考(有删改):https://blog.csdn.net/qb_2008/article/details/6846412 API a ...