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')
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>
打開第二個服務器,將端口號進行修改css
1 from django.shortcuts import render 2 3 # Create your views here. 4 5 def index(request): 6 return render(request ,'index.html')
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>