yaya

今天也要加油鸭!!!

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

 

posted @ 2019-06-23 23:14  Tiffany'.'  阅读(258)  评论(0编辑  收藏  举报