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


    利用 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

  • 相关阅读:
    SQL Server中的执行引擎入门
    SQL Server复制入门(一)复制简介
    Django 代码片断收集(持续更新)
    今天思路有点乱,随便记一点关于 xmlrpc 的
    PIL 学习笔记(1)
    Django newforms
    在 Django 的 View 中利用 function decorator 可实现一定程度的代码重用
    今天在 Linux 上顺利编译 PIL 1.1.6 成功
    用 PIL 写了个简单的缩略图生成程序
    [转贴] 中药内外合治急慢性鼻窦炎
  • 原文地址:https://www.cnblogs.com/ImCehnyx/p/7392605.html
Copyright © 2020-2023  润新知