如何在Django中防止跨站指令碼攻擊(XSS)?


未能對使用者提交的文字進行適當轉義後再將其渲染到HTML中的Web應用程式容易受到跨站指令碼攻擊(XSS)的攻擊。攻擊者可以使用此方法將任意HTML注入您的網頁,通常以<script>元素的形式。

XSS攻擊經常被攻擊者用來竊取cookie和會話資訊,以及欺騙使用者向錯誤的人提供個人資訊。這也被稱為網路釣魚。我們將研究一個常見的案例,因為這種型別的攻擊可以採取許多不同的形式,並且幾乎有無限的變化。

讓我們考慮一個簡單的歡迎頁面。

#views.py
def welcome(request):
   name= request.GET(‘name’,’person’)
   return   render_to_response(“welcome.html”,{“name”:name}}

上面在views.py中顯示的程式碼只是使用GET引數讀取姓名並將姓名傳遞給welcome.html模板。

當用戶輸入他們的姓名(例如,tutorialspoint)時,上述程式碼在網頁上渲染HTML頁面時的輸出如下。

<h1>Welcome, tutorialspoint!</h1>

攻擊者在輸入時可能會發送惡意內容以及姓名。例如,攻擊者傳送的資料可能採用以下形式。

<h1> Welcome, <b>tutorialspoint</b></h1>

這裡的<b>,</b>標籤並非惡意程式碼,但其他內容可能會危害站點和資料。攻擊者可以包含一整套HTML程式碼,這些程式碼可以劫持您的頁面並顯示任意內容。這種型別的攻擊已被用來欺騙使用者將資料輸入到看起來像是他們銀行網站或電子商務網站的頁面中,但實際上是一個被XSS劫持的表單,該表單會將他們的銀行賬戶資訊提交給攻擊者。

防止XSS攻擊的解決方案

解決此攻擊的方法是簡單地轉義任何可能來自使用者的內容。

上面HTML頁面中的程式碼可以改寫如下,這可以提供一些針對XSS攻擊的安全保護。

<h1>Welcome, {{ name|escape }} !</h1>

無論對程式碼進行了哪些更改,即使避免XSS攻擊的解決方案是轉義使用者提供的內容,也沒有任何自動解決方案能夠始終100%地保護您的網站免受XSS攻擊。

修改Django以自動轉義在模板中顯示的所有變數的工作一直在進行中,但直到現在才完全完成。

到目前為止,Django的模板一直避免這種行為,因為它以一種微妙的方式改變了顯示變數的簡單方法。這是一個棘手的問題。雖然這與Django新增隱藏的隱式行為的核心價值觀相違背,但安全性也至關重要。將來,Django很有可能開發出自動轉義(或虛擬自動轉義)行為。

更新於:2022年9月2日

480 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.