17
2017
08

利用 fsockopen() 函数开放端口扫描器

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 style="color:red">开启</span>' : '<span style="color:red">关闭</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, 
					3389
				);
				$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 style="color:red">开启</span>' : '<span style="color:red">关闭</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

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。