您的位置:首页 > 编程语言 > Go语言

Django之CSRF 跨站请求伪造

2016-09-21 23:16 399 查看

一、简介

1、点我了解什么是跨站请求伪造

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

全局

通过修改django中settings文件中中间件列表中的django.middleware.csrf.CsrfViewMiddleware,如果注释该选项,则表示全局不启用,否则表示全局启用


局部

# 该装饰器加在views中的函数上
from django.views.decorators.csrf import csrf_exempt,csrf_protect   # 导入装饰器
@csrf_protect    # 为当前函数强制设置防跨站请求伪造功能,如果settings中没有设置全局中间件,在views中的函数加上该装饰器,则表示对该函数启用CSRF功能
@csrf_exempt    # 取消当前函数防跨站请求伪造功能,如果settings中设置了全局中间件,在views中的函数加上该装饰器,则表示对该函数不启用CSRF功能

二、应用

1、通过form表单提交

csrf.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<form action="/csrf/" method="post">

<!-- html通过该simple_tag参数由模板渲染将其转换成一个隐藏的input标签,例如:
<input type="hidden" name="csrfmiddlewaretoken" value="9BxEgRk6hMR8bLPwLJs516YHCsNihbK47Lc3CyPASUcXZXS4r9M0j3zz2QOsmJaC"> -->
{% csrf_token %}
<input type="text" name="v" />
<input type="submit" value="提交" />
</form>

</body>
</html>


views.py

from django.shortcuts import render

from django.views.decorators.csrf import csrf_protect

# Create your views here.

@csrf_protect
def csrf(request):
return render(request, 'csrf.html')   # 这个地方一定要使用render,因为要对csrf.html中的模板语言进行渲染

2、通过Ajax提交

csrf.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% csrf_token %}

<input type="button" onclick="Do();"  value="提交"/>

<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script type="text/javascript">

{# 从cookie中拿到csrftoken #}
var csrftoken = $.cookie('csrftoken');

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

{# 当所有ajax发送数据之前都执行以下这个配置,自动将cookie中的csrftoken加入到request中的head中 #}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
function Do(){

$.ajax({
url:"/csrf/",
data:{id:1},
type:'POST',
success:function(data){
console.log(data);
}
});

}
</script>

</body>
</html>


views.py

from django.shortcuts import render

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def csrf(request):
return render(request, 'csrf.html')

点我查看官方详细说明

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: