首先我们要先弄清楚csrf是什么
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。(参考自百度百科)
所以django为了安全性的考虑我们就应该提交一个csrf 的 token 给django
django 怎么实现csrf验证的:
其实这是用django中的中间件在做的
django中的中间件有:
process_request
process_view
process_response
process_exception
process_render_template
django的中间件可以做:权限,用户登陆验证
其中Django的csrf验证是用到了 process_view函数来实现的
我们可以在Django项目的setting.py 文件中找到图中的中间键:
我们只需要注释掉红框中的内容就好了,这样在我们整个django项目中就可以屏蔽掉csrf的验证就不会报错了,但是这样做会影响到我们项目的安全性,所以这样做是不推荐的,接下里我推荐大家另外一种做法。
解决方法
首先在view里面, 引入装饰器
from django.views.decorators.csrf import csrf_exempt
然后我们再像下面一样在函数前面加上这个装饰器:
加上这个装饰器就能让这一个函数避免csrf验证从而报错,也能避免破坏全局的csrf验证从而影响我们项目的安全性的。
CBV模式下避免导致csrf验证
有的朋友可能不知道什么是FBV,和CBV是什么意思。
简单的说就是:我们在view中不是直接写函数,而是写类,类中有get post put 等函数,在类中加上:
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
class StudentsView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super(StudentsView, self).dispatch(request, *args, **kwargs)
def get(self, reuqest, *args, **kwargs):
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('post')
def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')
def put(self, request, *args, **kwargs):
return HttpResponse('PUT')
或者还有另外一种方法,直接把装饰器放在类的外面
@method_decorator(csrf_exempt, name='dispatch')
class StudentsView(View):
def get(self, reuqest, *args, **kwargs):
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('post')
def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')
def put(self, request, *args, **kwargs):
return HttpResponse('PUT')