1、前言
本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。
2、关键技术
本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,则该端口处于开放状态,否则该端口处于关闭状态。
核心代码如下:
foreach ($port as $key => $value) {
echo "<tr>";
echo "<td>" . $key . "</td>";
echo "<td>" . $value . "</td>";
echo "<td>" . $msg[$key] . "</td>";
//$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
$result = $fp ? "<span >开启</span>" : "<span >关闭</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="#">
网址/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>服务</td>
<td>开启状态</td>
</tr>
</thead>
<tbody>
<?php
$ip = $_POST["ip"] ?? "127.0.0.1";
if(ip2long($ip)){
$aIp = explode(".", $ip);//ip4地址使用.分隔符
//这里没有对 0.0.0.0 这种本机地址进行判断,只是粗略的判断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循环都是可以的,因为$key是对应的,都是索引数组
foreach ($port as $key => $value) {
echo "<tr>";
echo "<td>" . $key . "</td>";
echo "<td>" . $value . "</td>";
echo "<td>" . $msg[$key] . "</td>";
//$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
$result = $fp ? "<span >开启</span>" : "<span >关闭</span>";
echo "<td>" . $result . "</td>";
echo "</tr>";
}
?>
</tbody>
</table>
</body>
</html>
</html>
因为偷懒,把页面和结果都写在一起了,布局就将就把。
4、主要函数介绍
4.1、fsockopen
根据一个主机名来创建一个连接,成功返回一个资源对象,失败返回false;主机不可用是抛出一个警告
详情参考:http://php.net/manual/en/function.fsockopen.php
以上这篇利用 fsockopen() 函数开放端口扫描器的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持网页设计。