在沒有專用工具的環境下(如網吧),若能透過網頁直接進行連接埠掃描,將大幅提升便利性。本文分享一個以 PHP 實作的線上連接埠掃描器,展示如何利用 fsockopen() 函式偵測遠端主機連接埠狀態,並分析其單線程架構帶來的效能限制。
掃描器分為兩個階段:
<?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);
}
}
?>
pcntl_fork)或非阻塞 I/O(stream_set_blocking + stream_select),或轉向 Go、Python 等支援並發的語言。未經授權掃描他人主機連接埠可能違反法律(如《電腦犯罪條例》)與網路道德。本程式僅供教學與自有設備測試使用,請勿用於非法用途。實際部署時應加入存取控制(如 IP 白名單、驗證碼、速率限制),防止濫用。
PHP 線上連接埠掃描器展示了 Web 語言在網路安全領域的潛力,雖受限於單線程效能,但為無工具環境提供了「即開即用」的便利方案。理解其原理有助於深入掌握網路協定與 PHP 網路程式設計。