csrf跨站请求伪造

Posted xiongying4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于csrf跨站请求伪造的主要内容,如果未能解决你的问题,请参考以下文章

CSRF跨站请求伪造

Django--CSRF 跨站请求伪造

CSRF跨站请求伪造

跨站请求伪造CSRF原理

对CSRF(跨站请求伪造)的理解

21)django-csrf(跨站请求伪造)