首页 >后端开发 >php教程 > 正文

fsockopen() 函数制作端口扫描器

原创2017-08-19 09:30:030780
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>

4、主要函数介绍

4.1、fsockopen

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

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

以上就是fsockopen() 函数制作端口扫描器的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码

声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理

  • 相关标签:fsockopen 扫描器 端口
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • 专题推荐

    作者信息

    大家讲道理

    光阴似箭催人老,日月如移越少年。

    最近文章
    python os模块使用详解1442
    python 装饰器1142
    HTML5本地存储应用sessionStorage和localStorage1194
    推荐视频教程
  • javascript初级视频教程javascript初级视频教程
  • jquery 基础视频教程jquery 基础视频教程
  • 视频教程分类