ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CSRF 跨站

2019-12-05 21:04:29  阅读:281  来源: 互联网

标签:跨站 CSRF cookie csrf exempt method name


目录

CSRF

跨站请求伪造

    CSRF全称为Cross-site request forgery,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

  CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

CsrfViewMiddleware的作用:
    在render返回页面的时候,在页面中塞了一个隐藏的input标签;当你提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求

跨站请求伪造csrf :
  1.网站的搭建 : 
    写一个跟正规网站一模一样的页面;用户输入用户名 密码 对  方账户 转账金额提交,请求确实是朝银行的接口发送的 钱也扣了
 但是对方账户变了 变成了钓鱼网站自己提前设置好的账户
    
  2,钓鱼网站功能的实现 : 
    填写form表单的时候 让用户填写的对方账户input并没有name属性,是你自己在内部偷偷隐藏了一个具有name属性的input框,并且value值是你自己的账户 然后将该标签隐藏了

解决跨站伪造问题:

解决跨站问题 : 
    1.让服务端只处理本网站发送的post请求
    2.识别判断当前请求是否是本网张发出的

    网站在返回给用户一个form表单的时候 会自动在该表单隐藏一个input框;框的value是一个随机字符串 但是网站能够记住每一个浏览器发送的随机字符串

from 表单发送 POST请求:

<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>target_account:<input type="text" name="target_user"></p>
    <p>money:<input type="text" name="money"></p>
    <input type="submit">
</form>


ajax 发送 POST请求:

    先在页面任意的位置上书写
    { % csrf_token %}
    
1.方式1
    通过标签查找获取随机字符串添加到data自定义对象即可
    data: {'username': 'jason', 'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},

2.方式2
    data: {'username': 'jason', 'csrfmiddlewaretoken': '{{ csrf_token }}'},

3.方式3   
    直接兴建js文件拷贝代码,导入即可
    csrf.js文件 

csrf 相关的装饰器:

#1. FBV模型:
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# @csrf_exempt  # 不校验 csrf(中间件)
    def index(request):
        return HttpResponse('index') 
    
# @csrf_protect  # 校验
    def login(request):
        return HttpResponse('login')

# 2. CBV模型:
    
    from django.utils.decorators import method_decorator

 1.# @method_decorator(csrf_exempt,name='xxx')  # csrf_exempt  不支持装饰  

 2.@method_decorator(csrf_exempt,name='dispatch')  # csrf_exempt  支持装饰 dispatch
class HomeView(View):

    # @method_decorator(csrf_exempt)  # 支持装饰
    def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)

    # @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
    def post(self,request):
        return HttpResponse('OK')


总结 : csrf_exempt这个装饰器只能给dispatch装才能生效
       csrf_protect方式全都可以跟普通的装饰器装饰CBV一致

csrf.js文件:

# ajax  csrf.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);
    }
  }
});

标签:跨站,CSRF,cookie,csrf,exempt,method,name
来源: https://www.cnblogs.com/shaozheng/p/11991863.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有