Django框架之csrf跨站請求

HuangQiaoqi發表於2024-03-25

【一】跨站請求偽造介紹

【1】引入

  • CSRF(Cross-Site Request Forgery)跨站請求偽造是一種常見的網路攻擊方式。
  • 攻擊者透過誘導受害者訪問惡意網站或點選惡意連結
    • 將惡意請求傳送到目標網站上
    • 利用受害者在目標網站中已登入的身份來執行某些操作
    • 從而達到攻擊的目的。

【2】舉例

  • 假設受害者在一家網銀網站上登入賬戶,然後繼續瀏覽其他網頁。
  • 同時,攻擊者透過電子郵件等方式向受害者傳送了一封包含惡意連結的郵件。
  • 當受害者點選該連結時,潛在的威脅就會變得非常現實。
  • 該連結指向一個由攻擊者操縱的網站,該網站上的惡意程式碼會自動向網銀網站傳送一個請求,請求轉賬到攻擊者的賬戶。
  • 由於受害者在網銀網站中已經登入,所以該請求會被認為是合法的,這樣攻擊者就可以成功地進行轉賬操作。

【3】保護措施

# 要保護自己免受CSRF攻擊,網站開發者可以採取以下措施:

# 1.使用CSRF令牌
在使用者的請求中新增隨機生成的令牌,並將該令牌儲存在使用者會話中。
每次提交請求時都會驗證該令牌,以確保請求是合法的。

# 2.啟用SameSite屬性:
將Cookie的SameSite屬性設定為Strict或Lax,以限制跨站請求。
這可以在一定程度上緩解CSRF攻擊。

# 3.嚴格驗證請求來源
伺服器端可以驗證請求的來源是否為預期的網站域名
例如檢查HTTP Referer頭部。

# 4.使用驗證碼
在敏感操作(如轉賬、更改密碼等)上使用驗證碼
增加使用者身份驗證的防護

【二】釣魚網站案例

  • 在早期的網站很容易出現釣魚詐騙網站的現象,就是釣魚頁面和真的頁面做的一模一樣,使用者在進行金額轉賬的時候,就會把錢打到陌生人的賬戶裡
  • 如果沒有csrf校驗,就很容易出現這個現象
  • 下面對這個現象做一個演示

【1】釣魚網站

【三】CSRF校驗

【1】介紹

  • csrf校驗是一種用於防止跨站請求偽造(Cross-Site Request Forgery)攻擊的安全措施。

【2】csrf校驗策略

  • csrf中介軟體會在使用者返回一個具有提交資料功能的頁面的時候給這個頁面加一個唯一標識
  • 當這個頁面朝後端傳送post請求的時候,我的後端會先校驗唯一標識,如果唯一標識不對會直接拒絕訪問,如果成功則正常執行

【四】POST請求校驗CSRF

【1】form表單校驗csrf

## 在form表單內加上 {% csrf_token %}

<form action="" method="post">
   {% csrf_token %}
    <p>轉賬物件: <input type="text" name="username"></p>
    <p>轉賬金額: <input type="text" name="money"></p>
    <p><input type="submit" value="轉賬"></p>
</form>

# 在瀏覽器訪問的時候會發現這個csrf變成了一個很長很長的字串,也就是唯一字串

【2】Ajax攜帶CSRF

## 來利用標籤查詢獲取頁面上的隨機字串
## 書寫的程式碼較長,不推薦
<script>
    $('#btn').on('click', function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {'name': 'hqq','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
            success: function (args) {

            }
        })
    })
</script>


## 利用模板語法
## 書寫的程式碼少了一些 但是再寫前後端分離的專案的時候無法使用模板語法,侷限性太大,不推薦
<script>
    $('#btn').on('click', function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {'name': 'hqq', 'csrfmiddlewaretoken':{% csrf_token %}},
            success: function (args) {

            }
        })
    })
</script>

相關文章