mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

主要改进: - 创建BaseScanStrategy基础类提取通用功能,减少60%代码重复 - 新增PortDiscoveryService分离端口发现逻辑,提升职责清晰度 - 优化插件匹配算法,从O(n×m×p)降至O(n×p)复杂度 - 修复插件适用性判断逻辑错误,确保精确端口匹配 - 完善国际化支持,新增21个i18n消息定义 - 代码行数显著减少:LocalScanner(-50%)、ServiceScanner(-42%)、WebScanner(-44%) 技术优化: - 组合模式替代继承,提升扩展性 - 策略模式实现插件过滤器,支持Local/Service/Web类型 - 服务分离提升可测试性和维护性 - 性能优化减少嵌套循环和重复计算 确保漏洞扫描插件列表与实际执行插件保持精确一致。
70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package core
|
|
|
|
import (
|
|
"github.com/shadow1ng/fscan/common"
|
|
"github.com/shadow1ng/fscan/common/i18n"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
// WebScanStrategy Web扫描策略
|
|
type WebScanStrategy struct {
|
|
*BaseScanStrategy
|
|
}
|
|
|
|
// NewWebScanStrategy 创建新的Web扫描策略
|
|
func NewWebScanStrategy() *WebScanStrategy {
|
|
return &WebScanStrategy{
|
|
BaseScanStrategy: NewBaseScanStrategy("Web扫描", FilterWeb),
|
|
}
|
|
}
|
|
|
|
// Name 返回策略名称
|
|
func (s *WebScanStrategy) Name() string {
|
|
return i18n.GetText("scan_strategy_web_name")
|
|
}
|
|
|
|
// Description 返回策略描述
|
|
func (s *WebScanStrategy) Description() string {
|
|
return i18n.GetText("scan_strategy_web_desc")
|
|
}
|
|
|
|
// Execute 执行Web扫描策略
|
|
func (s *WebScanStrategy) Execute(info common.HostInfo, ch *chan struct{}, wg *sync.WaitGroup) {
|
|
// 输出扫描开始信息
|
|
s.LogScanStart()
|
|
|
|
// 验证插件配置
|
|
if err := s.ValidateConfiguration(); err != nil {
|
|
common.LogError(err.Error())
|
|
return
|
|
}
|
|
|
|
// 准备URL目标
|
|
targets := s.PrepareTargets(info)
|
|
|
|
// 输出插件信息
|
|
s.LogPluginInfo()
|
|
|
|
// 执行扫描任务
|
|
ExecuteScanTasks(targets, s, ch, wg)
|
|
}
|
|
|
|
// PrepareTargets 准备URL目标列表
|
|
func (s *WebScanStrategy) PrepareTargets(baseInfo common.HostInfo) []common.HostInfo {
|
|
var targetInfos []common.HostInfo
|
|
|
|
for _, url := range common.URLs {
|
|
urlInfo := baseInfo
|
|
// 确保URL包含协议头
|
|
if !strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://") {
|
|
url = "http://" + url
|
|
}
|
|
urlInfo.Url = url
|
|
targetInfos = append(targetInfos, urlInfo)
|
|
}
|
|
|
|
return targetInfos
|
|
}
|
|
|