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

来源:互联网 发布:橱柜设计师软件 编辑:程序博客网 时间:2024/06/07 02:06

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

原创粉丝点击