Zum Hauptinhalt springen

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.