zoukankan      html  css  js  c++  java
  • csrf

    CSRF跨站请求伪造
    如何通过csrf校验
    <form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>money:<input type="text" name="money"></p>
    <p>对方账户:<input type="text" name="others"></p>
    <input type="submit">
    </form>
    <input type="hidden" name="csrfmiddlewaretoken" value="HHxKItr7Z17sZxCAtybnOeV5ne5K3xnvkymENCupB5ylL8h8kWBIiklm9K10paxE">

    ajax如何通过csrf校验
    # 通过jQuery标签查找获取csrfinput框的键值对,手动加到data参数里面
    $('button').click(function () {
    $.ajax({
    url:'',
    type:'post',
    data:{'name':'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
    success:function (data) {
    console.log(data)
    }
    })
    })

    局部使用与局部禁用csrf
    from django.views.decorators.csrf import csrf_exempt,csrf_protect

    @csrf_exempt
    def home(request):
    return HttpResponse('home')


    @csrf_protect
    def login(request):
    return HttpResponse('login')


    #csrf是给用户返回的form表单页面,用户需要提交数据的页面,给他偷偷的筛了一个键值对
    #给form表单页面,筛了一个input框,input框中name = csrf...等等,value是动态生成值
    #也就是说,每次提交的时候,我先获取我给你筛的这个input框里的name和值到底给我的相不相等
    #如果不相等,就把你forbidden掉,意味着你不是我网站出来的页面,相当于你这个页面是你自己写的页面
    #写好视图函数之后,还要再起一个django,两个服务器,别人的页面跟你写的页面肯定是两个不同的服务器
    #要写把scrf注掉
    #将新起的django的端口号该一下,然后将我这个diango的路径复制过去

    # 'django.middleware.csrf.CsrfViewMiddleware',
    # {% scrf_token %} form表单加上这个就算在settings里面加上
    # 'django.middleware.csrf.CsrfViewMiddleware',就不会报错了


     1 #scrif
     2 def index(request):
     3     print(123)
     4     username = request.POST.get('username')
     5     money = request.POST.get('money')
     6     others = request.POST.get('others')
     7     print(request.POST.get('name'))
     8     print('%s 给 %s 转了%s 钱' %(username,money,others))
     9     return render(request, 'index.html',locals())
    10 
    11 
    12 #这个网站,并不是整体都是要校验csrf的,有几个视图函数也能接受这个post请求,但是不需要
    13 #接受这个csrf_token,就有一个装饰器就不需要校验到csrf_token了
    14 
    15 from django.views.decorators.csrf import csrf_exempt,csrf_protect
    16 @csrf_exempt
    17 def home(request):
    18     return HttpResponse('home')  #一定要return一个HttpResponse对象
    19 
    20 
    21 #需要csrf校验的函数
    22 @csrf_protect
    23 def login(request):
    24     return HttpResponse('login')
    25 
    26 
    27 #CBV
    28 from django.utils.decorators import method_decorator
    29 
    30 #装饰csrf装饰器的时候,只有这两种写法
    31 @method_decorator(csrf_exempt,name='dispatch')  #第一种
    32 class Reg(View):
    33     @method_decorator(csrf_exempt)  #第二种
    34     def dispatch(self, request, *args, **kwargs):
    35         res = super().dispatch(request,*args,**kwargs)
    36         return res
    37     def get(self,request):
    38         return HttpResponse('get')
    39 
    40     def post(self,request):
    41         return HttpResponse('post')
    views.py
      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title>Title</title>
      6     <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
      7 
      8     <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
      9     <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
     10 
     11     <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
     12     <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>
     13 
     14     <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
     15     <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
     16 </head>
     17 <body>
     18 {#<h1>hello</h1>#}
     19 <h1>正经网站</h1>
     20 <!--csrif-->
     21 {#<form action="" method="post">#}
     22 {#    {% csrf_token %}#}
     23 {#    <!--hidden隐藏 name取的名字csrf.. value是随机字符串,#}
     24 {#    这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,#}
     25 {#    input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,#}
     26 {#    然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->#}
     27 {#    <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">#}
     28 {#    <p>username:<input type="text" name="username"></p>#}
     29 {#    <p>password:<input type="text" name="money"></p>#}
     30 {#    <p>对方账号:<input type="text" name="others"></p>#}
     31 {#    <input type="submit">#}
     32 {#</form>#}
     33 {#<button id="1">ajaz请求</button>#}
     34 {#<script>#}
     35 {#    $('#1').click(function(){#}
     36 {#        $.ajax({#}
     37 {#            url:'',#}
     38 {#            type:'post',#}
     39 {#            data:{'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},#}
     40 {#            success:function(data){#}
     41 {#                console.log(data) }#}
     42 {#        })#}
     43 {#    })#}
     44 {#</script>#}
     45 
     46 
     47 
     48 {#<!--没写 {% csrf_token %} 加装饰器的视图函数前端页面-->#}
     49 {#<form action="/home/" method="post">#}
     50 {#    <!--hidden隐藏 name取的名字csrf.. value是随机字符串,#}
     51 {#    这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,#}
     52 {#    input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,#}
     53 {#    然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->#}
     54 {#    <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">#}
     55 {#    <p>username:<input type="text" name="username"></p>#}
     56 {#    <p>password:<input type="text" name="money"></p>#}
     57 {#    <p>对方账号:<input type="text" name="others"></p>#}
     58 {#    <input type="submit">#}
     59 {#</form>#}
     60 {#<button id="1">ajaz请求</button>#}
     61 {#<script>#}
     62 {#    $('#1').click(function(){#}
     63 {#        $.ajax({#}
     64 {#            url:'',#}
     65 {#            type:'post',#}
     66 {#            data:{'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},#}
     67 {#            success:function(data){#}
     68 {#                console.log(data) }#}
     69 {#        })#}
     70 {#    })#}
     71 {#</script>#}
     72 
     73 
     74 {#<!--没写 {% csrf_token %} 加装饰器的视图函数前端页面(scrf_protect)-->#}
     75 <form action="/login/" method="post">
     76     <!--hidden隐藏 name取的名字csrf.. value是随机字符串,
     77     这个随机字符串是每次请求页面都会动态刷新,也就意味着你下次提交的时候,
     78     input里的值我后端可以拿到,拿到之后根据这个name拿到这个value,
     79     然后比对以下这个value跟我之前那个value访问的一不一样,如果不一样就forbidden掉-->
     80     <input type="text" hidden name="csrftoken" value="jdfverffsddkmcf">
     81     <p>username:<input type="text" name="username"></p>
     82     <p>password:<input type="text" name="money"></p>
     83     <p>对方账号:<input type="text" name="others"></p>
     84     <input type="submit">
     85 </form>
     86 <button id="1">ajaz请求</button>
     87 <script>
     88     $('#1').click(function(){
     89         $.ajax({
     90             url:'',
     91             type:'post',
     92             data:{'name':'jason','csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},
     93             success:function(data){
     94                 console.log(data) }
     95         })
     96     })
     97 </script>
     98 
     99 
    100 </body>
    101 </html>
    html

    打开第二个服务器,将端口号进行修改

    1 from django.shortcuts import render
    2 
    3 # Create your views here.
    4 
    5 def index(request):
    6     return render(request ,'index.html')
    Views.py
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6     <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
     7 
     8     <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
     9     <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    10 
    11     <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
    12     <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>
    13 
    14     <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
    15     <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
    16 </head>
    17 <body>
    18 <h1>钓鱼网站</h1>
    19 <form action="http://127.0.0.1:8000/index" method="post">
    20     <p>username:<input type="text" name="username"></p>
    21 
    22     <p>money:<input type="text" name="money"></p>
    23     <p>对方账号:<input type="text"></p>
    24         <input type="text" name="others" value="jason" style="display: none">
    25     <input type="submit">
    26 </form>
    27 
    28 </body>
    29 </html>
    index.html
  • 相关阅读:
    在HTML中使用css3实现雪人动画效果
    不一样的函数防抖和节流
    2020全球C++及系统软件技术大会成功落下帷幕
    详解flex布局做骰子案例
    LeetCode-环形链表|+环形链表||
    03:成绩排序
    02:奇数单增序列
    谁考了第k名
    【23.59%】【hdu 5883】The Best Path
    【30.53%】【hdu 5878】I Count Two Three
  • 原文地址:https://www.cnblogs.com/huangxuanya/p/11074854.html
Copyright © 2011-2022 走看看