利用 fsockopen() 函數(shù)開放端口掃描器的實例
1、前言
本文利用 fsockopen() 函數(shù),編寫一個功能簡單的端口掃描器。
2、關(guān)鍵技術(shù)
本實例的端口號是固定的,通過對數(shù)組的遍歷,利用 fsockopen() 函數(shù)連接,如果連接成功,則該端口處于開放狀態(tài),否則該端口處于關(guān)閉狀態(tài)。
核心代碼如下:
foreach ($port as $key => $value) {
echo '<tr>';
echo '<td>' . $key . '</td>';
echo '<td>' . $value . '</td>';
echo '<td>' . $msg[$key] . '</td>';
//$errno 和 $errstr 在這里基本用不上,只是為了設(shè)置 timeout,防止請求超時
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主機(jī)(hostname)不可訪問,將會拋出一個警告級別(E_WARNING)的錯誤提示。所有需要加@
$result = $fp ? '<span >開啟</span>' : '<span >關(guān)閉</span>';
echo '<td>' . $result . '</td>';
echo '</tr>';
}
3、代碼如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>端口掃描</title>
<style type="text/css">
td{
padding:10px;
border-bottom:1px solid #eee;
}
</style>
</head>
<body>
<form method="post" action='#'>
網(wǎng)址/ip:<input type="text" name="ip" value="<?php echo $_POST['ip'] ?? '127.0.0.1'?>">
<button>掃描</button>
</form>
<table>
<thead>
<tr>
<td>id</td>
<td>端口號</td>
<td>服務(wù)</td>
<td>開啟狀態(tài)</td>
</tr>
</thead>
<tbody>
<?php
$ip = $_POST['ip'] ?? '127.0.0.1';
if(ip2long($ip)){
$aIp = explode('.', $ip);//ip4地址使用.分隔符
//這里沒有對 0.0.0.0 這種本機(jī)地址進(jìn)行判斷,只是粗略的判斷ip是否合法
foreach ($aIp as $key => $value) {
if($value < 0 || $value > 255){
die('地址不合法');
}
}
}
$port = array(
21,
23,
25,
79,
80,
110,
135,
137,
138,
139,
143,
443,
445,
1433,
3306,
);
$msg = array(
'Ftp',
'Telnet',
'Smtp',
'Finger',
'Http',
'Pop3',
'Location Service',
'Netbios-NS',
'Netbios-DGM',
'Netbios-SSN',
'IMAP',
'Https',
'Microsoft-DS',
'MSSQL',
'MYSQL',
'Terminal Services'
);
//無論使用prot還是msg循環(huán)都是可以的,因為$key是對應(yīng)的,都是索引數(shù)組
foreach ($port as $key => $value) {
echo '<tr>';
echo '<td>' . $key . '</td>';
echo '<td>' . $value . '</td>';
echo '<td>' . $msg[$key] . '</td>';
//$errno 和 $errstr 在這里基本用不上,只是為了設(shè)置 timeout,防止請求超時
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主機(jī)(hostname)不可訪問,將會拋出一個警告級別(E_WARNING)的錯誤提示。所有需要加@
$result = $fp ? '<span >開啟</span>' : '<span >關(guān)閉</span>';
echo '<td>' . $result . '</td>';
echo '</tr>';
}
?>
</tbody>
</table>
</body>
</html>
</html> 
因為偷懶,把頁面和結(jié)果都寫在一起了,布局就將就把。
4、主要函數(shù)介紹
4.1、fsockopen
根據(jù)一個主機(jī)名來創(chuàng)建一個連接,成功返回一個資源對象,失敗返回false;主機(jī)不可用是拋出一個警告
詳情參考:http://php.net/manual/en/function.fsockopen.php

以上這篇利用 fsockopen() 函數(shù)開放端口掃描器的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Laravel中獲取路由參數(shù)Route Parameters的五種方法示例
這篇文章主要給大家介紹了關(guān)于Laravel中獲取路由參數(shù)Route Parameters的五種方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-09-09
PHP微信開發(fā)之根據(jù)用戶回復(fù)關(guān)鍵詞\位置返回附近信息
這篇文章主要為大家詳細(xì)介紹了PHP微信開發(fā)之簡單實現(xiàn)根據(jù)用戶回復(fù)關(guān)鍵詞\位置返回附近信息 ,感興趣的小伙伴們可以參考一下2016-06-06
Laravel jwt 多表(多用戶端)驗證隔離的實現(xiàn)
這篇文章主要介紹了Laravel jwt 多表(多用戶端)驗證隔離的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Yii數(shù)據(jù)模型中rules類驗證器用法分析
這篇文章主要介紹了Yii數(shù)據(jù)模型中rules類驗證器用法,結(jié)合實例形式分析了rules類驗證器的簡單使用方法,代碼注釋中包含了相關(guān)方法的使用說明,需要的朋友可以參考下2016-07-07
phpStudy2018安裝教程及本地服務(wù)器的配置方法
phpStudy 2018是一款非常強(qiáng)大的php環(huán)境調(diào)試工具,一次性安裝,無須配置即可使用,是非常方便、好用的PHP調(diào)試環(huán)境。這篇文章主要介紹了phpStudy2018安裝教程及本地服務(wù)器的配置方法,需要的朋友可以參考下2018-03-03

