現代應用程式開發中,安全性至關重要。本文從應用層授權的概念出發,探討如何定義角色、許可權,並實施授權控制。接著介紹 OAuth 2 授權框架的運作流程,說明如何使用授權碼、令牌交換等機制保護資源。此外,文章也涵蓋了常見的網路安全威脅,例如 XSS、CSRF、SQL 注入、開放重定向等,並提供相應的防禦策略。最後,文章也介紹瞭如何在 Django 和 Python 環境中使用相關工具和套件,例如 Django OAuth Toolkit、requests-oauthlib 和 Django-CORS-HEADERS,強化應用程式的安全性和可靠性。

10 授權

授權是確保使用者只能存取自己被允許的資源的一個機制。它通常根據使用者的角色、許可權等因素進行控制。

實作授權的步驟

  1. 定義角色和許可權:根據系統的需求定義不同的角色和許可權。
  2. 組態使用者角色:為每個使用者組態相應的角色。
  3. 實施授權控制:在系統中實施授權控制,確保使用者只能存取自己被允許的資源。

應用層授權

授權是應用程式安全的重要組成部分,涉及控制使用者對資源的存取。這一章節將探討授權的基本概念、實作授權的不同方法,以及相關的最佳實踐。

10.1 應用層授權

在應用層授權中,授權是根據使用者的角色或許可權進行的。這意味著使用者根據其角色或許可權被授予存取特定資源或執行特定操作的許可權。

許可權

許可權是授權的基本單位,定義了使用者可以對資源執行的操作。例如,使用者可能具有「讀取」或「寫入」檔案的許可權。

使用者和群組管理

使用者和群組管理是授權的重要組成部分。使用者可以被組織成群組,每個群組都有一套許可權。這使得管理使用者許可權變得更加容易。

10.2 強制授權

強制授權是指在應用程式中實施授權機制,以控制使用者對資源的存取。有兩種方法可以實施強制授權:低階別的硬方式和高階別的簡單方式。

低階別的硬方式

低階別的硬方式涉及在應用程式程式碼中實施授權機制。這種方法需要大量的程式碼和複雜的邏輯,但提供了高度的控制和靈活性。

高階別的簡單方式

高階別的簡單方式涉及使用現有的授權框架或函式庫。這種方法更容易實施和維護,但可能不提供與低階別方法相同的控制和靈活性。

條件渲染

條件渲染是指根據使用者的許可權動態渲染應用程式的UI。這使得使用者只能看到他們有許可權存取的資源和操作。

測試授權

測試授權是指測試應用程式的授權機制,以確保其正確性和安全性。這涉及測試不同的使用者角色和許可權,以確保授權機制按預期工作。

10.3 反模式和最佳實踐

反模式是指授權實施中常見的錯誤或不良做法。最佳實踐是指授權實施中推薦的方法和技術。這些包括使用現有的授權框架、實施強制授權和定期測試授權機制。

OAuth 2

OAuth 2是一種廣泛使用的授權框架,提供了一種標準化的方法來授權使用者存取資源。

11.1 授權型別

OAuth 2定義了四種授權型別:授權碼流、隱式授權、資源擁有者密碼憑證流和客戶端憑證流。

授權碼流

授權碼流是OAuth 2中最常用的授權型別。它涉及使用者授權應用程式存取其資源,然後應用程式使用授權碼換取存取令牌。

11.2 Bob授權Charlie

Bob授權Charlie是OAuth 2授權流程的例子。Bob是使用者,Charlie是應用程式。Bob授權Charlie存取其資源,然後Charlie使用授權碼換取存取令牌。

請求授權

請求授權是指Bob請求Charlie存取其資源的過程。這涉及Bob授權Charlie存取其資源,然後Charlie將Bob重定向到授權伺服器。

授權

授權是指Bob授權Charlie存取其資源的過程。這涉及Bob授權Charlie存取其資源,然後授權伺服器將授權碼傳送給Charlie。

令牌交換

令牌交換是指Charlie使用授權碼換取存取令牌的過程。這涉及Charlie將授權碼傳送給授權伺服器,然後授權伺服器將存取令牌傳送給Charlie。

存取受保護資源

存取受保護資源是指Charlie使用存取令牌存取Bob資源的過程。這涉及Charlie將存取令牌傳送給資源伺服器,然後資源伺服器將資源傳送給Charlie。

Django OAuth Toolkit

Django OAuth Toolkit 是一個根據 Django 的 OAuth 2.0 框架,提供了快速簡單的方式來實作 OAuth 2.0 授權伺服器和資源伺服器。

授權伺服器責任

授權伺服器負責管理使用者的授權和許可權,包括:

  • 處理使用者的登入和登出
  • 管理使用者的許可權和角色
  • 發放和管理授權令牌

資源伺服器責任

資源伺服器負責保護和提供資源,包括:

  • 驗證使用者的授權令牌
  • 提供資源和 API

requests-oauthlib

requests-oauthlib 是一個根據 requests 的 OAuth 1.0/a 和 OAuth 2.0 的客戶端函式庫,提供了簡單的方式來實作 OAuth 授權流程。

OAuth 客戶端責任

OAuth 客戶端負責向授權伺服器請求授權和許可權,包括:

  • 向授權伺服器請求授權令牌
  • 處理授權伺服器的回應和錯誤

工作與作業系統

檔案系統授權

檔案系統授權是指程式存取檔案系統的許可權,包括:

  • 讀取和寫入檔案
  • 刪除和重新命名檔案

請求授權

請求授權是指程式請求使用者授權存取檔案系統,包括:

  • 請求使用者授權存取檔案
  • 處理使用者的回應和錯誤

工作與暫存檔案

工作與暫存檔案是指程式存取暫存檔案的許可權,包括:

  • 讀取和寫入暫存檔案
  • 刪除和重新命名暫存檔案

工作與檔案系統許可權

工作與檔案系統許可權是指程式存取檔案系統的許可權,包括:

  • 讀取和寫入檔案
  • 刪除和重新命名檔案

呼叫外部可執行檔

呼叫外部可執行檔是指程式呼叫外部程式或指令,包括:

  • 使用內部 API 呼叫外部程式
  • 使用 subprocess 模組呼叫外部程式

永不信任輸入

永不信任輸入是指程式永遠不應該信任使用者的輸入,包括:

  • 驗證使用者的輸入
  • 處理使用者輸入的錯誤和異常
import os
import subprocess

# 檔案系統授權
def ask_permission(file_path):
    try:
        with open(file_path, 'r') as file:
            # 讀取檔案
            content = file.read()
            return content
    except PermissionError:
        # 處理許可權錯誤
        print("無法存取檔案")
        return None

# 工作與暫存檔案
def work_with_temp_files():
    try:
        # 建立暫存檔案
        temp_file = tempfile.TemporaryFile()
        # 寫入暫存檔案
        temp_file.write(b"Hello World")
        # 讀取暫存檔案
        temp_file.seek(0)
        content = temp_file.read()
        return content
    except Exception as e:
        # 處理錯誤
        print(f"發生錯誤:{e}")
        return None

# 呼叫外部可執行檔
def invoke_external_executable():
    try:
        # 使用 subprocess 呼叫外部程式
        subprocess.run(["ls", "-l"])
    except Exception as e:
        # 處理錯誤
        print(f"發生錯誤:{e}")

# 永不信任輸入
def never_trust_input(user_input):
    try:
        # 驗證使用者輸入
        if not user_input:
            raise ValueError("使用者輸入無效")
        # 處理使用者輸入
        return user_input
    except Exception as e:
        # 處理錯誤
        print(f"發生錯誤:{e}")
        return None

網路安全威脅與防禦策略

13.1 套件管理中的安全性:Pipenv

在 Python 的開發中,Pipenv 是一個流行的套件管理工具,能夠有效地管理專案的依賴關係。然而,在使用 Pipenv 時,也需要注意安全性問題。例如,確保只從可信的來源安裝套件,以避免潛在的安全風險。

13.2 YAML 遠端程式碼執行的風險

YAML 是一種常用的資料序列化格式,但它也可能被用於遠端程式碼執行(RCE)的攻擊。這是因為 YAML 可以包含任意的程式碼,包括系統命令。因此,在處理未知來源的 YAML 資料時,需要小心以避免執行惡意程式碼。

13.3 XML 實體擴充套件攻擊

XML 實體擴充套件是一種攻擊手法,透過在 XML 檔案中定義實體,並使其擴充套件為大量的內容,從而導致目標系統的資源耗盡。這種攻擊包括二次方爆炸攻擊(Quadratic blowup attack)和十億笑攻擊(Billion laughs attack)。

  • 二次方爆炸攻擊:這種攻擊是透過在 XML 檔案中定義一個實體,並使其參考自己,從而導致實體的內容呈二次方增長,最終導致系統資源耗盡。
  • 十億笑攻擊:這是一種特殊的二次方爆炸攻擊,透過定義一個實體,並使其包含大量的笑臉符號(:lol:),從而導致系統嘗試解析這些實體時耗盡資源。

13.4 服務拒絕攻擊

服務拒絕攻擊(Denial of Service, DoS)是指攻擊者透過傳送大量請求或資料包使目標系統無法正常運作,從而導致服務無法使用。這種攻擊可以透過多種方式實作,包括但不限於流量攻擊、資源耗盡攻擊等。

13.5 Host Header 攻擊

Host Header 攻擊是指攻擊者透過修改 HTTP 請求中的 Host 項,嘗試欺騙伺服器以為請求來自不同的主機或網域名稱。這種攻擊可以用於實作跨站點指令碼攻擊(XSS)、伺服器端請求偽造(SSRF)等。

13.6 開放重定向攻擊

開放重定向攻擊(Open Redirect)是指攻擊者透過建構特殊的 URL,使使用者被重定向到惡意網站。這種攻擊可以用於實作網路釣魚攻擊等。

13.7 SQL 注入攻擊

SQL 注入攻擊是指攻擊者透過在應用程式的輸入中注入惡意的 SQL 程式碼,從而實作未經授權的資料存取或修改。這種攻擊可以分為兩類:

  • 原始 SQL 查詢:攻擊者直接注入 SQL 程式碼以實作攻擊。
  • 資料函式庫連線查詢:攻擊者透過注入 SQL 程式碼,實作對資料函式庫的非法存取或修改。

14 跨站點指令碼攻擊

跨站點指令碼攻擊(Cross-Site Scripting, XSS)是指攻擊者透過注入惡意的指令碼程式碼,使其在使用者的瀏覽器中執行,從而實作攻擊。XSS 可以分為三種:

  • 永續性 XSS:攻擊者注入的程式碼被儲存到伺服器上,從而影響所有存取該頁面的使用者。
  • 反射性 XSS:攻擊者注入的程式碼被立即反射回使用者的瀏覽器中,通常透過 URL 引數實作。
  • 根據 DOM 的 XSS:攻擊者注入的程式碼在使用者端執行,通常透過操縱網頁的 DOM 結構實作攻擊。

14.2 輸入驗證

輸入驗證是防禦 XSS 攻擊的一種重要手段。透過驗證使用者的輸入內容,可以防止惡意程式碼的注入。輸入驗證可以在伺服器端或使用者端實作,目的是確保所有使用者輸入的資料都是安全的。

網頁安全:跨站請求偽造(CSRF)和內容安全政策(CSP)

什麼是跨站請求偽造?

跨站請求偽造(Cross-Site Request Forgery, CSRF)是一種網頁安全漏洞,攻擊者可以透過偽造請求,讓使用者在不知不覺中執行非預期的動作。例如,當使用者登入某個網站後,攻擊者可以透過 CSRF 技術,讓使用者執行非預期的動作,例如轉帳或修改密碼。

Django 中的 CSRF 保護

Django 提供了一個內建的 CSRF 保護機制,透過在表單中新增一個隱藏的 token 欄位,來驗證請求的合法性。當使用者提交表單時,Django 會驗證 token 的合法性,如果 token 不合法,則會丟擲一個 Forbidden 錯誤。

內容安全政策(CSP)

內容安全政策(Content Security Policy, CSP)是一種網頁安全機制,透過定義哪些內容可以在網頁中執行,來防止 XSS 攻擊。CSP 可以定義哪些來源可以載入哪些型別的內容,例如 JavaScript、CSS、圖片等。

CSP 的組成

CSP 由多個指令組成,每個指令定義了一個特定的安全政策。常見的指令包括:

  • default-src:定義預設的內容來源
  • script-src:定義可以執行的 JavaScript 來源
  • style-src:定義可以載入的 CSS 來源
  • img-src:定義可以載入的圖片來源

Django 中的 CSP 實作

Django 提供了一個 django-csp 套件,透過設定 CSP 政策,來保護網頁的安全。使用 django-csp 可以定義 CSP 政策,並自動在網頁中新增相應的 meta 標籤。

個別化的 CSP 政策

在某些情況下,可能需要為每個使用者定義個別化的 CSP 政策。這可以透過使用 django-cspcsp_nonce 功能,為每個使用者生成一個唯一的 token,並在 CSP 政策中使用此 token。

CSP 違規報告

當 CSP 政策被違規時,瀏覽器會向伺服器傳送一個報告,包含違規的詳細資訊。這可以透過設定 report-uri 指令,來定義報告的傳送位置。

CSP 等級 3

CSP 等級 3 是 CSP 的最新版本,提供了更多的功能和安全性。CSP 等級 3 可以透過設定 Content-Security-Policy-Report-Only 標頭,來啟用 CSP 等級 3 的功能。

# Django 中的 CSP 實作
from django.middleware.security import ContentSecurityPolicy

csp_policy = {
    'default-src': ["'self'"],
    'script-src': ["'self'", 'https://cdn.example.com'],
    'style-src': ["'self'", 'https://cdn.example.com'],
    'img-src': ["'self'", 'https://cdn.example.com'],
}

ContentSecurityPolicy(csp_policy)

網路安全:會話管理和跨源資源分享

會話管理

會話管理是網路安全中的重要組成部分,涉及管理使用者的會話ID、狀態和其他相關資料。會話管理的目的是確保使用者的會話是安全的,防止未經授權的存取。

會話ID管理

會話ID是用於唯一標識使用者會話的字串。會話ID應該是隨機生成的,且不應該包含任何敏感資訊。會話ID的管理包括生成、儲存和刪除會話ID。

狀態管理規範

狀態管理規範是指用於管理使用者會話狀態的規則和流程。狀態管理規範應該包括使用者登入、登出和會話超時等情況的處理。

HTTP方法驗證

HTTP方法驗證是指驗證HTTP請求方法是否合法。常見的HTTP方法包括GET、POST、PUT、DELETE等。驗證HTTP方法可以防止惡意請求。

Referer標頭驗證

Referer標頭驗證是指驗證HTTP請求的Referer標頭是否合法。Referer標頭包含了請求的來源URL。驗證Referer標頭可以防止跨站點請求偽造(CSRF)攻擊。

Referrer-Policy回應標頭

Referrer-Policy回應標頭是指用於控制瀏覽器傳送Referer標頭的回應標頭。Referrer-Policy回應標頭可以設定為不同的值,以控制瀏覽器傳送Referer標頭的行為。

CSRF令牌

CSRF令牌是指用於防止跨站點請求偽造(CSRF)攻擊的令牌。CSRF令牌應該是隨機生成的,且不應該包含任何敏感資訊。

POST請求

POST請求是指使用HTTP POST方法傳送的請求。POST請求通常用於提交表單資料。

其他不安全請求方法

其他不安全請求方法包括PUT、DELETE等。這些方法也可能被用於提交資料,需要進行驗證和授權。

跨源資源分享

跨源資源分享(CORS)是指允許瀏覽器從不同的源傳送請求。CORS可以用於實作跨站點的API呼叫。

同源政策

同源政策是指瀏覽器只允許從相同源傳送請求。同源政策可以防止跨站點請求偽造(CSRF)攻擊。

簡單CORS請求

簡單CORS請求是指不需要預檢請求的CORS請求。簡單CORS請求通常用於GET、POST等方法。

CORS與Django-CORS-HEADERS

Django-CORS-HEADERS是指用於Django框架的CORS中介軟體。Django-CORS-HEADERS可以用於組態CORS的回應標頭。

組態Access-Control-Allow-Origin

Access-Control-Allow-Origin是指用於組態CORS的回應標頭。Access-Control-Allow-Origin可以設定為不同的值,以控制瀏覽器傳送請求的行為。

預檢CORS請求

預檢CORS請求是指需要預檢請求的CORS請求。預檢請求通常用於PUT、DELETE等方法。

傳送預檢請求

傳送預檢請求是指瀏覽器傳送預檢請求給伺服器。預檢請求用於驗證伺服器是否允許跨源請求。

傳送預檢回應

傳送預檢回應是指伺服器傳送預檢回應給瀏覽器。預檢回應用於通知瀏覽器是否允許跨源請求。

深入剖析網路安全的核心議題後,我們可以發現,從應用程式層的授權控管、OAuth 2 的授權框架,到檔案系統許可權、外部程式呼叫,以及抵禦各類網路攻擊的策略,安全防護是一個涵蓋多個層面且環環相扣的系統工程。多維比較分析顯示,低階別的硬式授權控制能提供更精細的許可權管理,但高階別的簡單方式則更易於實施和維護,技術團隊需要根據實際需求權衡利弊。此外,YAML、XML 等資料格式的安全性風險,以及 DoS、Host Header、開放重定向、SQL 注入、XSS 和 CSRF 等攻擊手法,都突顯了「永不信任輸入」原則的重要性。從技術演進角度來看,隨著攻擊手段日趨複雜,安全防禦也需要不斷進化,例如 CSP 等級 3 的出現,以及更精細的 CORS 設定,都體現了網路安全技術的持續發展趨勢。玄貓認為,建立縱深防禦體系,並將安全意識融入軟體開發的每個環節,才是確保系統穩固的長遠之計。