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

PHP 線上連接埠掃描器實作與原理解析

     編輯:PHP 相關知識

在沒有專用工具的環境下(如網吧),若能透過網頁直接進行連接埠掃描,將大幅提升便利性。本文分享一個以 PHP 實作的線上連接埠掃描器,展示如何利用 fsockopen() 函式偵測遠端主機連接埠狀態,並分析其單線程架構帶來的效能限制。

程式架構與流程

掃描器分為兩個階段:

  1. 輸入階段:顯示表單讓使用者輸入目標 IP,並自動偵測訪客自身 IP。
  2. 掃描階段:驗證 IP 格式合法性後,遍歷預定義連接埠陣列,嘗試建立 TCP 連線,依結果顯示開啟/關閉狀態與對應服務名稱。

核心程式碼片段

<?php
// IP 格式驗證
$ips = explode(".", $remoteip);
if (intval($ips[0]) < 1 || intval($ips[0]) > 255 || 
    intval($ips[3]) < 1 || intval($ips[3]) > 255 ||
    intval($ips[1]) < 0 || intval($ips[1]) > 255 ||
    intval($ips[2]) < 0 || intval($ips[2]) > 255) {
    die("IP 地址不合法");
}

// 定義掃描目標連接埠與服務對照
$port = [21, 23, 25, 79, 80, 110, 135, 137, 138, 139, 143, 443, 445, 1433, 3306, 3389];
$msg = ['FTP', 'Telnet', 'SMTP', 'Finger', 'HTTP', 'POP3', 'Location Service', 
        'NetBIOS-NS', 'NetBIOS-DGM', 'NetBIOS-SSN', 'IMAP', 'HTTPS', 'Microsoft-DS', 
        'MSSQL', 'MySQL', 'Terminal Services'];

// 逐一嘗試連線
for ($i = 0; $i < count($port); $i++) {
    $fp = @fsockopen($remoteip, $port[$i], $errno, $errstr, 1); // 1秒逾時
    if (!$fp) {
        echo "連接埠 {$port[$i]} ({$msg[$i]}):關閉";
    } else {
        echo "連接埠 {$port[$i]} ({$msg[$i]}):開啟";
        fclose($fp);
    }
}
?>

關鍵技術點解析

  • fsockopen():PHP 建立網路連線的核心函式,支援 TCP/UDP。若在指定逾時內成功建立連線,代表該連接埠開放。
  • IP 驗證邏輯:將 IP 以點號分割為四段,依 IPv4 規範檢查各段數值範圍(第一/四段 1-255,第二/三段 0-255)。
  • 單線程瓶頸:PHP 預設單線程執行,掃描 16 個連接埠需循序等待,每個最多阻塞 1 秒,總耗時可達十餘秒。若需提升速度,須改用多進程(如 pcntl_fork)或非阻塞 I/O(stream_set_blocking + stream_select),或轉向 Go、Python 等支援並發的語言。

安全性與倫理提醒

未經授權掃描他人主機連接埠可能違反法律(如《電腦犯罪條例》)與網路道德。本程式僅供教學與自有設備測試使用,請勿用於非法用途。實際部署時應加入存取控制(如 IP 白名單、驗證碼、速率限制),防止濫用。

總結

PHP 線上連接埠掃描器展示了 Web 語言在網路安全領域的潛力,雖受限於單線程效能,但為無工具環境提供了「即開即用」的便利方案。理解其原理有助於深入掌握網路協定與 PHP 網路程式設計。

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