我正在try 让一个php端口扫描器正常工作.当我手动输入一个范围时,比方说10到20,它会扫描10到20.但如果我try 使用表单,它从0开始.我想我得到了这里的基本代码,但我不能让它与通过文本框和POST输入的范围一起工作.这是我的代码,是的,我知道它很乱.



<form method="POST" >
    Domain/IP: 
    <input type="text" name="domain" /> 
    <br>Low:
    <input type="text" name="low" />
    <br>High:
    <input type="text" name="high" />
    <br>Step:
    <input type="text" name="step" />
    <br>
    <input type="submit" value="Scan" />
</form>
<br />

<?php
set_time_limit(300);
if(!empty($_POST['domain'])) {  

    $low=intval($_POST['low']);

//$low = $_POST['low'];
//$low = $_GET['low'];
//$low = $_POST['low'] ;
//$_SESSION['low'] = $low;
$high=$_POST['high'];
$step=$_POST['step'];
    //list of port numbers to scan
    //if(!empty($_POST['low'])){$low = $_POST['low'];}
    //if(!empty($_POST['high'])){$high = $_POST['high'];}
    //if(!empty($_POST['step'])){$step = $_POST['step'];}
    //echo 'low' , $low;

    
    $ports = range($low,$high,$step);
    
    $results = range($low,$high,$step);
    foreach($ports as $port) {
        
        if($pf = @fsockopen($_POST['domain'], $port, $err, $err_string, 1)) {
            $results[$port] = true;
            fclose($pf);
        } else {
            $results[$port] = false;
        }
    }

    foreach($results as $port=>$val) {
        $prot = getservbyport($port,"tcp");
                echo "Port $port ($prot): ";
        if($val) {
            echo "<span style=\"color:green\">OK</span><br/>";
        }
        else {
            echo "<span style=\"color:red\">Inaccessible</span><br/>";
        }
    }
}
echo $low;
?>

任何帮助都将不胜感激.

推荐答案

以下是稍微整理了一下的代码.

  • 输入元素的类型为number表示不能高于或低于端口范围
  • 当提交表单时,输入保持不变

您不需要将$result设置为相同的范围,事实上,如果使用1以外的步长,这样做会导致脚本输出不正确.

<?php

/*

Author: username_313
Question: Port scanner in php
URL: https://stackoverflow.com/questions/74160800/port-scanner-in-php
Tags: php

*/

set_time_limit(300);
$domain = '';
if (!empty($_POST['domain'])) {
    $domain = $_POST['domain'];
}
$start_port = 1;
if (!empty($_POST['start_port'])) {
    $start_port = intval($_POST['start_port']);
}
$end_port = 10;
if (!empty($_POST['end_port'])) {
    $end_port = intval($_POST['end_port']);
}
$step = 1;
if (!empty($_POST['step'])) {
    $step = intval($_POST['step']);
}
?>
<form method="post" action="<?=$_SERVER['PHP_SELF']?>">
    Domain/IP: 
    <input type="text" name="domain" value="<?=$domain?>" /> 
    <br>Start Port:
    <input type="number" name="start_port" min="1" max="65535" value="<?=$start_port?>" />
    <br>End Port:
    <input type="number" name="end_port"  min="1" max="65535" value="<?=$end_port?>" />
    <br>Step:
    <input type="number" name="step" value="<?=$step?>" />
    <br>
    <input type="submit" value="Scan" />
</form>
<br />

<?php

if(!empty($_POST['domain'])) {

    // A check for valid domain or IP should happen here, and the script should not conitnue unless it is valid

    $ports = range($start_port, $end_port, $step);
    $results = [];

    foreach($ports as $port) {
        $fp = @fsockopen($_POST['domain'], $port, $err, $err_string, 1);

        if (!$fp) {
            $results[$port] = false;
        } else {
            $results[$port] = true;
            fclose($fp);
        }
    }

    foreach($results as $port => $val) {
        $service = getservbyport($port, "tcp");
        echo "Port $port ($service): ";

        if($val) {
            echo "<span style=\"color:green\">OK</span><br/>";
        } else {
            echo "<span style=\"color:red\">Inaccessible</span><br/>";
        }
    }
}
?>

Php相关问答推荐

此行动未经授权.升级Laravel时

启用额外的WooCommerce产品库存位置

如何隐藏x轴图表上的值

在WooCommerce管理订单列表中显示项目总权重

无法在Laravel/Vue停靠容器中启动MySQL

PHP中冒号的奇怪用例

Laravel eloquent-如果没有包含InitialValue的结果,则查询where Second Value

在Laravel中从动态嵌套数组中获取值

在WP工具中页面加载时可短暂看到的JavaScript生成的字段

如何用Ubuntu 22.04在VSCode中启用XDebug

PHP 8.2 弃用日志(log)存储在 Laravel 10.22.0 中的哪里?

Woocommerce 仅在前端为登录用户提供价格折扣

无法允许元素(img:'src')与symfony html-sanitizer(symfony6.3 php 8.2)

当所有对象都属于同一类型时,我可以省略 PHP in_array() 中的 strict 参数吗?

Woocommerce注册中的自定义复选框验证错误提示问题

WooCommerce单个产品页面上启用额外选项卡的产品元框字段

为什么 AJAX 请求没有通过 is_ajax_request() codeigniter 的条件?

使用 --exclude-dir 选项从 PHP 执行 grep 时出现问题

将参数传递给 laravel 9 工厂

使用 OOP PHP 创建动态 WHERE 子句.如何实现 BETWEEN 运算符?