码迷,mamicode.com
首页 > 其他好文 > 详细

csrf跨站请求伪造

时间:2019-09-25 22:25:32      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:添加   val   ===   bst   block   受益人   break   NPU   输入   

跨站请求伪造简介

钓鱼网站

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

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

内部原理

在让用户输入对方账户的那个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跨站请求伪造

标签:添加   val   ===   bst   block   受益人   break   NPU   输入   

原文地址:https://www.cnblogs.com/xiongying4/p/11587826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!