1、前言
本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。
2、关键技术
本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,则该端口处于开放状态,否则该端口处于关闭状态。
核心代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
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、代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
<!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>
|
1
|
</html> <img php" id="highlighter_532620">
4、主要函数介绍 4.1、fsockopen 根据一个主机名来创建一个连接,成功返回一个资源对象,失败返回false;主机不可用是抛出一个警告 详情参考:http://php.net/manual/en/function.fsockopen.php
以上这篇利用 fsockopen() 函数开放端口扫描器的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。 原文链接:http://www.cnblogs.com/ImCehnyx/archive/2017/08/18/7392605.html 延伸 · 阅读
精彩推荐
|