Django 安全之跨站点请求伪造(CSRF)保护
Django 安全之跨站点请求伪造(CSRF)保护
by:授客 QQ:1033553122
测试环境
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)保护的更多相关文章
- 跨站点请求伪造(CSRF)总结和防御
		
什么是CRSF 构建一个地址,比如说是删除某个博客网站博客的链接,然后诱使已经登录过该网站的用户点击恶意链接,可能会导致用户通过自己的手将曾经发布在该网站的博客在不知情的情况下删除了.这种构建恶意链接 ...
 - mvc3.0防止跨站点请求伪造(CSRF)攻击
		
众所周知,asp.net mvc程序在浏览器运行是产生标准的Html标签,包括浏览器要发送的关键数据等内容都在html内容里面.听起来不错,但是假如我们伪造类似的html内容,更改里面的关键数据,在浏 ...
 - Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造
		
(一)数据分页 可以参考 https://docs.djangoproject.com/en/2.0/topics/pagination/ 模板:如果只要显示 1.2.3.4.5.6....的话, ...
 - 密码学系列之:csrf跨站点请求伪造
		
目录 简介 CSRF的特点 CSRF的历史 CSRF攻击的限制 CSRF攻击的防范 STP技术 Cookie-to-header token Double Submit Cookie SameSite ...
 - 跨站点请求伪造(CSRF)学习
		
一.CSRF介绍 伪造一个站点,在站点中伪造一个向其他站点的请求,在用户访问该站点时让用户执行 假设有如下URL能删除一篇文章: 攻击者在自己的域中构造一个页面: 内容为: 使用一个img标签,其地址 ...
 - python---xss(Cross Site Scripting)跨站脚本攻击和csrf(xsrf)跨站点请求伪造(Cross—Site Request Forgery)攻击
		
xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而 ...
 - 跨站点请求伪造(CSRF)
		
一.前言 跨站点请求伪造(Cross-SiteRequest Forgeries, CSRF),是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动 ...
 - [不常用]  -  CSRF(跨站点请求伪造)
		
CSRF,Cross Site Request Forgery,即跨站点请求伪造. 这种攻击是指,在用户正常登录系统以后,攻击者诱使用户访问一些非法链接,以执行一些非法操作. 比如:如果删除用户操 ...
 - django之跨站请求伪造csrf
		
目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...
 - Appscan漏洞之跨站点请求伪造(CSRF)
		
公司前段时间使用了Fortify扫描项目代码,在修复完这些Fortify漏洞后,最近又启用了Appscan对项目代码进行漏洞扫描,同样也是安排了本人对这些漏洞进行修复.现在,针对修复过的Appscan ...
 
随机推荐
- Windows Server 2022 NTP服务器
			
一.配置NTP服务器 配置NTP服务器,为客户端提供时间同步服务. 如果计算机是Active Directory域控制器,则NTP服务器功能已自动启动. 因此,下面的示例是计算机在工作组环境中启用NT ...
 - C#自动安装字体
			
在Windows系统中,原有自带的字体样式有限,有时候我们的程序会使用到个别稀有或系统不自带的字体.因此我们需要将字体打包到程序中,当程序启动时,检测系统是否有该字体,如果没有则安装该字体,也可以动态 ...
 - SwiftUI(二)- 页面导航NavigationLink和Sheet窗口(模态视图)
			
NavigationLink 官方文档对NavigationLink的定义: A button that triggers a navigation presentation when pressed ...
 - Windows程序读取不了中文路径问题
			
问题描述 今天调试发现win32接口GetFileAttributesW居然不支持中文路径,于是寻找解决方案,找了半天,尝试用boost的fileystem库发现能用,而且boost能跨平台! 不支持 ...
 - Cygwin安装及简单说明
			
1 简介 官方说明:Cygwin is a Linux-like environment for Windows. It consists of a DLL (cygwin1.dll), which ...
 - CF题解合集
			
CF 比赛题解合集 目录 CF 比赛题解合集 1952 A. Ntarsis' Set B. Imbalanced Arrays C. Ina of the Mountain D. Miriany a ...
 - kettle从入门到精通 第六十课 ETL之kettle for循环处理每条数据,so easy!
			
1.kettle原生是支持for循环处理的,无需通过javascript脚本或者java脚本开发for循环控制.当然如果想通过脚本挑战下也是可以的. 本节课主要讲解如何通过kettle中的job来实现 ...
 - INFINI Labs 产品更新 | Easysearch 支持 SQL 查询、Console 告警功能支持邮件等多渠道
			
INFINI Labs 产品又更新啦~.本次更新概要如下:Easysearch 新增 SQL 插件和JDBC 驱动,支持 SQL 查询,支持 SQL 常用函数等:Console 针对告警功能做了升级优 ...
 - C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证
			
C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证 参考了:https://www.cnblogs.com/-dawn/p/8598566.html GetLog4netI ...
 - EBLK日志收集方案
			
ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash 和 Kibana.该组合版本会统一发布. Elast ...