首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 偵測 Web Server 類型:透過 HTTP Header 識別伺服器軟體

     編輯:PHP 相關知識

實作原理

HTTP 回應標頭中的 Server 欄位通常包含伺服器軟體名稱與版本(如 Apache/2.4.41 (Ubuntu)、nginx/1.18.0、Microsoft-IIS/10.0)。本文示範如何用 PHP Socket 連線取得此資訊。

核心函數

<?php
/**
 * 偵測遠端 Web Server 類型
 * @param string $host 目標主機(域名或 IP)
 * @param int $port 連接埠,預設 80
 * @param int $timeout 逾時秒數
 * @return string|false Server 標頭值或 false
 */
function detectWebServer($host, $port = 80, $timeout = 5) {
    $fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
    if (!$fp) return false;

    // 發送簡單 HEAD 請求
    $request = "HEAD / HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n";
    fwrite($fp, $request);

    $server = '';
    while (!feof($fp)) {
        $line = fgets($fp, 4096);
        if (stripos($line, 'Server:') === 0) {
            $server = trim(substr($line, 7));
            break;
        }
    }
    fclose($fp);
    return $server ?: false;
}

// 使用範例
$targets = ['www.google.com', 'www.apache.org', 'www.microsoft.com'];
foreach ($targets as $host) {
    $server = detectWebServer($host);
    echo "$host => " . ($server ? $server : 'Unknown') . "\n";
}
?>

進階版:支援 HTTPS 與完整 Header 解析

<?php
function getServerHeader($url) {
    $ctx = stream_context_create([
        'http' => ['method' => 'HEAD', 'timeout' => 5, 'ignore_errors' => true],
        'ssl'  => ['verify_peer' => false, 'verify_peer_name' => false]
    ]);
    $headers = @get_headers($url, 1, $ctx);
    if (!$headers) return false;
    return $headers['Server'] ?? $headers['server'] ?? false;
}

echo getServerHeader('https://www.php.net'); // 例:nginx
?>

注意事項與限制

  • 安全性:許多生產環境會隱藏或修改 Server 標頭(ServerTokens Prod、server_tokens off),僅顯示 Apache 或 nginx,甚至完全移除。
  • CDN/WAF 干擾:經過 Cloudflare、AWS CloudFront 等代理時,回傳的 Server 標頭通常是代理伺服器而非源站。
  • 非標準埠口:預設只掃 80/443,其他埠需指定。
  • 法律合規:未經授權掃描他人伺服器可能違反《電腦犯罪法》或服務條款,僅限自有資產或授權測試使用。

替代方案

  • nmap -sV:專業服務版本偵測工具。
  • whatweb、wappalyzer:指紋識別框架,綜合 Header、HTML、JS、Cookie 等特徵判斷技術棧。
  • PHP get_headers() 配合 stream_context 為最輕量的內建方案。

結語

透過 HTTP Server 標頭偵測伺服器類型簡單易行,但準確度受限於安全配置與代理層。實務上應結合多種指紋特徵綜合判斷,並注意法律與道德邊界。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved