第九章 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 v2

urlpatterns = [
    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 views

urlpatterns = [
    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.html

A)釣魚網站發起請求(注意端口)

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM