利用請求頭 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元素的主要功能及在HTML5 中的使用mark元素例子

mark元素的主要功能及在HTML5 中的使用mark元素例子

`<mark>` 元素的主要功能是突出顯示文本中的重要部分或關鍵字。在 HTML5 標準中,`<mark>` 元素用於標記一個文檔或一個段落中需要突出顯示的文本。一旦在 HTML 文件中使用了 `<mark>` 元素,瀏覽器通常會使用黃色背景標記該元素的文本,在頁面渲染上具有很好的效果。`<mark>` 元素還可以用於添加額外的視覺標識,以使讀者更快地識別重要內容。通過指定不同的顏色樣式,可以將文本突出顯示,以吸引讀者的註意力。…

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

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

在 HTML 中,<mark> 元素用於標記或突出顯示文本中的重要或關鍵內容。為了提高用戶瀏覽體驗,這些文本內容通常被渲染成鮮艷的紅色,因為紅色是視覺上最吸引人的顏色之一。 舉個例子,在一篇文章中,我們可能會用 <mark> 標記來標記一段關鍵文字,如下所示:<p>這篇文章將會介紹如何使用 <mark>CSS</mark> 實現代碼高亮顯示。</p >在這個例子中,我們使用 <mark> 標記來突出顯示關鍵詞 "CSS",這使得讀者可以更容易地識別出本文的主題和關鍵內容。…

meter元素顏色,可以使用CSS樣式來設置顏色

meter元素顏色,可以使用CSS樣式來設置顏色

meter元素可以用於表示已知範圍內的度量值,可以使用CSS樣式來設置顏色。具體來說,可以使用 <code>::-webkit-meter-optimum-value, ::-moz-meter-bar, ::-webkit-meter-bar</code> 偽元素來設置顏色。下面的例子中,我們將 <code>meter</code>。上述代碼中,當 <code>meter</code> 元素的值在80時,最優值(optimum)的顏色為綠色;當值落在0~80之間時,表格的顏色為灰色。可以按照自己的需求設置這些顏色值。…

HTML標簽屬性大全及代碼例子

HTML標簽屬性大全及代碼例子

在HTML中,屬性是在標簽中使用的特殊命令,它們提供了額外的信息以更好地描述標簽的內容和行為。屬性名表示該屬性的名稱,而屬性值表示該屬性要設置的值。HTML標簽屬性有很多種類和用途,它們可以影響標簽的內容、顏色、尺寸、超鏈接、樣式、表單等方面。一些常見的HTML標簽屬性包括:class、id、style、href、src、alt、disabled、checked、selected等等。在學習HTML標簽屬性時,需要註意一些細節和常見錯誤。總而言之,HTML標簽屬性是控制網頁顯示和行為的重要方式。HTML標簽屬性是可以用於定義HTML元素的附加信息。…

html零基礎入門教程及代碼演示例子

html零基礎入門教程及代碼演示例子

HTML是創建網頁的基礎語言。在互聯網的世界裏,網頁是我們獲取信息和與世界連接的主要途徑之一。因此,學習HTML是設計和制作網頁的重要一步。如果您是一個完全零基礎的人,那麼這份教程可以幫助您快速入門,並開始創建自己的網頁。在這個教程中,我們將探討HTML的基礎語法和標記,以及如何將它們組合在一起來構建一個簡單的網頁。無需任何預備知識,您只需要在計算機上安裝一個文本編輯器和瀏覽器,就可以開始學習HTML。讓我們開始!…

html5自學教程步驟及代碼例子

html5自學教程步驟及代碼例子

HTML5是最新的HTML標準,具有更多的功能和特性,讓網頁的制作更加靈活和多樣化。以下是HTML5自學教程的一些步驟:1. 學習HTML基礎知識。在深入學習HTML5之前,你需要先學習HTML的基礎知識,包括HTML文件結構、標簽、屬性和元素等。2. 熟悉HTML5的新特性。HTML5相比於之前的版本有許多新特性,如視頻和音頻標簽、畫布、地理位置、本地存儲等等。3. 編寫示例代碼。理論不如實踐,通過編寫一些簡單的網頁示例代碼,你可以更好地熟悉HTML5的知識點和語法規則。…