Don't deduce point on weak SPF all qualifier, when DMARC is configured
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
871f4e62f6
commit
8769514f1c
3 changed files with 29 additions and 6 deletions
|
|
@ -242,6 +242,12 @@ func (d *DNSAnalyzer) calculateSPFScore(results *api.DNSResults) (score int) {
|
||||||
// Full points for valid SPF
|
// Full points for valid SPF
|
||||||
score += 75
|
score += 75
|
||||||
|
|
||||||
|
// Check if DMARC is configured with strict policy as all mechanism is less significant
|
||||||
|
dmarcStrict := results.DmarcRecord != nil &&
|
||||||
|
results.DmarcRecord.Valid && results.DmarcRecord.Policy != nil &&
|
||||||
|
(*results.DmarcRecord.Policy == "quarantine" ||
|
||||||
|
*results.DmarcRecord.Policy == "reject")
|
||||||
|
|
||||||
// Deduct points based on the all mechanism qualifier
|
// Deduct points based on the all mechanism qualifier
|
||||||
if mainSPF.AllQualifier != nil {
|
if mainSPF.AllQualifier != nil {
|
||||||
switch *mainSPF.AllQualifier {
|
switch *mainSPF.AllQualifier {
|
||||||
|
|
@ -249,11 +255,17 @@ func (d *DNSAnalyzer) calculateSPFScore(results *api.DNSResults) (score int) {
|
||||||
// Strict fail - no deduction, this is the recommended policy
|
// Strict fail - no deduction, this is the recommended policy
|
||||||
score += 25
|
score += 25
|
||||||
case "~":
|
case "~":
|
||||||
// Softfail - moderate penalty
|
// Softfail - if DMARC is quarantine or reject, treat it mostly like strict fail
|
||||||
|
if dmarcStrict {
|
||||||
|
score += 20
|
||||||
|
}
|
||||||
|
// Otherwise, moderate penalty (no points added or deducted)
|
||||||
case "+", "?":
|
case "+", "?":
|
||||||
// Pass/neutral - severe penalty
|
// Pass/neutral - severe penalty
|
||||||
|
if !dmarcStrict {
|
||||||
score -= 25
|
score -= 25
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// No 'all' mechanism qualifier extracted - severe penalty
|
// No 'all' mechanism qualifier extracted - severe penalty
|
||||||
score -= 25
|
score -= 25
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<!-- SPF Records (for Return-Path Domain) -->
|
<!-- SPF Records (for Return-Path Domain) -->
|
||||||
<SpfRecordsDisplay spfRecords={dnsResults.spf_records} />
|
<SpfRecordsDisplay spfRecords={dnsResults.spf_records} dmarcRecord={dnsResults.dmarc_record} />
|
||||||
|
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,27 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { SpfRecord } from "$lib/api/types.gen";
|
import type { DmarcRecord, SpfRecord } from "$lib/api/types.gen";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
spfRecords?: SpfRecord[];
|
spfRecords?: SpfRecord[];
|
||||||
|
dmarcRecord?: DmarcRecord;
|
||||||
}
|
}
|
||||||
|
|
||||||
let { spfRecords }: Props = $props();
|
let { spfRecords, dmarcRecord }: Props = $props();
|
||||||
|
|
||||||
|
// Check if DMARC has strict policy (quarantine or reject)
|
||||||
|
const dmarcStrict = $derived(
|
||||||
|
dmarcRecord?.valid &&
|
||||||
|
dmarcRecord?.policy &&
|
||||||
|
(dmarcRecord.policy === "quarantine" || dmarcRecord.policy === "reject")
|
||||||
|
);
|
||||||
|
|
||||||
// Compute overall validity
|
// Compute overall validity
|
||||||
const spfIsValid = $derived(spfRecords?.reduce((acc, r) => acc && r.valid, true) ?? false);
|
const spfIsValid = $derived(spfRecords?.reduce((acc, r) => acc && r.valid, true) ?? false);
|
||||||
const spfCanBeImprove = $derived(
|
const spfCanBeImprove = $derived(
|
||||||
spfRecords &&
|
spfRecords &&
|
||||||
spfRecords.length > 0 &&
|
spfRecords.length > 0 &&
|
||||||
spfRecords.filter((r) => !r.record?.includes(" redirect="))[0]?.all_qualifier != "-",
|
spfRecords.filter((r) => !r.record?.includes(" redirect="))[0]?.all_qualifier != "-" &&
|
||||||
|
!dmarcStrict,
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
@ -71,6 +80,8 @@
|
||||||
<div class="alert small mt-2" class:alert-warning={spf.all_qualifier !== '-'} class:alert-success={spf.all_qualifier === '-'}>
|
<div class="alert small mt-2" class:alert-warning={spf.all_qualifier !== '-'} class:alert-success={spf.all_qualifier === '-'}>
|
||||||
{#if spf.all_qualifier === '-'}
|
{#if spf.all_qualifier === '-'}
|
||||||
All unauthorized servers will be rejected. This is the recommended strict policy.
|
All unauthorized servers will be rejected. This is the recommended strict policy.
|
||||||
|
{:else if dmarcStrict}
|
||||||
|
While your DMARC {dmarcRecord?.policy} policy provides some protection, consider using <code>-all</code> for better security with some old mailbox providers.
|
||||||
{:else if spf.all_qualifier === '~'}
|
{:else if spf.all_qualifier === '~'}
|
||||||
Unauthorized servers will softfail. Consider using <code>-all</code> for stricter policy, though this rarely affects legitimate email deliverability.
|
Unauthorized servers will softfail. Consider using <code>-all</code> for stricter policy, though this rarely affects legitimate email deliverability.
|
||||||
{:else if spf.all_qualifier === '+'}
|
{:else if spf.all_qualifier === '+'}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue