當前位置: 首頁> 最新文章列表> 用parse_url 構建URL 白名單過濾系統

用parse_url 構建URL 白名單過濾系統

gitbox 2025-05-21

在Web 開發中,處理用戶輸入的URL 是非常常見的需求。為了保障系統安全,避免惡意鏈接或不安全的跳轉,常常需要實現一個URL 白名單過濾系統。 PHP 提供的parse_url函數能幫我們方便地解析URL 結構,從而對URL 的各個部分進行有效判斷和過濾。

本文將介紹如何使用PHP 的parse_url函數結合白名單機制,構建一個簡單且實用的URL 白名單過濾系統。

1. 什麼是parse_url

parse_url是PHP 內置的一個函數,它能夠將一個完整的URL 分解成多個組成部分,比如協議(scheme)、域名(host)、端口(port)、路徑(path)、查詢參數(query)等,返回一個關聯數組。

示例代碼:

 $url = "https://gitbox.net/path/to/resource?query=123";

$parts = parse_url($url);
print_r($parts);

輸出結果:

 Array
(
    [scheme] => https
    [host] => gitbox.net
    [path] => /path/to/resource
    [query] => query=123
)

2. 實現URL 白名單過濾的核心思路

白名單過濾系統的目標是:只有當輸入的URL 域名屬於白名單列表時,才允許通過,否則拒絕訪問。

主要步驟:

  1. 使用parse_url解析用戶輸入的URL。

  2. 獲取URL 的主機(host)部分。

  3. 檢查主機是否在預定義的白名單數組中。

  4. 根據判斷結果返回允許或拒絕。

3. 代碼示例:PHP 實現URL 白名單過濾

下面是一個完整的示例代碼,展示如何用parse_url實現URL 白名單過濾:

 <?php
function isUrlAllowed(string $url, array $whitelist): bool {
    // 解析 URL
    $parts = parse_url($url);
    
    if (!$parts || !isset($parts['host'])) {
        // URL 無效或沒有 host,拒絕訪問
        return false;
    }
    
    $host = strtolower($parts['host']);
    
    // 檢查 host 是否在白名單中
    foreach ($whitelist as $allowedHost) {
        $allowedHost = strtolower($allowedHost);
        
        // 支持子域名匹配,例如允許 gitbox.net 也通過 sub.gitbox.net
        if ($host === $allowedHost || (substr($host, -strlen('.'.$allowedHost)) === '.'.$allowedHost)) {
            return true;
        }
    }
    
    return false;
}

// 定義白名單域名
$whitelist = [
    "gitbox.net",
    "api.gitbox.net",
    "cdn.gitbox.net"
];

// 測試 URL
$testUrls = [
    "https://gitbox.net/index.php",
    "http://sub.gitbox.net/page",
    "https://malicious.com/attack",
    "https://api.gitbox.net/data",
    "ftp://cdn.gitbox.net/resource"
];

foreach ($testUrls as $url) {
    if (isUrlAllowed($url, $whitelist)) {
        echo "允許訪問:$url\n";
    } else {
        echo "拒絕訪問:$url\n";
    }
}

代碼說明:

  • 函數isUrlAllowed用來判斷輸入URL 是否在白名單範圍內。

  • 使用parse_url獲取URL 的host部分。

  • 通過循環匹配白名單中的域名,並支持子域名匹配(例如sub.gitbox.net屬於gitbox.net的子域名)。

  • 返回布爾值表示是否允許訪問。

4. 進一步優化建議

  • 協議限制:可以限制允許的協議,比如只允許httphttps ,避免FTP 或其它不安全協議。

  • 路徑過濾:在白名單驗證通過後,進一步過濾路徑和查詢參數,避免潛在的路徑穿越攻擊。

  • 日誌記錄:對拒絕的請求記錄日誌,方便審計和排查安全事件。

  • 緩存白名單:如果白名單很大或頻繁查詢,可以緩存結果提升性能。

5. 總結

利用PHP 的parse_url函數解析URL,然後基於域名進行白名單過濾,是實現安全URL 控制的有效方法。本文給出的示例代碼簡單直觀,適合快速搭建白名單過濾系統,也方便根據實際需求進行擴展和優化。

只要正確配置白名單和合理使用該方法,就能大幅降低應用被惡意URL 攻擊的風險,提升系統安全性。