首页 > 编程语言 >修复端口输入验证函数返回None导致的逻辑中断

修复端口输入验证函数返回None导致的逻辑中断

来源:互联网 2026-07-29 07:41:04

端口输入验证函数因缺少显式返回布尔值,隐式返回None导致逻辑中断,后续判断无法正常执行。修复需在函数末尾添加returnresult,同时将递归调用改为returnget_port(),以确保正确传递并返回验证结果。

端口输入验证常见错误与修复方法

在构建端口扫描器的过程中,用户输入的端口格式五花八门:可能是单个端口如 80,也可能是范围如 20-25,或者列表如 22,80,443。这些输入必须经过严格校验才能被正确解析。你给出的代码中,get_port() 函数依赖 port_is_valid(str_ports) 的返回值来决定执行方向,但问题恰恰出在这里——port_is_valid 函数没有显式返回布尔结果

Python 有一个“潜规则”:如果函数末尾没有 return 语句,它会隐式返回 None。而 if port_is_valid(str_ports): 实际上等同于 if None:,布尔值永远是 False。这就导致整个验证逻辑被直接跳过——无论你输入的是 80 还是 abc,程序都会静默地走向 else 分支(而这里甚至没有处理逻辑),最终 get_port() 返回 None。整个流程就此中断。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

核心修复:显式返回布尔值

要修复这个问题,核心只有一句话:在 port_is_valid 中显式返回 result

import re
import termcolor

port_regex = re.compile(r'^\d{1,5}(-\d{1,5})$|^\d{1,5}(,\d{1,5})*$')  # 优化正则:更精准匹配范围与列表

def port_is_valid(port):
    result = bool(port_regex.match(port.strip()))  # 增加 .strip() 防空格干扰
    print(f"Port validation result: {result}")
    return result  # ← 关键修复:必须返回布尔值!

递归调用需正确返回值

另外,get_port() 内部递归调用自身后,如果忘记返回其结果,上层调用依然会得到 None。所以还需要把递归调用改为 return get_port()。完整的修复版本如下:

def get_port():
    str_ports = input(termcolor.colored("Specify The Ports (e.g., 22,80 or 1-1024): ", "light_cyan")).strip()
    print(f"Raw input: '{str_ports}'")
    if not str_ports:
        print(termcolor.colored("Error: Input cannot be empty.", "red"))
        return get_port()
    if port_is_valid(str_ports):
        if "," in str_ports:
            try:
                int_ports = [int(p.strip()) for p in str_ports.split(",")]
                # 验证每个端口范围:1–65535
                if all(1 <= p <= 65535 for p in int_ports):
                    print(" Comma-separated ports parsed.")
                    return int_ports
                else:
                    print(termcolor.colored("Error: Port numbers must be between 1 and 65535.", "red"))
                    return get_port()
            except ValueError:
                print(termcolor.colored("Error: Invalid number format in list.", "red"))
                return get_port()
        elif "-" in str_ports:
            parts = str_ports.split("-")
            if len(parts) != 2:
                print(termcolor.colored("Error: Range format must be 'start-end'.", "red"))
                return get_port()
            try:
                start, end = int(parts[0].strip()), int(parts[1].strip())
                if not (1 <= start <= 65535 and 1 <= end <= 65535):
                    print(termcolor.colored("Error: Range values must be between 1 and 65535.", "red"))
                    return get_port()
                if start > end:
                    print(termcolor.colored("Error: Start port must not exceed end port.", "red"))
                    return get_port()
                f_ports = list(range(start, end + 1))
                print(" Port range parsed.")
                return f_ports
            except ValueError:
                print(termcolor.colored("Error: Invalid number in range.", "red"))
                return get_port()
        else:
            try:
                port = int(str_ports)
                if 1 <= port <= 65535:
                    print(" Single port parsed.")
                    return port
                else:
                    print(termcolor.colored("Error: Port must be between 1 and 65535.", "red"))
                    return get_port()
            except ValueError:
                print(termcolor.colored("Error: Invalid single port number.", "red"))
                return get_port()
    else:
        print(termcolor.colored("Error: Invalid port format. Use e.g., '80', '22,80,443', or '1-1024'.", "red"))
        return get_port()

注意事项

  • 永远显式返回:凡是参与条件判断的验证函数,必须明确返回 TrueFalse,不能依赖隐式 None
  • 递归调用需返回值get_port() 内部递归调用自己时,一定要用 return get_port(),否则栈顶调用的结果会丢失。
  • 输入净化:使用 .strip() 消除首尾空格,避免正则匹配因为多了一个空格而失败。
  • 端口范围校验:TCP/UDP 端口的有效范围是 1–65535,正则只能检查格式,不能保证数值合法,必须额外做范围判断。
  • 正则优化:原正则存在逻辑漏洞(比如允许 123,123- 这类不完整输入),上面已经替换为更严谨的表达式。

调用示例

最后,调用示例非常简单:

ports = get_port()
print(f"Final ports: {ports}")  # 确保输出非 None

经过以上修补,端口输入模块就能稳定返回 intlist[int] 或触发重试,彻底解决 None 导致流程中断的问题。后续的扫描逻辑拿到可靠的端口数据,才能安心跑下去。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。