第九章 Django框架——csrf请求伪造和csrf_token使用
?第九章 Django框架——csrf請求偽造和csrf_token使用
?
一、csrf請求偽造
二、csrf_token使用
三、簡單的csrf_token應用
四、Ajax使用csrf_token
?
一、csrf請求偽造
什么是csrf(what):
CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。
?
簡單解釋:
釣魚網站的頁面和正經網站的頁面對瀏覽器來說有什么區別? (頁面是怎么來的?)
①釣魚網站的頁面是由 釣魚網站的服務端給你返回的
②正經網站的網頁是由 正經網站的服務端給你返回的
?
從django中看csrf:
①前文中提到每次創建django后,都要進入settings.py文件內注釋掉這行內容
②那我們如果不注釋掉這行內容,提交數據的話會有什么效果
原因:django做了限制,在沒有設置cookie的情況下,會拒絕訪問
?
模擬釣魚網站攻擊
正經網站
①文件是直接在別的項目里新建寫的,所以會有多余代碼,忽略即可,直接找transfer
②網址:127.0.0.1,端口8000
③注釋掉上文提到的settings.py里面的csrf
from django.conf.urls import url from django.contrib import admin from app01 import views from app02 import views as v2urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^ajax_test/', views.ajax_test),url(r'^ajax_add/', views.ajax_add),url(r'^test/', views.test),url(r'^ajax_post/', views.ajax_post),url(r'^ajax_add3/', views.ajax_add3),url(r'^login/',v2.login),url(r'^transfer/',v2.transfer) ] urls.py def transfer(request):if request.method == 'POST':from_ = request.POST.get('from')to_ = request.POST.get('to')money = request.POST.get('money')print("{}給{}轉賬{}".format(from_,to_,money))return HttpResponse("轉賬成功")return render(request,'transfer.html') views.py <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>transfer</title> </head> <body> <h1>正經網站</h1> <form action="/transfer/" method="post"><p><input type="text" name="key" value="aaaaa" style="display: none"></p><p>轉出:<input type="text" name = 'from'>轉入:<input type="text" name = 'to'></p><p>金額:<input type="text" name="money"></p><p><input type="submit" value="轉賬"></p> </form> </body> </html> transfer.html正經網站轉賬結果 (這是正經網站的服務端)
?
釣魚網站
①文件是直接在別的項目里新建寫的,所以會有多余代碼,忽略即可,直接找transfer
②網址:127.0.0.1,端口8888
from django.conf.urls import url from django.contrib import admin from app01 import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^transfer/', views.transfer), ] urls.py from django.shortcuts import *# Create your views here.def transfer(request):return render(request,'transfer.html') views.py <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>transfer</title> </head> <body> <h1>釣魚網站</h1> <form action="http://127.0.0.1:8000/transfer/" method="post"><p>轉出:<input type="text" name = 'from'>轉入:<input type="text" name = ''><input type="text" name = 'to' style="display: none;" value="kkkkk"></p><p>金額:<input type="text" name="money"></p><p><input type="submit" value="轉賬"></p> </form> </body> </html> transfer.htmlA)釣魚網站發起請求(注意端口)
B)發送完畢,注意端口變化(注意端口)
?
?C)釣魚網站轉賬結果(這是正經網站服務端收到的信息)
?
原理:
?
?
二、csrf_token使用
所以django做了以下中間件,該中間件的作用是幫你生成特殊字符串,校驗特殊字符串,生成網頁的唯一標識,防止釣魚
?
?
如何使用:
①在網頁內form標簽內寫入{%csrf_token%}
?
②正經網站內會出現下面這段內容
③如果網頁form表單提交信息會帶著上圖的name也就是key和value一起提交到后端
④現在在用釣魚網站提交表單請求,結果如下
⑤正經網站提交的話,服務端和客戶端結果如下
客戶端
服務端
?
三、簡單的csrf_token應用
最簡單的應用:form表單內添加{%csrf_token%}
<form action="" method="post">{% csrf_token %}<p>用戶名:<input type="text" name="name"></p><p>密碼:<input type="text" name="password"></p><p><input type="submit"></p> </form>?
四、Ajax使用csrf_token
AJAX中應用(放在data里一起傳到后端):
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><script src="/static/jquery-3.3.1.js"></script><title>Title</title> </head> <body> <form action="" method="post">{% csrf_token %}<p>用戶名:<input type="text" name="name"></p><p>密碼:<input type="text" name="password" id="pwd"></p><p><input type="submit"></p> </form> <button class="btn">點我</button> </body> <script>$(".btn").click(function () {$.ajax({url: '',type: 'post',data: {'name': $('[name="name"]').val(),'password': $("#pwd").val(),'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()},success: function (data) {console.log(data)}})}) </script> </html>Cookie中的應用:
獲取cookie:document.cookie
是一個字符串,可以自己用js切割,也可以用jquery的插件
獲取cookie:$.cookie('csrftoken')
設置cookie:$.cookie('key','value')
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><script src="/static/jquery-3.3.1.js"></script><script src="/static/jquery.cookie.js"></script><title>Title</title> </head> <body> <form action="" method="post">{% csrf_token %}<p>用戶名:<input type="text" name="name"></p><p>密碼:<input type="text" name="password" id="pwd"></p><p><input type="submit"></p> </form> <button class="btn">點我</button> </body> <script>$(".btn").click(function () {var token=$.cookie('csrftoken')//var token='{{ csrf_token }}' $.ajax({url: '',headers:{'X-CSRFToken':token},type: 'post',data: {'name': $('[name="name"]').val(),'password': $("#pwd").val(),},success: function (data) {console.log(data)}})}) </script> </html>放在cookie里 View Code?
轉載于:https://www.cnblogs.com/neymargoal/p/9641853.html
總結
以上是生活随笔為你收集整理的第九章 Django框架——csrf请求伪造和csrf_token使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Apache配置虚拟主机时出现403
- 下一篇: vue中全局引入bootstrap.cs