跨站请求伪造

一、简介

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

开启此功能后服务端会做两样设置:

  1. 会在cookie中加入 csrftoken字段

  2. 在html模板中 form表单POST请求需加入  {% csrf_token %}

  注:1. 和2. 生成的字段name和值不一样,但都有效。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

settings.py

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_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

二、应用

1、普通表单

#veiw中设置返回值:
  return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
或者
return render(request, 'xxx.html', data)
# html中设置Token:
  {% csrf_token %}

  html中设置的{% crsf_token %} 渲染后在from表单中生成隐藏的input标签

<input type="hidden" name="csrfmiddlewaretoken" value="ATvEtmpN8CFuc57eFrnGPjMlIgW2pLQUSKkFAc1FhiSrYbwyI8DuMOv1UubPjxuQ">

  注意:html表单中生成的为token名字为:csrfmiddlewaretoken

2、Ajax

  对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

  view.py

class SessionLogin(View):
def get(self, request):
return render(request, 'session_login.html') def post(self, request):
u = request.POST.get('username')
p = request.POST.get('pwd')
if u != user.get('username'):
return render(request, 'session_login.html')
if p == user.get('password'):
request.session['current_user'] = u
request.session.set_expiry(10)
return redirect('/session_index/') # form表单提交时可以跳转
# return HttpResponse('OK') # form表单提交时可以跳转
# return render(request, 'session_index.html')
else:
return render(request, 'session_login.html')

  html中ajax发起POST请求

  关键技术:

       获取:$.cookie('csrftoken')  从cookie中获取csrftoken

       设置:$.ajaxSetup({ beforeSend: function (xhr, settings) {xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))})  //ajax请求前设置csrftoken

       临时设置:$.ajax({ headers:{'X-CSRFtoken': $.cookie('csrftoken') }}, ...)

    <script>
//获取cookie
//正则语法验证是否是(GET|HEAD|OPTIONS|TRACE)中的任何一种方法,是则返回true
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
} function submit() {
let username = $('#username').val();
let pwd = $('#pwd').val();
let data = {'username':username,'pwd':pwd};
$.ajaxSetup({
beforeSend: function (xhr, settings) {
// 如果HTTP请求Method 非GET|HEAD...等,并且不是跨域请求,则设置'X-CSRFtoken'请求头
if(!csrfSafeMethod(settings.type) && !this.crossDomain){
xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
}
//console.log('this', this);
//this为当次ajax请求的全部内容实体对象
//console.log('settings.type:',settings.type);
//settings.type 当次执行请求时的HTTP-Method
//console.log('this.crossDomain:',this.crossDomain);
}
}); $.ajax({
url:'/session_login/',
data:data,
type:'POST',
{#headers:{'X-CSRFtoken': $.cookie('csrftoken') }, //请求时临时加入CSRFtoken#}
success:function (response_data, textStatus, jqXHR) {
{#console.log(textStatus);#}
{#console.log(jqXHR.statusText);#}
{# window.location.href = '/session_index/';#}
}
});
}
$('#submit').click(submit)
</script>

  

Django的安全机制 CSRF 跨站请求访问的更多相关文章

  1. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  2. Django之CSRF 跨站请求伪造

    一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...

  3. ajax向Django前后端提交请求和CSRF跨站请求伪造

    1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...

  4. csrf 跨站请求伪造相关以及django的中间件

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware来完成. 1.django中常用的中间件? - proces ...

  5. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  6. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  7. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  8. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  9. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

随机推荐

  1. Codeforces 1368E - Ski Accidents(构造+思维)

    Codeforces 题面传送门 & 洛谷题面传送门 神仙构造题(不过可能我构造太烂了?) 首先考虑这个奇奇怪怪的 \(\dfrac{4}{7}\),以及这个每个点出度最多为 \(2\) 的条 ...

  2. Tarjan 的一些板子

    圆方树(会在两圆点间建方点): void tarjan(int u) { low[u] = dfn[u] = ++dfc, stk[++top] = u, num++; for (int v : G[ ...

  3. R语言与医学统计图形【8】颜色的选取

    R语言基础绘图系统 基础绘图包之低级绘图函数--内置颜色. 1.内置颜色选取 功能657种内置颜色.colors() 调色板函数:palette(), rgb(), rainbow(). palett ...

  4. 金蝶EAS——我的EAS报销流程怎么能让另一个人看到呢?即如何设置流程传阅功能?设置“代理报销”

    代理的话只能看到被代理人能看到的流程.设置"代理报销":应用--财务会计--费用管理--代理报销 选择报销人公司--"他人代理我报销"--选择报销人(zhaof ...

  5. NFS FTP SAMBA的区别

    Samba服务 samba是一个网络服务器,用于Linux和Windows之间共享文件. samba端口号 samba (启动时会预设多个端口) 数据传输的TCP端口 139.445 进行NetBIO ...

  6. zabbix监控php状态

    环境介绍: php /usr/loca/php nignx /usr/loca/nginx  配置文件都是放在extra中 修改php-fpm的配置文件启动状态页面 pm.status_path = ...

  7. 网站性能调优实战-学相伴KuangStudy

    面对并发我们是如何优化KuangStudy网站性能的? 每个项目都会随着用户和数据的增长调整架构,来面对未来的问题,我们也不例外,在1月5号我们平台正式公测后,引起了很多观众的热烈反响,仅仅4天,注册 ...

  8. hbase参数调优

    @ 目录 HBase参数调优 hbase.regionserver.handler.count hbase.hregion.max.filesize hbase.hregion.majorcompac ...

  9. 日常Java 2021/10/5

    java 异常处理 Throwable中包括Error 和Exception,Exception包括IOException和RuntimeException 抛出异常 1.异常运算条件 Arithme ...

  10. 如何使用 Kind 快速创建 K8s 集群?

    作者|段超 来源|尔达 Erda 公众号 ​ 导读:Erda 作为一站式云原生 PaaS 平台,现已面向广大开发者完成 70w+ 核心代码全部开源!在 Erda 开源的同时,我们计划编写<基于 ...