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


Posted in PHP onAugust 19, 2017

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() 函数开放端口扫描器的实例

以上这篇利用 fsockopen() 函数开放端口扫描器的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP中的integer类型使用分析
Jul 27 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
php4与php5的区别小结(配置异同)
Dec 20 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
php实现微信公众号无限群发
Oct 11 PHP
thinkphp实现分页显示功能
Dec 03 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
Feb 15 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
Laravel 添加多语言提示信息的方法
Sep 29 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 #PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 #PHP
详解PHP如何更好的利用PHPstorm的自动提示
Aug 18 #PHP
Laravel学习教程之本地化模块
Aug 18 #PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 #PHP
Laravel学习教程之路由模块
Aug 18 #PHP
Django中的cookie与session操作实例代码
Aug 17 #PHP
You might like
综合图片计数器
2006/10/09 PHP
PHP微信支付开发实例
2016/06/22 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
JS继承 笔记
2011/07/13 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python列表操作实例
2015/01/14 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python 中的 else详解
2016/04/23 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
中英文求职信范文
2014/01/27 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
安全检查管理制度
2014/02/02 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
给朋友的赠语
2015/06/23 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
redis lua限流算法实现示例
2022/07/15 Redis