Rumah >pembangunan bahagian belakang >tutorial php >fsockopen() 函数的开放端口扫描器

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

炎欲天舞
炎欲天舞asal
2017-08-20 09:12:381611semak imbas

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


1、前言

本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。

2、关键技术

本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,则该端口处于开放状态,否则该端口处于关闭状态。

核心代码如下:


foreach ($port as $key => $value) {
    echo &#39;<tr>&#39;;
    echo &#39;<td>&#39; . $key . &#39;</td>&#39;;
    echo &#39;<td>&#39; . $value . &#39;</td>&#39;;
    echo &#39;<td>&#39; . $msg[$key] . &#39;</td>&#39;;    //$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
    $fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
    $result = $fp ? &#39;<span style="color:red">开启</span>&#39; : &#39;<span style="color:red">关闭</span>&#39;;
    echo &#39;<td>&#39; . $result . &#39;</td>&#39;;
    echo &#39;</tr>&#39;;
}

 

3、代码如下

 


<!DOCTYPE html>
<html>
<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=&#39;#&#39;>
        网址/ip:<input type="text" name="ip" value="<?php echo  $_POST[&#39;ip&#39;] ?? &#39;127.0.0.1&#39;?>">
        <button>扫描</button>
    </form>
    <table>
        <thead>
            <tr>
                <td>id</td>
                <td>端口号</td>
                <td>服务</td>
                <td>开启状态</td>
            </tr>
        </thead>
        <tbody>
            <?php  
                $ip = $_POST[&#39;ip&#39;] ?? &#39;127.0.0.1&#39;;
                if(ip2long($ip)){
                    $aIp = explode(&#39;.&#39;, $ip);//ip4地址使用.分隔符
                    //这里没有对 0.0.0.0 这种本机地址进行判断,只是粗略的判断ip是否合法 
                    foreach ($aIp as $key => $value) {
                        if($value < 0 || $value > 255){
                            die(&#39;地址不合法&#39;);
                        }
                    }
                }
                
                $port = array(
                    21, 
                    23, 
                    25,
                    79,
                    80, 
                    110, 
                    135, 
                    137, 
                    138, 
                    139, 
                    143, 
                    443, 
                    445, 
                    1433, 
                    3306, 

                );
                $msg = array(
                    &#39;Ftp&#39;,
                    &#39;Telnet&#39;,
                    &#39;Smtp&#39;,
                    &#39;Finger&#39;,
                    &#39;Http&#39;,
                    &#39;Pop3&#39;,
                    &#39;Location Service&#39;,
                    &#39;Netbios-NS&#39;,
                    &#39;Netbios-DGM&#39;,
                    &#39;Netbios-SSN&#39;,
                    &#39;IMAP&#39;,
                    &#39;Https&#39;,
                    &#39;Microsoft-DS&#39;,
                    &#39;MSSQL&#39;,
                    &#39;MYSQL&#39;,
                    &#39;Terminal Services&#39;
                );
                //无论使用prot还是msg循环都是可以的,因为$key是对应的,都是索引数组
                foreach ($port as $key => $value) {
                    echo &#39;<tr>&#39;;
                    echo &#39;<td>&#39; . $key . &#39;</td>&#39;;
                    echo &#39;<td>&#39; . $value . &#39;</td>&#39;;
                    echo &#39;<td>&#39; . $msg[$key] . &#39;</td>&#39;;
                    //$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
                    $fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
                    $result = $fp ? &#39;<span style="color:red">开启</span>&#39; : &#39;<span style="color:red">关闭</span>&#39;;
                    echo &#39;<td>&#39; . $result . &#39;</td>&#39;;
                    echo &#39;</tr>&#39;;
                }

            ?>
        </tbody>
    </table>
</body>
</html>
因为偷懒,把页面和结果都写在一起了,布局就将就把。

 

4、主要函数介绍

4.1、fsockopen

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

Atas ialah kandungan terperinci fsockopen() 函数的开放端口扫描器. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn