• PHP Socket编程 之 利用 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 >开启</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,
         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 >开启</span>' : '<span >关闭</span>';
         echo '<td>' . $result . '</td>';
         echo '</tr>';
        }
     
       ?>
      </tbody>
     </table>
    </body>
    </html>
    

    4、主要函数介绍

    4.1、fsockopen

    根据一个主机名来创建一个连接,成功返回一个资源对象,失败返回false;主机不可用是抛出一个警告

    详情参考:http://php.net/manual/en/function.fsockopen.php

  • 相关阅读:
    JMeter网站测试分析
    JMeter元件的作用域和执行顺序
    JMeter脚本录制
    认识Jmeter工具
    Fiddler 只取所需
    Fiddler设置代理(PC和Android)
    Fiddler获取https会话
    Fiddler 你需要了解的
    关于excel的导入导出
    第十章、random模块
  • 原文地址:https://www.cnblogs.com/7qin/p/13298523.html
Copyright © 2020-2023  润新知