Files
fscan/common/initialize.go
T
ZacharyZcR e9e6387d17 fix: 修复-u/-uf模式下URLs丢失导致0目标扫描的问题
Parse阶段将URLs设置到全局状态,但Initialize随后创建新状态
并覆盖了全局状态,导致URLs数据丢失。现在在创建新状态前
先保存并迁移Parse阶段设置的URLs和HostPorts数据。
2026-01-19 15:05:22 +08:00

127 lines
3.0 KiB
Go

package common
import (
"fmt"
)
/*
initialize.go - 统一初始化入口
将分散的初始化步骤整合为单一入口,简化 main.go。
*/
// InitResult 初始化结果
type InitResult struct {
Config *Config
State *State
Info *HostInfo
}
// Initialize 统一初始化函数
// 封装 Parse → InitGlobalConfigAndState → InitOutput 流程
// 返回可直接使用的 Config 和 State 对象
func Initialize(info *HostInfo) (*InitResult, error) {
// 初始化日志系统
InitLogger()
// 解析和验证参数(会更新 globalConfig 的凭据信息)
if err := Parse(info); err != nil {
return nil, fmt.Errorf("参数解析失败: %w", err)
}
// 获取 Parse 更新过的凭据信息
parsedCreds := GetGlobalConfig().Credentials
// 从 FlagVars 构建 Config(新架构)
cfg := BuildConfigFromFlags(flagVars)
// 关键修复:获取 Parse 阶段设置的全局状态数据
// Parse 通过 updateGlobalVariables 将 URLs 和 HostPorts 设置到了全局状态
// 需要保留这些数据到新状态中
oldGlobalState := GetGlobalState()
state := NewState()
// 迁移 Parse 阶段设置的目标数据
if urls := oldGlobalState.GetURLs(); len(urls) > 0 {
state.SetURLs(urls)
}
if hostPorts := oldGlobalState.GetHostPorts(); len(hostPorts) > 0 {
state.SetHostPorts(hostPorts)
}
// 关键修复:应用 Parse 解析的凭据结果到新 Config
// Parse 会根据 -user/-pwd/-usera/-pwda 等参数更新凭据
if len(parsedCreds.UserPassPairs) > 0 {
cfg.Credentials.UserPassPairs = parsedCreds.UserPassPairs
}
if len(parsedCreds.Userdict) > 0 {
cfg.Credentials.Userdict = parsedCreds.Userdict
}
if len(parsedCreds.Passwords) > 0 {
cfg.Credentials.Passwords = parsedCreds.Passwords
}
if len(parsedCreds.HashValues) > 0 {
cfg.Credentials.HashValues = parsedCreds.HashValues
}
if len(parsedCreds.HashBytes) > 0 {
cfg.Credentials.HashBytes = parsedCreds.HashBytes
}
// 设置全局实例
SetGlobalConfig(cfg)
SetGlobalState(state)
// 初始化输出系统
if err := InitOutput(); err != nil {
return nil, fmt.Errorf("输出初始化失败: %w", err)
}
return &InitResult{
Config: cfg,
State: state,
Info: info,
}, nil
}
// ValidateExclusiveParams 验证互斥参数
// 检查 -h、-u、-local 只能指定一个
func ValidateExclusiveParams(info *HostInfo) error {
paramCount := 0
var activeParam string
fv := GetFlagVars()
if info.Host != "" {
paramCount++
activeParam = "-h"
}
if fv.TargetURL != "" {
paramCount++
if activeParam != "" {
activeParam += " 和 -u"
} else {
activeParam = "-u"
}
}
if fv.LocalPlugin != "" {
paramCount++
if activeParam != "" {
activeParam += " 和 -local"
} else {
activeParam = "-local"
}
}
if paramCount > 1 {
return fmt.Errorf("参数 %s 互斥,请只指定一个扫描目标\n -h: 网络主机扫描\n -u: Web URL扫描\n -local: 本地信息收集", activeParam)
}
return nil
}
// Cleanup 清理资源
// 应该在程序退出前调用
func Cleanup() error {
return CloseOutput()
}