Django之CSRF

1、什么是CSRFjavascript

    CSRF, Cross Site Request Forgery, 跨站伪造请求。举例来说,某个恶意的网站上有一个指向你的网站的连接,若是某个用户已经登陆到你的网站上了,那么当这个用户点击这个恶意网站上的那个连接时,就会向你的网站发来一个请求,你的网站会觉得这个请求是用户本身发来的,其实呢,这个请求是那个恶意网站伪造的。前端

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


2、Django提供CSRF防御机制python

    Django第一次响应某个客户端的请求时,会在服务器端随机生成一个token,而后把这个token放到cookie中返回给客户端。而后客户端每次POST请求时都会带上这个token,这样就避免了CSRF***。
jquery

  • 在返回的HTTP响应的cookie中,Django会添加一个csrftoken字段,值为随机生成的tokenajax

  • 在POST表单中,必须包含一个csrfmiddlewaretoken隐藏字段,须要在模板中添加{% csrf_token %}自动生成django

  • 在处理POST请求以前,Django会验证cookie中csrftoken和表单中csrfmiddlewaretoken的值是否一致。若是一致,则代表这是一个合法请求。不然这个请求就是伪造的,返回403 Forbidden。服务器

  • 在Ajax POST请求中,添加一个"X-CSRFToken"头部,值为cookie中的csrftoken的值。cookie


3、CSRF设置ide

1. 全局设置(中间件)

django.middleware.csrf.CsrfViewMiddleware

2. 局部设置(视图函数)

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

@csrf_protect  # 为当前函数强制设置防跨站请求伪造功能,即使settings中没有设置CSRF中间件。
def func():
    pass
    
@csrf_exempt  # 取消当前函数防跨站请求伪造功能,即使settings中设置了CSRF中间件。
def func():
    pass


4、应用CSRF

1. 前端Form表单中设置CSRF

<form method="post">
{% csrf_token %}
    ...
</form>

2. 自动在每一个Ajax请求头部中添加"X-CSRFToken"

// 导入jquery.cookie.js 经过$.cookie('csrftoken')获取csrf_token
// beforeSend在每一个Ajax请求以前自动设置请求头部"X-CSRFToken"

<script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
<script src="/static/plugin/jquery/jquery.cookie.js"></script>
<script type="text/javascript">
	var csrftoken = $.cookie('csrftoken');

	function csrfSafeMethod(method) {
		// these HTTP methods do not require CSRF protection
		return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
	}
	$.ajaxSetup({
		beforeSend: function(xhr, settings) {
			if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
				xhr.setRequestHeader("X-CSRFToken", csrftoken);
			}
		}
	});
</script>

3. 单独在Ajax请求中设置"X-CSRFToken"头部

<script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
<script src="/static/plugin/jquery/jquery.cookie.js"></script>
<script type="text/javascript">
	$.ajax({
	    headers:{"X-CSRFToken":$.cookie('csrftoken')},
	    ...
        })
</script>
相关文章
相关标签/搜索