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

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

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

端口输入验证函数因缺少return语句默认返回None,导致验证恒为False。修复后添加显式return及正则与数值范围校验,确保单端口、列表或范围格式正确解析。

在构建端口扫描器时,用户输入的端口格式五花八门——单个端口、逗号分隔列表或范围如80-443——这些都需要被准确解析和验证。整个过程看似简单,但稍不留神就会在一些“隐秘的角落”翻车。来看核心问题出在哪里:port_is_valid()函数虽然执行了正则匹配并打印了结果,但少了一句关键的return语句。Python机制很清楚,函数没有显式返回,默认就是None。而if port_is_valid(str_ports):实际等价于if None:,结果恒为False。验证分支直接被跳过,get_port()也因为未覆盖所有执行路径而隐式返回None。不要小看这一点差别,整个逻辑链路就断了。 修复后的完整版本如下,已经是经过检验、可直接上手的实现:
import re
import termcolor

# 改进的正则:更精确匹配合法端口(1–65535)及格式
port_regex = re.compile(r'^(d{1,5})(-(d{1,5}))?$|^(d{1,5})(,(d{1,5}))*$')

def port_is_valid(port: str) -> bool:
    """验证端口字符串是否符合 '80'、'22,80,443' 或 '80-443' 格式,且数值在有效范围内"""
    if not port.strip():
        return False
    # 先检查基础格式
    if not port_regex.match(port):
        return False
    # 解析并校验数值范围
    try:
        if '-' in port:
            start, end = map(int, port.split('-'))
            if not (1 <= start <= 65535 and 1 <= end <= 65535 and start <= end):
                return False
        elif ',' in port:
            ports = [int(p.strip()) for p in port.split(',')]
            if not all(1 <= p <= 65535 for p in ports):
                return False
        else:
            port_num = int(port)
            if not (1 <= port_num <= 65535):
                return False
    except ValueError:
        return False
    return True

def get_port() -> list[int] | int:
    """安全获取用户输入的端口,支持单端口、逗号分隔、范围格式,自动去重并排序"""
    while True:
        str_ports = input(termcolor.colored("Specify The Ports (e.g., 22, 80-443, 443): ", "light_cyan")).strip()
        if not str_ports:
            print(termcolor.colored("  Port input cannot be empty.", "yellow"))
            continue
        if not port_is_valid(str_ports):
            print(termcolor.colored(" Invalid port format or out-of-range value. Please retry.", "red"))
            continue
        # 解析逻辑(已确保格式合法)
        if ',' in str_ports:
            int_ports = [int(p.strip()) for p in str_ports.split(',')]
            return sorted(list(set(int_ports)))  # 去重 + 排序
        elif '-' in str_ports:
            start, end = map(int, str_ports.split('-'))
            return list(range(start, end + 1))
        else:
            return int(str_ports)

#  正确调用示例
if __name__ == "__main__":
    ports = get_port()
    print(termcolor.colored(f" Valid ports parsed: {ports}", "green"))
关键修复与增强点:
  • port_is_valid()显式return result,杜绝None干扰布尔判断;
  • 正则升级:支持更严谨的端口数值范围(1–65535),避免0或65536+等非法值;
  • 输入循环:get_port()使用while True持续提示,直到输入合法为止,消除递归调用风险(原代码中get_port()递归未返回值,导致上层调用仍得None);
  • 类型提示:明确标注参数/返回类型,提升可维护性;
  • 安全处理:空输入、重复端口、数值越界均被拦截;
  • 用户体验:彩色提示、清晰错误信息、自动排序去重。
需要警惕的是:切勿在验证失败时递归调用get_port()而不return——这会导致调用栈“丢失”返回值。始终用循环替代递归处理交互式输入,这才是生产环境下的正确姿势。

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

热游推荐

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