feat(stealth): consistent header set with TLS/JA3 advisories

This commit is contained in:
2026-06-07 13:22:31 +01:00
parent d477b27e49
commit cd7f6c50db
2 changed files with 42 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
package stealth
// HeaderSet is a consistent header bundle plus advisories the MCP cannot enforce.
type HeaderSet struct {
Headers map[string]string `json:"headers"`
Advisories []string `json:"advisories"`
}
// HeadersFor builds an HTTP header set consistent with the given fingerprint.
func HeadersFor(fp Fingerprint) HeaderSet {
return HeaderSet{
Headers: map[string]string{
"User-Agent": fp.UserAgent,
"Accept-Language": fp.Locale + ",en;q=0.9",
"Sec-CH-UA": fp.SecCHUA,
"Sec-CH-UA-Platform": fp.SecCHUAPlatform,
"Sec-CH-UA-Mobile": "?0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
},
Advisories: []string{
"TLS/JA3 fingerprint is set by the browser's TLS stack and cannot be changed by this MCP — use a matching browser build or a TLS-rotating proxy.",
"HTTP/2 frame fingerprint is browser-controlled; header order here is advisory only.",
},
}
}
+17
View File
@@ -0,0 +1,17 @@
package stealth
import "testing"
func TestHeadersFor(t *testing.T) {
fp := GenerateFingerprint(FingerprintParams{OS: "macos", Browser: "chrome", Locale: "en-GB", Seed: 5})
h := HeadersFor(fp)
if h.Headers["User-Agent"] != fp.UserAgent {
t.Fatalf("UA mismatch")
}
if h.Headers["Accept-Language"] == "" || h.Headers["Sec-CH-UA-Platform"] == "" {
t.Fatalf("missing client hints: %+v", h.Headers)
}
if len(h.Advisories) == 0 {
t.Fatal("expected TLS/JA3 advisory")
}
}