1、前言
本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。
2、关键技术
本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,则该端口处于开放状态,否则该端口处于关闭状态。
核心代码如下:
foreach ($port as $key => $value) {
echo '
';echo '
' . $key . '';echo '
' . $value . '';echo '
' . $msg[$key] . '';//$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
$result = $fp ? '开启' : '关闭';
echo '
' . $result . '';echo '
';}
3、代码如下
端口扫描td{
padding:10px;
border-bottom:1px solid #eee;
}
网址/ip:
扫描
id端口号服务开启状态
$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 '
';echo '
' . $key . '';echo '
' . $value . '';echo '
' . $msg[$key] . '';//$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
$fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
$result = $fp ? '开启' : '关闭';
echo '
' . $result . '';echo '
';}
?>