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. itest(爱测试) 4.5.2 发布,开源BUG 跟踪管理 & 敏捷测试管理软件

    itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理4合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代(含任务, ...

  2. OpenAI正式发布第一个官方.NET版本库的测试版

    尽管 Microsoft 和 OpenAI 长期以来一直是紧密相连的合作伙伴,但他们现在才开始为 .NET 开发人员发布官方 OpenAI 库,加入现有的社区库.这项工作的第一个测试版是支持 .NET ...

  3. kettle从入门到精通 第二十二课 kettle carte web服务中文乱码

    在windows 上面 carte服务的canvas画布展示的中文正常,但是在linux上面中文展示乱码,如下所示: 原因:linux 机器缺少字体所致. kettle源码中使用字体: 解决方法: 安 ...

  4. sqlite3自动插入创建时间和更新时间

    最近在记录一些简单的结构化日志信息时,用到了sqlite3数据库(保存的信息比较简单,用Mysql,SQL Server,Postgres这些数据库有点小题大做). 以前开发系统时,用Mysql和Po ...

  5. VIVO IQOO 5G 开关

    VIVO IQOO 5G 开关 在拨号盘输入*#*#2288#*#*,然后点击网络模式选择. -

  6. C#.NET ASP.NET IIS 加载.pfx私钥证书时报错“出现了内部错误。”

    C#.NET ASP.NET IIS 加载.pfx私钥证书时报错"出现了内部错误." 原始代码报错: X509Certificate2 x509cer = new X509Cert ...

  7. C# JAVA UrlEncode

    C#  JAVA urlencode 默认是不兼容的.C# 需要encode的部分是小写.JAVA 需要encode的部分是大写. /// <summary> /// java UrlEn ...

  8. C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹体积很大

    现象:大量调用.p12证书时,C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹变得越来越大. 调用代码: X509Certificate2 x50 ...

  9. Mysql常见安装失败的解决方法

    问题一:安装时出现Initializing database失败 解决方法: 1.关闭安装页面并卸载MySQL Installer与MySQL Server (如果卸载不掉需要重启电脑) 2.查看并勾 ...

  10. CSS3随机背景图片切换特效

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` CSS3随机背景图片切换特效 日期:2018-5-16 阿 ...