Maison >développement back-end >tutoriel php >Scanner de port ouvert pour la fonction fsockopen()

Scanner de port ouvert pour la fonction fsockopen()

炎欲天舞
炎欲天舞original
2017-08-20 09:12:381612parcourir

Utilisez la fonction fsockopen() pour ouvrir le scanner de port


1 Introduction

Cet article utilise la fonction fsockopen() pour écrire un simple. périphérique d'analyse des ports.

2. Technologie clé

Le numéro de port de cet exemple est fixe En parcourant le tableau, la fonction fsockopen() est utilisée pour se connecter. Si la connexion est réussie, le port est ouvert. , sinon le port est fermé.

Le code de base est le suivant :


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. Le code est le suivant


<!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. Introduction à la fonction principale

4.1.fsockopen

Créer une connexion. en fonction d'un nom d'hôte. Un objet ressource est renvoyé avec succès, false est renvoyé en cas d'échec ; si l'hôte est indisponible, un avertissement est émis

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn