Appendix F. Test Suite (Suite di test)
Appendix F. Test Suite (Suite di test)
Questa appendice fornisce una suite di test completa per validare le implementazioni SPF. I test coprono vari scenari per garantire che i verificatori SPF funzionino correttamente.
F.1 Basic Tests (Test di base)
F.1.1 Test IP4 semplici
Test 1: Corrispondenza IP4 diretta
Record SPF: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: pass
Test 2: Corrispondenza CIDR IP4
Record SPF: v=spf1 ip4:192.0.2.0/24 -all
IP di test: 192.0.2.128
Risultato atteso: pass
Test 3: Non-corrispondenza IP4
Record SPF: v=spf1 ip4:192.0.2.0/24 -all
IP di test: 192.0.3.1
Risultato atteso: fail
F.1.2 Test IP6 semplici
Test 4: Corrispondenza IP6 diretta
Record SPF: v=spf1 ip6:2001:db8::1 -all
IP di test: 2001:db8::1
Risultato atteso: pass
Test 5: Corrispondenza CIDR IP6
Record SPF: v=spf1 ip6:2001:db8::/32 -all
IP di test: 2001:db8::dead:beef
Risultato atteso: pass
Test 6: Non-corrispondenza IP6
Record SPF: v=spf1 ip6:2001:db8::/32 -all
IP di test: 2001:db9::1
Risultato atteso: fail
F.2 Mechanism Tests (Test dei meccanismi)
F.2.1 Test del meccanismo A
Test 7: Meccanismo A - corrispondenza
Dominio: example.com
Record SPF: v=spf1 a -all
Record DNS A per example.com: 192.0.2.1
IP di test: 192.0.2.1
Risultato atteso: pass
Test 8: Meccanismo A con CIDR
Dominio: example.com
Record SPF: v=spf1 a/24 -all
Record DNS A per example.com: 192.0.2.1
IP di test: 192.0.2.200
Risultato atteso: pass
Test 9: Meccanismo A con specifica di dominio
Dominio: sender.example.com
Record SPF: v=spf1 a:mail.example.com -all
Record DNS A per mail.example.com: 192.0.2.10
IP di test: 192.0.2.10
Risultato atteso: pass
F.2.2 Test del meccanismo MX
Test 10: Meccanismo MX - corrispondenza
Dominio: example.com
Record SPF: v=spf1 mx -all
Record DNS MX per example.com: 10 mail.example.com
Record DNS A per mail.example.com: 192.0.2.1
IP di test: 192.0.2.1
Risultato atteso: pass
Test 11: Meccanismo MX con più record MX
Dominio: example.com
Record SPF: v=spf1 mx -all
Record DNS MX:
10 mail1.example.com → 192.0.2.1
20 mail2.example.com → 192.0.2.2
IP di test: 192.0.2.2
Risultato atteso: pass
Test 12: Meccanismo MX con CIDR
Dominio: example.com
Record SPF: v=spf1 mx/24 -all
Record DNS MX: 10 mail.example.com
Record DNS A per mail.example.com: 192.0.2.1
IP di test: 192.0.2.200
Risultato atteso: pass
F.2.3 Test del meccanismo PTR (NON USARE)
Test 13: Meccanismo PTR - corrispondenza
Dominio: example.com
Record SPF: v=spf1 ptr -all
IP di test: 192.0.2.1
Record PTR per 192.0.2.1: mail.example.com
Record A per mail.example.com: 192.0.2.1
Risultato atteso: pass
Nota: Il meccanismo PTR è obsoleto e non dovrebbe essere usato.
F.2.4 Test del meccanismo EXISTS
Test 14: Meccanismo EXISTS - trovato
Dominio: example.com
Record SPF: v=spf1 exists:%\{i}.whitelist.example.com -all
IP di test: 192.0.2.1
Query DNS A per 192.0.2.1.whitelist.example.com: 127.0.0.2
Risultato atteso: pass
Test 15: Meccanismo EXISTS - non trovato
Dominio: example.com
Record SPF: v=spf1 exists:%\{i}.whitelist.example.com -all
IP di test: 192.0.2.99
Query DNS A per 192.0.2.99.whitelist.example.com: NXDOMAIN
Risultato atteso: fail
F.2.5 Test del meccanismo INCLUDE
Test 16: INCLUDE - propagazione semplice di pass
Dominio: example.com
Record SPF: v=spf1 include:trusted.example.com -all
Record SPF per trusted.example.com: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: pass
Test 17: INCLUDE - fail non è propagato
Dominio: example.com
Record SPF: v=spf1 include:trusted.example.com -all
Record SPF per trusted.example.com: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.99
Risultato atteso: fail (non da include, ma da -all)
Test 18: INCLUDE - propagazione di TempError
Dominio: example.com
Record SPF: v=spf1 include:trusted.example.com -all
Query DNS per trusted.example.com: server DNS non disponibile
Risultato atteso: temperror
Test 19: INCLUDE - propagazione di PermError
Dominio: example.com
Record SPF: v=spf1 include:trusted.example.com -all
Record SPF per trusted.example.com: v=spf1 ip4:192.0.2.1 ip4:192.0.2.1 -all (invalido)
Risultato atteso: permerror
F.2.6 Test del meccanismo ALL
Test 20: ALL con diversi qualificatori
+all: pass
-all: fail
~all: softfail
?all: neutral
F.3 Qualifier Tests (Test dei qualificatori)
Test 21: Qualificatore più (+)
Record SPF: v=spf1 +ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: pass
Test 22: Qualificatore meno (-)
Record SPF: v=spf1 -ip4:192.0.2.1 ~all
IP di test: 192.0.2.1
Risultato atteso: fail
Test 23: Qualificatore tilde (~)
Record SPF: v=spf1 ~ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: softfail
Test 24: Qualificatore punto interrogativo (?)
Record SPF: v=spf1 ?ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: neutral
F.4 Modifier Tests (Test dei modificatori)
F.4.1 Test del modificatore REDIRECT
Test 25: REDIRECT - reindirizzamento di base
Dominio: example.com
Record SPF: v=spf1 redirect=_spf.example.com
Record SPF per _spf.example.com: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: pass
Test 26: REDIRECT - ignorato dopo meccanismo
Dominio: example.com
Record SPF: v=spf1 ip4:192.0.2.1 redirect=_spf.example.com
IP di test: 192.0.2.1
Risultato atteso: pass (meccanismo corrisponde, redirect ignorato)
Test 27: REDIRECT - nessuna corrispondenza
Dominio: example.com
Record SPF: v=spf1 redirect=_spf.example.com
Record SPF per _spf.example.com: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.99
Risultato atteso: fail
F.4.2 Test del modificatore EXP
Test 28: EXP - recupero stringa di spiegazione
Dominio: example.com
Record SPF: v=spf1 ip4:192.0.2.1 -all exp=explain.example.com
Record DNS TXT per explain.example.com: "Mail from %\{i} not allowed"
IP di test: 192.0.2.99
Risultato atteso: fail
Spiegazione attesa: "Mail from 192.0.2.99 not allowed"
F.5 Macro Tests (Test delle macro)
F.5.1 Espansione macro di base
Test 29: %{s} - mittente
Dominio: example.com
MAIL FROM: [email protected]
Record SPF: v=spf1 exists:%\{s}.whitelist.example.com -all
Espanso a: exists:[email protected]
Test 30: %{l} - parte locale
Dominio: example.com
MAIL FROM: [email protected]
Record SPF: v=spf1 exists:%\{l}.whitelist.example.com -all
Espanso a: exists:sender.whitelist.example.com
Test 31: %{o} - dominio
Dominio: example.com
MAIL FROM: [email protected]
Record SPF: v=spf1 exists:%\{o}.whitelist.example.com -all
Espanso a: exists:example.com.whitelist.example.com
Test 32: %{d} - dominio corrente
Dominio: mail.example.com
Record SPF: v=spf1 exists:%\{d}.whitelist.example.com -all
Espanso a: exists:mail.example.com.whitelist.example.com
Test 33: %{i} - indirizzo IP
IP di test: 192.0.2.1
Record SPF: v=spf1 exists:%\{i}.whitelist.example.com -all
Espanso a: exists:192.0.2.1.whitelist.example.com
Test 34: %{i} - indirizzo IPv6
IP di test: 2001:db8::1
Record SPF: v=spf1 exists:%\{i}.whitelist.example.com -all
Espanso a: exists:2001.0db8.0000.0000.0000.0000.0000.0001.whitelist.example.com
F.5.2 Trasformatori di macro
Test 35: Trasformatore di inversione (r)
Dominio: mail.example.com
Macro: %\{d}
Normale: mail.example.com
Con r: %\{dr}
Espanso a: com.example.mail
Test 36: Delimitatore e inversione
MAIL FROM: [email protected]
Macro: %\{or}
Espanso a: com.example.mail
Test 37: Specifica cifre
Dominio: mail.example.com
Macro: %\{d2}
Espanso a: example.com (ultimi 2 componenti)
Test 38: Cifre con inversione
Dominio: mail.example.com
Macro: %\{d2r}
Espanso a: com.example
F.5.3 Codifica URL nelle macro
Test 39: Caratteri di escape URL
MAIL FROM: "test user"@example.com
Macro: %\{l}
Espanso a: test%20user
F.6 DNS Lookup Limit Tests (Test del limite di query DNS)
Test 40: Limite di query DNS - esattamente 10
Record SPF: v=spf1 mx a include:d1.example.com include:d2.example.com ...
(totale di 10 meccanismi che richiedono query DNS)
Risultato atteso: elaborato con successo
Test 41: Limite di query DNS - 11 superato
Record SPF: v=spf1 mx a include:d1.example.com ... (11 query)
Risultato atteso: permerror
Test 42: Conteggio query include nidificati
Dominio: example.com
SPF: v=spf1 include:a.example.com -all (1 query)
a.example.com: v=spf1 include:b.example.com -all (1 query)
b.example.com: v=spf1 mx a -all (2 query)
Totale query: 4
Risultato atteso: pass (se l'IP corrisponde)
F.7 Void Lookup Tests (Test di query vuote)
Test 43: Meccanismo A - nessun record A
Dominio: example.com
Record SPF: v=spf1 a -all
Record DNS A per example.com: (nessuno)
IP di test: 192.0.2.1
Risultato atteso: fail (meccanismo non corrisponde)
Query vuote: 1
Test 44: Meccanismo MX - nessun record MX
Dominio: example.com
Record SPF: v=spf1 mx -all
Record DNS MX per example.com: (nessuno)
IP di test: 192.0.2.1
Risultato atteso: fail
Query vuote: 1
Test 45: Limite di query vuote - superato
Record SPF con 3 meccanismi che restituiscono ciascuno query vuote
Risultato atteso: permerror (se il limite è 2)
F.8 Syntax Error Tests (Test di errori di sintassi)
Test 46: Versione SPF mancante
Record SPF: ip4:192.0.2.1 -all
Risultato atteso: none (nessun record SPF valido)
Test 47: Indirizzo IP non valido
Record SPF: v=spf1 ip4:999.999.999.999 -all
Risultato atteso: permerror
Test 48: Intervallo CIDR non valido
Record SPF: v=spf1 ip4:192.0.2.0/99 -all
Risultato atteso: permerror
Test 49: Modificatori duplicati
Record SPF: v=spf1 redirect=a.example.com redirect=b.example.com
Risultato atteso: permerror
Test 50: Modificatore sconosciuto (dovrebbe essere ignorato)
Record SPF: v=spf1 ip4:192.0.2.1 unknown=value -all
IP di test: 192.0.2.1
Risultato atteso: pass (modificatore sconosciuto ignorato)
F.9 Integration Tests (Test di integrazione)
Test 51: Scenario realistico complesso
Dominio: company.com
Record SPF: v=spf1 mx include:_spf.google.com include:sendgrid.net -all
Configurazione:
- Record MX: mail1.company.com (192.0.2.1), mail2.company.com (192.0.2.2)
- L'SPF di Google include più intervalli IP
- L'SPF di SendGrid include più intervalli IP
Casi di test:
1. IP 192.0.2.1: pass (corrispondenza mx)
2. IP dall'intervallo Google: pass (corrispondenza include)
3. IP dall'intervallo SendGrid: pass (corrispondenza include)
4. IP casuale: fail (-all)
Test 52: Gestione sottodomini
Dominio: mail.company.com
Record SPF per company.com: v=spf1 -all
Record SPF per mail.company.com: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: pass (il sottodominio ha il proprio record SPF)
Test 53: Nessun record SPF
Dominio: example.com
Record SPF: (nessuno)
IP di test: 192.0.2.1
Risultato atteso: none
F.10 Edge Cases (Casi limite)
Test 54: Parte locale vuota
MAIL FROM: <>
HELO: mail.example.com
Record SPF per mail.example.com: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: pass (identità HELO utilizzata)
Test 55: Indirizzo IPv6 mappato IPv4
Record SPF: v=spf1 ip4:192.0.2.1 -all
IP di test: ::ffff:192.0.2.1 (IPv6 mappato IPv4)
Risultato atteso: pass (dovrebbe essere trattato come IPv4)
Test 56: CIDR /32 per IPv4
Record SPF: v=spf1 ip4:192.0.2.1/32 -all
IP di test: 192.0.2.1
Risultato atteso: pass
Test 57: CIDR /128 per IPv6
Record SPF: v=spf1 ip6:2001:db8::1/128 -all
IP di test: 2001:db8::1
Risultato atteso: pass
Test 58: Più record SPF (non valido)
Dominio: example.com
Record SPF:
v=spf1 ip4:192.0.2.1 -all
v=spf1 ip4:192.0.2.2 -all
Risultato atteso: permerror (più record SPF non consentiti)
F.11 Performance Tests (Test di prestazioni)
Test 59: Profondità massima di query DNS
Include nidificati fino a una profondità di 10
Verificare che tutti siano elaborati correttamente
Test 60: Grandi intervalli CIDR
Record SPF: v=spf1 ip4:192.0.0.0/8 -all
IP di test: 192.255.255.255
Risultato atteso: pass
F.12 Test Result Summary Format (Formato di riepilogo dei risultati del test)
Per ogni esecuzione di test, le seguenti informazioni dovrebbero essere registrate:
ID test: F.1.1-Test1
Descrizione: Corrispondenza IP4 diretta
Record SPF: v=spf1 ip4:192.0.2.1 -all
IP di test: 192.0.2.1
Risultato atteso: pass
Risultato effettivo: pass
Stato: SUPERATO
Query DNS: 1
Query vuote: 0
Tempo di elaborazione: 45ms
Un'implementazione SPF completa dovrebbe superare tutti i test in questa suite per essere considerata conforme alla RFC 7208.