Django跨域请求CSRF的方法示例
web跨域请求
1.为什么要有跨域限制
举个例子:
1.用户登录了自己的银行页面http://mybank.com,http://mybank.com向用户的cookie中添加用户标识。
2.用户浏览了恶意页面http://evil.com。执行了页面中的恶意AJAX请求代码。
3.http://evil.com向http://mybank.com发起AJAXHTTP请求,请求会默认把http://mybank.com对应cookie也同时发送过去。
4.银行页面从发送的cookie中提取用户标识,验证用户无误,response中返回请求数据。此时数据就泄露了。
5.而且由于Ajax在后台执行,用户无法感知这一过程。
以上就是所谓是CSRF(Cross-siterequestforgery)攻击,跨站请求伪造。接下来说一下Django中处理csrf的方式
正常情况下直接发起一个psot请求,会报错。错误的意思是csrf校验失败,request请求被丢弃掉。
那么在django中的post失败有两种解决办法:
解决办法一:将csrf中间层注释掉
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的校验,但如前面所述,这是一种不安全的行为。而且djano也不推荐使用
解决办法二:
在前面的提示中有这样一句话:
{%csrf_token%}
也就是说在网页中加入csrf_token的标签就可以通过csrf校验
Django提供的CSRF防护机制:
1、django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个token,把这个token放在cookie里。然后每次POST请求都会带上这个token,这样就能避免被CSRF攻击。
2、在返回的HTTP响应的cookie里,django会为你添加一个csrftoken字段,其值为一个自动生成的token,在所有的POST表单时,必须包含一个csrfmiddlewaretoken字段(只需要在模板里加一个tag,django就会自动帮你生成,见下面)
3、在处理POST请求之前,django会验证这个请求的cookie里的csrftoken字段的值和提交的表单里的csrfmiddlewaretoken字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的csrf攻击,返回403Forbidden.
4、在所有ajaxPOST请求里,添加一个X-CSRFTOKENheader,其值为cookie里的csrftoken的值
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。