Passa al contenuto principale

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.