Django—XSS及CSRF

来源:http://www.cnblogs.com/OldJack/archive/2017/06/28/7090406.html
-Advertisement-
Play Games

一、XSS 跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script代碼會被執行 ...


一、XSS

跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script代碼會被執行,從而達到惡意攻擊用戶的目的。

1. 工作流程

a. 惡意用戶,在一些公共區域(例如,建議提交表單或消息公共板的輸入表單)輸入一些文本,這些文本被其它用戶看到,但這些文本不僅僅是他們要輸入的文本,同時還包括一些可以在客戶端執行的腳本。如:

<script>
   this.document = "*********"; 
  alert(
'Not Safe'); </script>

b. 惡意提交這個表單

c. 其他用戶看到這個包括惡意腳本的頁面並執行,獲取用戶的cookie等敏感信息。

 

 

 2. 實例-未防範XSS攻擊

 1 pinglu = []     # 評論列表
 2 
 3 #提交表單
 4 def commit(request):
 5     if request.method == 'GET':
 6         return render(request, 'commit.html')
 7     else:
 8         com = request.POST.get('commit')
 9         pinglu.append(com)
10         return redirect('/index.html/')
11 
12 
13 #查看評論頁面
14 def index(request):
15     return render(request, 'index.html', {'commit': pinglu})
view.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>評論</h1>
 9 <form action="/commit.html/" method="post">
10     <input type="text" name="commit">
11     <input type="submit" value="sumbit"> {{ error }}
12 </form>
13 </body>
14 </html>
commit.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>評論</h1>
 9 {% for item in commit %}
10     <div>{{ item|safe }}</div>
11 {#    item後加safe,預設數據安全,django不會做特殊處理#}
12 {% endfor %}
13 </body>
14 </html>
index.html

以上實例中,若在commit.html頁面輸入以下內容並提交:

<script> alert('惡意腳本') </script>

則會在index頁面執行此行代碼,彈出警告框(若包含惡意代碼,則會執行)

3. 防範XSS攻擊

  • 最直接的方法就是對於無法控制的輸入在html頁面內不要使用safe
{#    <div>{{ item|safe }}</div>#}
    <div>{{ item }}</div>
  • 也可以在views里進行過濾,防止特殊字元提交到資料庫或網頁內
def commit(request):
    if request.method == 'GET':
        return render(request, 'commit.html')
    else:
        com = request.POST.get('commit')
        if '<script>' in com:    # 過濾“<script>”關鍵字,防止惡意代碼的提交
            return render(request, 'commit.html', {'error': '此條評論有毒,已被和諧'})
        else:
            pinglu.append(com)
            return redirect('/index.html/')

 

二、CSRF

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。

1. 工作流程

攻擊通過在授權用戶訪問的頁面中包含鏈接或者腳本的方式工作:

 

 2. django中如何防範

django為用戶實現防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求偽造功能有分為全局和局部。

全局:

  • 啟用中間件 django.middleware.csrf.CsrfViewMiddleware

 

局部:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
  • @csrf_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件
  • @csrf_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。

 3. django中的具體應用方法

  • form表單中添加{csrf_token %}

若form表單中未添加{csrf_token %},則會報403錯誤。

#settings.py中打開MIDDLEWARE設置
'django.middleware.csrf.CsrfViewMiddleware',
1 from django.shortcuts import render, HttpResponse, redirect
2 
3 def csrf_test(request):
4     if request.method == 'GET':
5         return render(request, 'csrf_test.html')
6     else:
7         return HttpResponse('ok')
views.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>csef_test</title>
 6 </head>
 7 <body>
 8 <form action="/csrf_test.html/" method="post">
 9     <input type="text" name="user" id="user">
10     <input type="submit" value="submit">
11 </form>
12 
13 </body>
14 </html>
csef_test.html

修改csef_test.html:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>csef_test</title>
 6 </head>
 7 <body>
 8 <form action="/csrf_test.html/" method="post">
 9     {% csrf_token %}
10     <input type="text" name="user" id="user">
11     <input type="submit" value="submit">
12 </form>
13 
14 </body>
15 </html>
form表單中添加{% csrf_token %}

  • 全站禁用,即將settings.py中的 'django.middleware.csrf.CsrfViewMiddleware' 註釋掉即可
  • 基於FBV視圖的局部禁用和使用
 1 #settings.py
 2 #啟用 'django.middleware.csrf.CsrfViewMiddleware',
 3 
 4 
 5 from django.views.decorators.csrf import csrf_exempt
 6 
 7 
 8 @csrf_exempt
 9 def csrf_test(request):
10     if request.method == 'GET':
11         return render(request, 'csrf_test.html')
12     else:
13         return HttpResponse('ok')
局部禁用
 1 #settings.py
 2 #禁用 #'django.middleware.csrf.CsrfViewMiddleware',
 3 
 4 
 5 from django.views.decorators.csrf import csrf_protect
 6 
 7 
 8 @csrf_protect
 9 def csrf_test(request):
10     if request.method == 'GET':
11         return render(request, 'csrf_test.html')
12     else:
13         return HttpResponse('ok')
局部使用
  •  基於CBV視圖的(只能局部使用或禁用類,不能在類方法里局部使用或禁用
 1 #settings.py
 2 #禁用    'django.middleware.csrf.CsrfViewMiddleware',
 3 
 4 
 5 from django.views import View
 6 from django.views.decorators.csrf import csrf_protect
 7 from django.utils.decorators import method_decorator
 8 
 9 
10 @method_decorator(csrf_protect, name='dispatch')
11 class Foo(View):
12     def get(self, request):
13         pass
14 
15     def post(self, request):
16         pass
局部使用
 1 #settings.py
 2 #啟用    'django.middleware.csrf.CsrfViewMiddleware',
 3 
 4 
 5 from django.views import View
 6 from django.views.decorators.csrf import csrf_exempt
 7 from django.utils.decorators import method_decorator
 8 
 9 
10 @method_decorator(csrf_exempt, name='dispatch')
11 class Foo(View):
12     def get(self, request):
13         pass
14 
15     def post(self, request):
16         pass
局部禁用
  • Ajax提交數據時,攜帶CSRF
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>csef_test</title>
 6 </head>
 7 <body>
 8 <form action="/csrf_test.html/" method="post">
 9     {% csrf_token %}
10     <input type="text" name="user" id="user">
11 {#    <input type="submit" value="submit">#}
12     <a onclick="submitForm();">Ajax提交表單</a>
13 </form>
14 
15 <script src="/static/jquery-3.2.1.js"></script>
16 <script>
17     function submitForm() {
18             var csrf = $("input[name='csrfmiddlewaretoken']").val()
19             var user = $("#user").val()
20             $.ajax({
21                 url: '/csrf_test.html/',
22                     type: 'POST',
23                     data: {"user": user, "csrfmiddlewaretoken": csrf},
24                     success: function (arg) {
25                             console.log(arg);
26           }
27             })
28   }
29 </script>
30 </body>
31 </html>
Ajax重寫csrf_test,html,csrf數據存放於data中
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>csef_test</title>
 6 </head>
 7 <body>
 8 <form action="/csrf_test.html/" method="post">
 9     {% csrf_token %}
10     <input type="text" name="user" id="user">
11 {#    <input type="submit" value="submit">#}
12     <a onclick="submitForm();">Ajax提交表單</a>
13 </form>
14 
15 <script src="/static/jquery-3.2.1.js"></script>
16 {#專門處理cookie的插件,提取cookie字元串#}
17 <script src="/static/jquery.cookie.js"></script>
18 
19 {#csrf數據放於data中#}
20 {#<script>#}
21 {#    function submitForm() {#}
22 {#            var csrf = $("input[name='csrfmiddlewaretoken']").val();#}
23 {#            var user = $("#user").val();#}
24 {#            $.ajax({#}
25 {#                url: '/csrf_test.html/',#}
26 {#                    type: 'POST',#}
27 {#                    data: {"user": user, "csrfmiddlewaretoken": csrf},#}
28 {#                    success: function (arg) {#}
29 {#                            console.log(arg);#}
30 {#          }#}
31 {#            })#}
32 {#  }#}
33 {#</script>#}
34 
35 {#csrf數據放於請求頭中#}
36 <script>
37     function submitForm() {
38             var csrf = $.cookie('csrftoken');
39             var user = $("#user").val();
40             $.ajax({
41                 url: '/csrf_test.html/',
42                     type: 'POST',
43                     headers: {'X-CSRFToken': csrf},
44                     data: {"user": user},
45                     success: function (arg) {
46                             console.log(arg);
47           }
48             })
49   }
50 </script>
51 
52 
53 
54 </body>
55 </html>
Ajax重寫csrf_test.html,csrf數據存放於headers中

註意:{csrf_token %}和cookie中的csrftoken值不一樣。

form表單中的隱藏csrf_token

 cookie中

 

 

 

參考資料:

1. http://www.cnblogs.com/wupeiqi/articles/5246483.html

2. http://baike.baidu.com/link?url=zgAGPI1IKiAXCgFLNPVNhmZJI5SP4omb3zHchzPLuivW7QDRDxmAUDt7ZA8aqNlr-YuKKgp4GRmIvXucHHsPkq

3. http://baike.baidu.com/link?url=TN7axYhM1xYyXqfjjxDglcNEVBKhuEKs-axcWfV8MnDC0om8slvw_V3Cw4RQJyrnJ9yEQvyAu8Ndf8yKzbj0YK


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目背景 在那遙遠的西南有一所學校 /*被和諧部分*/ 然後去參加該省省選虐場 然後某蒟蒻不會做,所以也出了一個字元串題: 題目描述 給你一個字元串a,每次詢問一段區間的貢獻 貢獻定義: 每次從這個區間中隨機拿出一個字元x,然後把x從這個區間中刪除,你要維護一個集合S 如果S為空,你rp減1 如果S ...
  • 之前,本想與客戶商量做幾張固定的報表予使用,結果發現客戶每個月都需要各種各樣的報表,所以我們做了個視窗用於直接執行SQL語句;數據量一開始並不是很大查詢出來的數據較少(約1~6W左右),所以剛開始幾個月很好用,查詢出來的數據直接從頁面複製下來貼到Excel做月報表,就這樣一年過去了,最近做三期,發現 ...
  • 對象屬性複製的三種方法: 1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties兩種方式 BeanUtils.copyProperties("轉換後的類", "要轉換的類"); //多一步類型轉換,比PropertyUtils效率 ...
  • 題目描述 N(2<=n<=200)個城市,M(1<=m<=40000)條無向邊,你要找T(1<=T<=200)條從城市1到城市N的路,使得最長的邊的長度最小,邊不能重覆用。 輸入輸出格式 輸入格式: 第1行三個整數N,M,T用空格隔開。 第2行到P+1行,每行包括三個整數Ai,Bi,Li表示城市Ai ...
  • 題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做游戲。這次,老師帶著同學們一起做傳球游戲。 游戲規則是這樣的:n個同學站成一個圓圈,其中的一個同學手裡拿著一個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的一個(左右任意),當老師在此吹哨子時,傳球停止,此時,拿著球沒有 ...
  • /* *在大不久前,我決定自學Java,關註了很多的公眾號、微博等。沒幾天我看到一個笑話: *晚上孩子哭了,老婆讓我去看看。 *我說:“不行,咱們的床是隊列,你先上的床就得你先下床。。。 *老婆說:NO NO No,是棧。 * 緊接著一腳踹到我的屁股上。 * 當時,看了評論,都是在說程式員夫妻歡樂多 ...
  • 題目描述 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。 面對海量租借教室的信息,我們自然希望編程解決這個問題。 我們需要處理接下來n天的借教室信息,其中第i天學校有ri個教室可供租借。共有 ...
  • 在我們做項目的過程中,我們會用到SmartGit這個軟體來將本地的MAVEN項目push到國內的碼雲(https://git.oschina.net)或者是國外的github網站進行項目的管理,這個時候需要用到Smartgit。但是SmartGit是收費的,可以30天的試用期,30天試用期過後,sm ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...