csrf跨站请求伪造

跨站请求伪造简介

钓鱼网站

通过制作一个跟正儿八经的网站一模一样的页面,骗取用户输入信息 转账交易从而做手脚

例如:转账交易的请求确确实实是发给了中国银行,账户的钱也是确确实实少了,唯一不一样的地方在于收款人账户不对

内部原理

在让用户输入对方账户的那个input上面做手脚

给这个input不设置name属性,在内部隐藏一个实现写好的name和value属性的input框

这个value的值 就是钓鱼网站受益人账号

钓鱼网站设计

先制作一个正规的网站,在制作一个钓鱼网站,然后钓鱼网站再从html访问正规的网站地址,在input框中做手脚

设置value的值为钓鱼网站受益人账号

正儿八经的网站

views.py

urls.py

正规网站的xx.html

钓鱼网站

views.py

urls.py

钓鱼网站的xx.html

防止钓鱼网站方式

防止钓鱼网站的思路

网站会给返回给用户的form表单页面 偷偷塞一个随机字符串

请求到来的时候 会先比对随机字符串是否一致  如果不一致  直接拒绝(403)

该随机字符串有以下特点

1.同一个浏览器每一次访问都不一样

2.不同浏览器绝对不会重复

第一种方法

正规网站中form表单发送post请求的时候(csrf中间件就不需要注释了)

添加:

{% csrf_token %}

第二种方法

ajax发送post请求 如何避免csrf校验

1.先在页面上写{% csrf_token %},利用标签查找  获取到该input键值信息

2.直接书写'{{ csrf_token }}'

3.你可以将该获取随机键值对的方法 写到一个js文件中,之后只需要导入该文件即可

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('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);
    }
  }
});
js文件

跨站请求伪造相关装饰器

csrf_exempt(不校验)

csrf_protect(需要校验)

如果是csrf_protect 那么有三种方式

需要导入的模块

from django.utils.decorators import method_decorator

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

 第一种方式

@method_decorator(csrf_protect,name='post')  # 有效的

 第二种方式

@method_decorator(csrf_protect)  # 有效的

def post(self,request):

  return HttpResponse('post')

第三种方式

@method_decorator(csrf_protect)

def dispatch(self, request, *args, **kwargs): 

  res = super().dispatch(request, *args, **kwargs)
  return res
def get(self,request):

  return HttpResponse('get')

如果是csrf_exempt 只有两种(只能给dispatch装) 特例

@method_decorator(csrf_exempt,name='dispatch')  # 第二种可以不校验的方式
            class MyView(View):
                # @method_decorator(csrf_exempt)  # 第一种可以不校验的方式
                def dispatch(self, request, *args, **kwargs):
                    res = super().dispatch(request, *args, **kwargs)
                    return res

                def get(self,request):
                    return HttpResponse('get')

                def post(self,request):
                    return HttpResponse('post')
原文地址:https://www.cnblogs.com/xiongying4/p/11587826.html