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

打開第二個服務器,將端口號進行修改css

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
相關文章
相關標籤/搜索