利用 fsockopen() 函數(shù)開放端口掃描器的實(shí)例
1、前言
本文利用 fsockopen() 函數(shù),編寫一個(gè)功能簡(jiǎn)單的端口掃描器。
2、關(guān)鍵技術(shù)
本實(shí)例的端口號(hào)是固定的,通過對(duì)數(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,防止請(qǐng)求超時(shí)
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主機(jī)(hostname)不可訪問,將會(huì)拋出一個(gè)警告級(jí)別(E_WARNING)的錯(cuò)誤提示。所有需要加@
$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>端口號(hào)</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地址使用.分隔符
//這里沒有對(duì) 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)都是可以的,因?yàn)?key是對(duì)應(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,防止請(qǐng)求超時(shí)
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主機(jī)(hostname)不可訪問,將會(huì)拋出一個(gè)警告級(jí)別(E_WARNING)的錯(cuò)誤提示。所有需要加@
$result = $fp ? '<span >開啟</span>' : '<span >關(guān)閉</span>';
echo '<td>' . $result . '</td>';
echo '</tr>';
}
?>
</tbody>
</table>
</body>
</html>
</html> 
因?yàn)橥祽?,把頁面和結(jié)果都寫在一起了,布局就將就把。
4、主要函數(shù)介紹
4.1、fsockopen
根據(jù)一個(gè)主機(jī)名來創(chuàng)建一個(gè)連接,成功返回一個(gè)資源對(duì)象,失敗返回false;主機(jī)不可用是拋出一個(gè)警告
詳情參考:http://php.net/manual/en/function.fsockopen.php

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

