CSRF

CSRF介绍

  • 英文:Cross Site Request Forgy
  • 中文:跨站请求伪造
  • 攻击者在其他的网站对目标网站产生了影响

CSRF攻击危害

  • 利用用户登录态
  • 用户不知情
  • 完成业务请求
  • 盗取用户资金(转账,消费)

钓鱼网站

就类似于你搭建了一个跟银行一模一样的web页面
用户在你的网站转账的时候输入用户名 密码 对方账户
银行里面的钱确实少了 但是发现收款人变了

最简单的原理

你写的form表单中 用户的用户名 密码都会真实的提交给银行后台
但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框
你自己提前写好了一个隐藏的带有name和value的input框

解决钓鱼网站的策略

只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串
当用户提交post请求的时候 我会自动先取查找是否有该随机字符串
如果有 正常提交
如果没有 直接报403

csrf_token

csrf_token 是为了防止csrf(跨站请求伪造),防止csrf的手段就有给form加个token。

更简单的说:就是防止黑客盗用你存在网站(cookie)上的账户密码和信息

csrf_token使用

form表单
    你在写的时候只需要加上一个
    {% csrf_token %}

        
ajax
	第一种  自己再页面上先通过{% csrf_token %}获取到随机字符串  然后利用标签查找 
data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
    第二种
data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
    第三种
        拷贝js文件

csrf_exempt

csrf_exempt  只有两种装饰的方式
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
# 第一种
# @method_decorator(csrf_exempt,name='dispatch')
class MyCsrf(View):
	# 第二种
	@method_decorator(csrf_exempt)
	def dispatch(self, request, *args, **kwargs):
		return super().dispatch(request,*args,**kwargs)
	def get(self,request):
		return HttpResponse('hahaha')
		
除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式
@method_decorator(csrf_protect,name='post')
class MyCsrf(View):
	@method_decorator(csrf_protect)
	def dispatch(self, request, *args, **kwargs):
		return super().dispatch(request,*args,**kwargs)
	def get(self,request):
		return HttpResponse('hahaha')

	@method_decorator(csrf_protect)
	def post(self,request):
		return HttpResponse('post')

原文地址:https://www.cnblogs.com/aden668/p/11766967.html