package payload import "strings" // SmartSuggest возвращает имена заготовок (см. Preset), отсортированные // по релевантности для параметра с именем paramName. Это эвристика по // подстрокам в имени — тот же принцип, что и "умная" генерация в Burp: // там это тоже не ИИ, а сопоставление по имени/типу параметра, просто // более развитое. Если контекст не распознан, возвращает разведочный // набор общего назначения вместо пустого списка — так вызывающему коду // не нужно отдельно обрабатывать случай "ничего не найдено". func SmartSuggest(paramName string) []string { name := strings.ToLower(paramName) var suggestions []string add := func(names ...string) { suggestions = append(suggestions, names...) } if containsAny(name, "id", "num", "count", "page", "offset", "limit") { add("numbers-small", "numbers-large") } if containsAny(name, "user", "login", "account") { add("common-usernames") } if containsAny(name, "pass", "pwd", "secret") { add("common-passwords") } if containsAny(name, "search", "query", "comment", "message", "name", "text") { add("xss-probes", "sqli-probes") } if containsAny(name, "file", "path", "dir", "folder", "template", "include") { add("path-traversal") } if containsAny(name, "token", "session", "key", "code") { add("alnum") } if len(suggestions) == 0 { add("sqli-probes", "xss-probes", "numbers-small") } return dedupe(suggestions) } func containsAny(s string, subs ...string) bool { for _, sub := range subs { if strings.Contains(s, sub) { return true } } return false } func dedupe(in []string) []string { seen := make(map[string]bool, len(in)) out := make([]string, 0, len(in)) for _, s := range in { if !seen[s] { seen[s] = true out = append(out, s) } } return out }