zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    js中用setTimeout写定时炸弹
    javascript函数的形参和实参
    在Mac OS X中配置Apache+PHP+MySQL(转)
    600多万用户密码使用次数统计分析程序
    pgsql数据库创建以及压缩包形式导入导出
    apache中的.htaccess配置示例收集整理
    收集常用的正则表达式及其应用
    采用htpasswd设置验证机制
    用apache做代理时候,可设置请求头信息
    ubuntu在混合环境中创建和配置文件共享
  • 原文地址:https://www.cnblogs.com/xiongying4/p/11587826.html
Copyright © 2011-2022 走看看