Appendix F. Test Suite (Testsuite)
Appendix F. Test Suite (Testsuite)
Diese Appendix bietet eine umfassende Testsuite zur Validierung von SPF-Implementierungen. Die Tests decken verschiedene Szenarien ab, um sicherzustellen, dass SPF-Checker korrekt funktionieren.
F.1 Basic Tests (Grundlegende Tests)
F.1.1 Einfache IP4-Tests
Test 1: Direkte IP4-Übereinstimmung
SPF-Eintrag: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Test 2: IP4-CIDR-Übereinstimmung
SPF-Eintrag: v=spf1 ip4:192.0.2.0/24 -all
Test-IP: 192.0.2.128
Erwartetes Ergebnis: pass
Test 3: IP4-Nicht-Übereinstimmung
SPF-Eintrag: v=spf1 ip4:192.0.2.0/24 -all
Test-IP: 192.0.3.1
Erwartetes Ergebnis: fail
F.1.2 Einfache IP6-Tests
Test 4: Direkte IP6-Übereinstimmung
SPF-Eintrag: v=spf1 ip6:2001:db8::1 -all
Test-IP: 2001:db8::1
Erwartetes Ergebnis: pass
Test 5: IP6-CIDR-Übereinstimmung
SPF-Eintrag: v=spf1 ip6:2001:db8::/32 -all
Test-IP: 2001:db8::dead:beef
Erwartetes Ergebnis: pass
Test 6: IP6-Nicht-Übereinstimmung
SPF-Eintrag: v=spf1 ip6:2001:db8::/32 -all
Test-IP: 2001:db9::1
Erwartetes Ergebnis: fail
F.2 Mechanism Tests (Mechanismus-Tests)
F.2.1 A-Mechanismus-Tests
Test 7: A-Mechanismus - Übereinstimmung
Domain: example.com
SPF-Eintrag: v=spf1 a -all
DNS A-Eintrag für example.com: 192.0.2.1
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Test 8: A-Mechanismus mit CIDR
Domain: example.com
SPF-Eintrag: v=spf1 a/24 -all
DNS A-Eintrag für example.com: 192.0.2.1
Test-IP: 192.0.2.200
Erwartetes Ergebnis: pass
Test 9: A-Mechanismus mit Domain-Spezifikation
Domain: sender.example.com
SPF-Eintrag: v=spf1 a:mail.example.com -all
DNS A-Eintrag für mail.example.com: 192.0.2.10
Test-IP: 192.0.2.10
Erwartetes Ergebnis: pass
F.2.2 MX-Mechanismus-Tests
Test 10: MX-Mechanismus - Übereinstimmung
Domain: example.com
SPF-Eintrag: v=spf1 mx -all
DNS MX-Eintrag für example.com: 10 mail.example.com
DNS A-Eintrag für mail.example.com: 192.0.2.1
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Test 11: MX-Mechanismus mit mehreren MX-Einträgen
Domain: example.com
SPF-Eintrag: v=spf1 mx -all
DNS MX-Einträge:
10 mail1.example.com → 192.0.2.1
20 mail2.example.com → 192.0.2.2
Test-IP: 192.0.2.2
Erwartetes Ergebnis: pass
Test 12: MX-Mechanismus mit CIDR
Domain: example.com
SPF-Eintrag: v=spf1 mx/24 -all
DNS MX-Eintrag: 10 mail.example.com
DNS A-Eintrag für mail.example.com: 192.0.2.1
Test-IP: 192.0.2.200
Erwartetes Ergebnis: pass
F.2.3 PTR-Mechanismus-Tests (NICHT VERWENDEN)
Test 13: PTR-Mechanismus - Übereinstimmung
Domain: example.com
SPF-Eintrag: v=spf1 ptr -all
Test-IP: 192.0.2.1
PTR-Eintrag für 192.0.2.1: mail.example.com
A-Eintrag für mail.example.com: 192.0.2.1
Erwartetes Ergebnis: pass
Hinweis: PTR-Mechanismus ist veraltet und sollte nicht verwendet werden.
F.2.4 EXISTS-Mechanismus-Tests
Test 14: EXISTS-Mechanismus - gefunden
Domain: example.com
SPF-Eintrag: v=spf1 exists:%\{i}.whitelist.example.com -all
Test-IP: 192.0.2.1
DNS A-Abfrage für 192.0.2.1.whitelist.example.com: 127.0.0.2
Erwartetes Ergebnis: pass
Test 15: EXISTS-Mechanismus - nicht gefunden
Domain: example.com
SPF-Eintrag: v=spf1 exists:%\{i}.whitelist.example.com -all
Test-IP: 192.0.2.99
DNS A-Abfrage für 192.0.2.99.whitelist.example.com: NXDOMAIN
Erwartetes Ergebnis: fail
F.2.5 INCLUDE-Mechanismus-Tests
Test 16: INCLUDE - einfache Pass-Propagierung
Domain: example.com
SPF-Eintrag: v=spf1 include:trusted.example.com -all
SPF-Eintrag für trusted.example.com: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Test 17: INCLUDE - Fail wird nicht propagiert
Domain: example.com
SPF-Eintrag: v=spf1 include:trusted.example.com -all
SPF-Eintrag für trusted.example.com: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.99
Erwartetes Ergebnis: fail (nicht von include, sondern von -all)
Test 18: INCLUDE - TempError-Propagierung
Domain: example.com
SPF-Eintrag: v=spf1 include:trusted.example.com -all
DNS-Abfrage für trusted.example.com: DNS-Server nicht verfügbar
Erwartetes Ergebnis: temperror
Test 19: INCLUDE - PermError-Propagierung
Domain: example.com
SPF-Eintrag: v=spf1 include:trusted.example.com -all
SPF-Eintrag für trusted.example.com: v=spf1 ip4:192.0.2.1 ip4:192.0.2.1 -all (ungültig)
Erwartetes Ergebnis: permerror
F.2.6 ALL-Mechanismus-Tests
Test 20: ALL mit verschiedenen Qualifizierern
+all: pass
-all: fail
~all: softfail
?all: neutral
F.3 Qualifier Tests (Qualifizierer-Tests)
Test 21: Plus-Qualifizierer (+)
SPF-Eintrag: v=spf1 +ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Test 22: Minus-Qualifizierer (-)
SPF-Eintrag: v=spf1 -ip4:192.0.2.1 ~all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: fail
Test 23: Tilde-Qualifizierer (~)
SPF-Eintrag: v=spf1 ~ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: softfail
Test 24: Fragezeichen-Qualifizierer (?)
SPF-Eintrag: v=spf1 ?ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: neutral
F.4 Modifier Tests (Modifizierer-Tests)
F.4.1 REDIRECT-Modifizierer-Tests
Test 25: REDIRECT - Grundlegende Umleitung
Domain: example.com
SPF-Eintrag: v=spf1 redirect=_spf.example.com
SPF-Eintrag für _spf.example.com: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Test 26: REDIRECT - nach Mechanismus ignoriert
Domain: example.com
SPF-Eintrag: v=spf1 ip4:192.0.2.1 redirect=_spf.example.com
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass (Mechanismus stimmt überein, redirect ignoriert)
Test 27: REDIRECT - keine Übereinstimmung
Domain: example.com
SPF-Eintrag: v=spf1 redirect=_spf.example.com
SPF-Eintrag für _spf.example.com: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.99
Erwartetes Ergebnis: fail
F.4.2 EXP-Modifizierer-Tests
Test 28: EXP - Erklärungsstring abrufen
Domain: example.com
SPF-Eintrag: v=spf1 ip4:192.0.2.1 -all exp=explain.example.com
DNS TXT-Eintrag für explain.example.com: "Mail from %\{i} not allowed"
Test-IP: 192.0.2.99
Erwartetes Ergebnis: fail
Erwartete Erklärung: "Mail from 192.0.2.99 not allowed"
F.5 Macro Tests (Makro-Tests)
F.5.1 Grundlegende Makro-Erweiterung
Test 29: %{s} - Sender
Domain: example.com
MAIL FROM: [email protected]
SPF-Eintrag: v=spf1 exists:%\{s}.whitelist.example.com -all
Erweitert zu: exists:[email protected]
Test 30: %{l} - Lokaler Teil
Domain: example.com
MAIL FROM: [email protected]
SPF-Eintrag: v=spf1 exists:%\{l}.whitelist.example.com -all
Erweitert zu: exists:sender.whitelist.example.com
Test 31: %{o} - Domain
Domain: example.com
MAIL FROM: [email protected]
SPF-Eintrag: v=spf1 exists:%\{o}.whitelist.example.com -all
Erweitert zu: exists:example.com.whitelist.example.com
Test 32: %{d} - Aktuelle Domain
Domain: mail.example.com
SPF-Eintrag: v=spf1 exists:%\{d}.whitelist.example.com -all
Erweitert zu: exists:mail.example.com.whitelist.example.com
Test 33: %{i} - IP-Adresse
Test-IP: 192.0.2.1
SPF-Eintrag: v=spf1 exists:%\{i}.whitelist.example.com -all
Erweitert zu: exists:192.0.2.1.whitelist.example.com
Test 34: %{i} - IPv6-Adresse
Test-IP: 2001:db8::1
SPF-Eintrag: v=spf1 exists:%\{i}.whitelist.example.com -all
Erweitert zu: exists:2001.0db8.0000.0000.0000.0000.0000.0001.whitelist.example.com
F.5.2 Makro-Transformatoren
Test 35: Umkehr-Transformator (r)
Domain: mail.example.com
Makro: %\{d}
Normal: mail.example.com
Mit r: %\{dr}
Erweitert zu: com.example.mail
Test 36: Delimiter und Reverse
MAIL FROM: [email protected]
Makro: %\{or}
Erweitert zu: com.example.mail
Test 37: Ziffern-Spezifikation
Domain: mail.example.com
Makro: %\{d2}
Erweitert zu: example.com (letzte 2 Komponenten)
Test 38: Ziffern mit Reverse
Domain: mail.example.com
Makro: %\{d2r}
Erweitert zu: com.example
F.5.3 URL-Encoding in Makros
Test 39: URL-Escape-Zeichen
MAIL FROM: "test user"@example.com
Makro: %\{l}
Erweitert zu: test%20user
F.6 DNS Lookup Limit Tests (DNS-Abfragelimit-Tests)
Test 40: DNS-Abfragelimit - genau 10
SPF-Eintrag: v=spf1 mx a include:d1.example.com include:d2.example.com ...
(insgesamt 10 Mechanismen, die DNS-Abfragen erfordern)
Erwartetes Ergebnis: Erfolgreich verarbeitet
Test 41: DNS-Abfragelimit - 11 überschritten
SPF-Eintrag: v=spf1 mx a include:d1.example.com ... (11 Abfragen)
Erwartetes Ergebnis: permerror
Test 42: Verschachtelte Include-Abfragezählung
Domain: example.com
SPF: v=spf1 include:a.example.com -all (1 Abfrage)
a.example.com: v=spf1 include:b.example.com -all (1 Abfrage)
b.example.com: v=spf1 mx a -all (2 Abfragen)
Gesamtabfragen: 4
Erwartetes Ergebnis: pass (wenn IP übereinstimmt)
F.7 Void Lookup Tests (Leere-Abfrage-Tests)
Test 43: A-Mechanismus - keine A-Einträge
Domain: example.com
SPF-Eintrag: v=spf1 a -all
DNS A-Eintrag für example.com: (keiner)
Test-IP: 192.0.2.1
Erwartetes Ergebnis: fail (Mechanismus stimmt nicht überein)
Void-Lookups: 1
Test 44: MX-Mechanismus - keine MX-Einträge
Domain: example.com
SPF-Eintrag: v=spf1 mx -all
DNS MX-Eintrag für example.com: (keiner)
Test-IP: 192.0.2.1
Erwartetes Ergebnis: fail
Void-Lookups: 1
Test 45: Void-Lookup-Limit - überschritten
SPF-Eintrag mit 3 Mechanismen, die jeweils void lookups zurückgeben
Erwartetes Ergebnis: permerror (wenn Limit 2 ist)
F.8 Syntax Error Tests (Syntaxfehler-Tests)
Test 46: Fehlende SPF-Version
SPF-Eintrag: ip4:192.0.2.1 -all
Erwartetes Ergebnis: none (kein gültiger SPF-Eintrag)
Test 47: Ungültige IP-Adresse
SPF-Eintrag: v=spf1 ip4:999.999.999.999 -all
Erwartetes Ergebnis: permerror
Test 48: Ungültiger CIDR-Bereich
SPF-Eintrag: v=spf1 ip4:192.0.2.0/99 -all
Erwartetes Ergebnis: permerror
Test 49: Doppelte Modifizierer
SPF-Eintrag: v=spf1 redirect=a.example.com redirect=b.example.com
Erwartetes Ergebnis: permerror
Test 50: Unbekannter Modifizierer (sollte ignoriert werden)
SPF-Eintrag: v=spf1 ip4:192.0.2.1 unknown=value -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass (unbekannter Modifizierer ignoriert)
F.9 Integration Tests (Integrationstests)
Test 51: Komplexes realistisches Szenario
Domain: company.com
SPF-Eintrag: v=spf1 mx include:_spf.google.com include:sendgrid.net -all
Konfiguration:
- MX-Einträge: mail1.company.com (192.0.2.1), mail2.company.com (192.0.2.2)
- Google SPF umfasst mehrere IP-Bereiche
- SendGrid SPF umfasst mehrere IP-Bereiche
Testfälle:
1. IP 192.0.2.1: pass (mx-Übereinstimmung)
2. IP aus Google-Bereich: pass (include-Übereinstimmung)
3. IP aus SendGrid-Bereich: pass (include-Übereinstimmung)
4. Zufällige IP: fail (-all)
Test 52: Subdomain-Behandlung
Domain: mail.company.com
SPF-Eintrag für company.com: v=spf1 -all
SPF-Eintrag für mail.company.com: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass (Subdomain hat eigenen SPF-Eintrag)
Test 53: Kein SPF-Eintrag
Domain: example.com
SPF-Eintrag: (keiner)
Test-IP: 192.0.2.1
Erwartetes Ergebnis: none
F.10 Edge Cases (Grenzfälle)
Test 54: Leerer lokaler Teil
MAIL FROM: <>
HELO: mail.example.com
SPF-Eintrag für mail.example.com: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass (HELO-Identität verwendet)
Test 55: IPv4-Mapped IPv6-Adresse
SPF-Eintrag: v=spf1 ip4:192.0.2.1 -all
Test-IP: ::ffff:192.0.2.1 (IPv4-mapped IPv6)
Erwartetes Ergebnis: pass (sollte als IPv4 behandelt werden)
Test 56: CIDR /32 für IPv4
SPF-Eintrag: v=spf1 ip4:192.0.2.1/32 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Test 57: CIDR /128 für IPv6
SPF-Eintrag: v=spf1 ip6:2001:db8::1/128 -all
Test-IP: 2001:db8::1
Erwartetes Ergebnis: pass
Test 58: Mehrere SPF-Einträge (ungültig)
Domain: example.com
SPF-Einträge:
v=spf1 ip4:192.0.2.1 -all
v=spf1 ip4:192.0.2.2 -all
Erwartetes Ergebnis: permerror (mehrere SPF-Einträge nicht erlaubt)
F.11 Performance Tests (Leistungstests)
Test 59: Maximale DNS-Abfrage-Tiefe
Verschachtelte includes bis zur Tiefe von 10
Verifizieren, dass alle korrekt verarbeitet werden
Test 60: Große CIDR-Bereiche
SPF-Eintrag: v=spf1 ip4:192.0.0.0/8 -all
Test-IP: 192.255.255.255
Erwartetes Ergebnis: pass
F.12 Test Result Summary Format (Testergebnis-Zusammenfassungsformat)
Für jede Testausführung sollten folgende Informationen aufgezeichnet werden:
Test-ID: F.1.1-Test1
Beschreibung: Direkte IP4-Übereinstimmung
SPF-Eintrag: v=spf1 ip4:192.0.2.1 -all
Test-IP: 192.0.2.1
Erwartetes Ergebnis: pass
Tatsächliches Ergebnis: pass
Status: BESTANDEN
DNS-Abfragen: 1
Void-Lookups: 0
Verarbeitungszeit: 45ms
Eine vollständige SPF-Implementierung sollte alle Tests in dieser Suite bestehen, um als RFC 7208-konform zu gelten.