利用請求頭 Referer 實現訪問控制和權限管理

一、引言

在當今復雜的網絡環境中,確保應用程序的安全性至關重要。訪問控制和權限管理是保障系統安全的關鍵環節,而請求頭 Referer 可以作為一種有效的輔助手段來實現這一目標。通過分析請求的來源,我們能夠對請求進行篩選和限制,從而增強系統的安全性和數據的保密性。本文將深入探討如何利用請求頭 Referer 來實現訪問控制和權限管理,並提供相關的代碼示例及解釋。

利用請求頭 Referer 實現訪問控制和權限管理

二、請求頭 Referer 在訪問控制中的基本原理

請求頭 Referer 記錄了當前請求的來源頁面 URL。在訪問控制中,我們可以設定允許訪問的源頁面列表或規則,當接收到請求時,檢查請求頭 Referer 是否符合這些設定的條件。如果符合,則允許請求繼續進行;如果不符合,則拒絕訪問或采取其他相應的安全措施。

三、基於 Referer 的訪問控制實例及代碼解釋

(一)簡單的源域名白名單控制(Java Servlet 示例)

假設我們有一個 Web 應用程序,只允許來自特定域名(如 `qunapu.com` 和 `wap.qunapu.com`)的請求訪問某些敏感資源。以下是一個使用 Java Servlet 實現的示例代碼:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
public class RefererBasedAccessControlServlet extends HttpServlet {
    // 允許的源域名列表
    private static final List<String> ALLOWED_DOMAINS = new ArrayList<>();
    static {
        ALLOWED_DOMAINS.add("qunapu.com");
        ALLOWED_DOMAINS.add("wap.qunapu.com");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String referer = request.getHeader("Referer");
        if (referer!= null) {
            try {
                URL refererUrl = new URL(URLDecoder.decode(referer, "UTF-8"));
                String refererHost = refererUrl.getHost();
                // 檢查 Referer 主機名是否在允許的域名列表中
                if (ALLOWED_DOMAINS.contains(refererHost)) {
                    // 允許訪問,繼續處理業務邏輯
                    // 這裏可以添加實際的業務處理代碼,例如返回敏感資源數據
                    response.getWriter().println("Access Granted. You can access the protected resource.");
                } else {
                    // 拒絕訪問,返回錯誤信息
                    response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied. Invalid Referer.");
                }
            } catch (Exception e) {
                // 如果解析 Referer 出現錯誤,也拒絕訪問
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid Referer format.");
            }
        } else {
            // 如果沒有 Referer 頭,拒絕訪問
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing Referer.");
        }
    }
}

在上述代碼中:

- 首先定義了一個靜態的 `ALLOWED_DOMAINS` 列表,用於存儲允許的源域名。

- 在 `doGet` 方法中,獲取請求頭 `Referer` 的值。如果不為空,則將其解碼並解析為 `URL` 對象,獲取其主機名 `refererHost`。

- 接著檢查 `refererHost` 是否在 `ALLOWED_DOMAINS` 列表中。如果在列表中,說明請求來自允許的源域名,允許訪問並可以繼續進行業務邏輯處理(這裏簡單地返回了允許訪問的信息);如果不在列表中或者解析過程出現錯誤,就拒絕訪問並返回相應的錯誤信息給客戶端。

(二)基於路徑的 Referer 訪問控制(Python Flask 示例)

考慮一個更復雜的場景,我們不僅要檢查源域名,還要根據 Referer 的路徑來確定訪問權限。例如,只允許來自 `qunapu.com` 域名下的 `/admin` 路徑的請求訪問特定的管理接口。以下是使用 Python Flask 框架實現的示例代碼:

from flask import Flask, request, abort
app = Flask(__name__)
@app.route('/protected_resource', methods=['GET'])
def protected_resource():
    referer = request.headers.get('Referer')
    if referer:
        from urllib.parse import urlparse
        parsed_referer = urlparse(referer)
        referer_domain = parsed_referer.netloc
        referer_path = parsed_referer.path
        # 檢查源域名和路徑是否符合要求
        if referer_domain == "qunapu.com" and referer_path.startswith("/admin"):
            # 允許訪問,返回相關數據
            return "Access Granted. You can access the protected resource."
        else:
            # 拒絕訪問
            abort(403)
    else:
        # 沒有 Referer 頭,拒絕訪問
        abort(400)

在這個代碼中:

- 使用 `Flask` 框架創建了一個簡單的 Web 應用,並定義了一個 `/protected_resource` 路由。

- 在路由處理函數中,獲取請求頭 `Referer`。通過 `urllib.parse.urlparse` 函數解析 `Referer`,得到源域名 `referer_domain` 和路徑 `referer_path`。

- 然後檢查 `referer_domain` 是否為 `qunapu.com` 且 `referer_path` 是否以 `/admin` 開頭。如果滿足條件,允許訪問並返回相應信息;否則,使用 `abort` 函數返回 403 錯誤(禁止訪問),如果沒有 `Referer` 頭則返回 400 錯誤(錯誤請求)。

四、結合其他安全機制使用 Referer

雖然請求頭 Referer 可以在一定程度上輔助訪問控制和權限管理,但它並不是一種絕對可靠的安全機制。攻擊者可能會偽造 Referer 頭信息來繞過訪問限制。因此,在實際應用中,應該將其與其他安全機制(如用戶認證、令牌驗證、加密等)結合使用,以提高系統的整體安全性。

例如,可以先要求用戶進行登錄認證,獲取合法的令牌。在後續的請求中,除了檢查 Referer 頭,還驗證令牌的有效性。只有當 Referer 符合要求且令牌有效時,才允許訪問敏感資源。

五、總結

請求頭 Referer 為訪問控制和權限管理提供了一種有價值的手段,通過合理設置基於 Referer 的規則和檢查邏輯,能夠有效地限制請求的來源,保護系統資源免受非法訪問。然而,我們必須清楚地認識到它的局限性,並結合其他安全措施構建多層次的安全防護體系。在開發應用程序時,應根據具體的業務需求和安全要求,靈活運用 Referer 以及其他安全技術,確保系統的安全性和可靠性,為用戶提供安全的網絡環境和優質的服務體驗。 

分享給朋友:

“利用請求頭 Referer 實現訪問控制和權限管理” 的相關文章

mark元素使用紅色代表及例子

mark元素使用紅色代表及例子

在 HTML 中,<mark> 元素用於標記或突出顯示文本中的重要或關鍵內容。為了提高用戶瀏覽體驗,這些文本內容通常被渲染成鮮艷的紅色,因為紅色是視覺上最吸引人的顏色之一。 舉個例子,在一篇文章中,我們可能會用 <mark> 標記來標記一段關鍵文字,如下所示:<…

mark元素使用紅色代表及例子

mark元素使用紅色代表及例子

在HTML中,<mark> 元素可以用於標記或強調文本中的重要或關鍵內容。這個元素通常會用醒目的紅色來渲染,因為紅色是一個視覺上非常具有註意力的顏色。在這種情況下,你可以將這些關鍵字用 <mark> 標簽包圍起來,使其突出顯示。這樣可以幫助用戶更快速地發現這個型號是這個品牌的…

視頻嵌入代碼,簡單的 video 嵌入代碼例子

視頻嵌入代碼,簡單的 video 嵌入代碼例子

視頻嵌入代碼,簡單的 video 嵌入代碼例子:- height:視頻高度。- controls:為 true 時,添加視頻控制條。- source:指定視頻文件路徑和類型,可支持多種類型。- Your browser does not support the video tag:如果用戶的瀏覽器不…

用html和CSS3制作酷炫的導航欄代碼及例子

用html和CSS3制作酷炫的導航欄代碼及例子

使用HTML5和CSS3的新特性可以制作出很多酷炫的導航欄效果,例如下拉菜單、響應式導航欄、帶有動態效果的導航欄等等。下面以下拉菜單為例,具體步驟如下:1. 創建 HTML 結構;2. 設置基本樣式;3. 添加動態效果。這樣就可以制作出下拉菜單效果,當滑鼠懸停在菜單項上時,菜單項下面的下拉菜單顯示出…

學習html網頁制作模板代碼怎麼寫

學習html網頁制作模板代碼怎麼寫

HTML網頁制作模板代碼是用來定義網頁結構、內容和樣式的基礎代碼。以下是一個簡單的HTML網頁制作模板代碼的示例。通過這個模板代碼,你可以定義一個基本的網頁結構,以及樣式和導航等元素,讓你的網頁更加美觀和易於導航。通過這個適應式的模板代碼,你的網頁能夠在不同設備的屏幕上具有更好的用戶體驗,適應不同的…

doctype html的作用及代碼例子

doctype html的作用及代碼例子

在 HTML5 中,`<!doctype html>` 是一個非常簡單的聲明,因為已經沒有了其他HTML標準版本或者XML文檔類型定義的支持。此外,這個文檔類型聲明也非常簡短,易於理解和記憶。關於 `<!doctype html>` 的作用:1. 瀏覽器使用指定的文檔類型來解…