<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: toolbox-poster</title>
    <description>The latest articles on DEV Community by toolbox-poster (@toolbox_starnomina).</description>
    <link>https://dev.to/toolbox_starnomina</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3875373%2F4a93db7e-1799-4892-be4c-52b15227bbed.jpeg</url>
      <title>DEV Community: toolbox-poster</title>
      <link>https://dev.to/toolbox_starnomina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toolbox_starnomina"/>
    <language>en</language>
    <item>
      <title>How to Convert JSON Data Easily Online</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:26:28 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/how-to-convert-json-data-easily-online-dhc</link>
      <guid>https://dev.to/toolbox_starnomina/how-to-convert-json-data-easily-online-dhc</guid>
      <description>&lt;p&gt;JSON is the standard data format for APIs and web applications, but not everyone works with JSON natively. Marketers need CSV for spreadsheets, managers need formatted reports, and analysts need structured data they can sort and filter.&lt;/p&gt;

&lt;p&gt;This guide walks through common JSON conversion tasks step by step, using free online tools that require no coding knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Converting JSON to CSV
&lt;/h2&gt;

&lt;p&gt;The most common JSON conversion task is turning an array of objects into a spreadsheet-friendly CSV format.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Get Your JSON Data
&lt;/h3&gt;

&lt;p&gt;Your JSON typically comes from an API response, a database export, or a file. It should be an array of objects with consistent keys:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[{"name": "Alice", "email": "alice@example.com", "role": "Admin"}, {"name": "Bob", "email": "bob@example.com", "role": "User"}]&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Paste Into the Converter
&lt;/h3&gt;

&lt;p&gt;Open our &lt;a href="https://toolbox.starnomina.tn/tools/json-to-csv" rel="noopener noreferrer"&gt;JSON to CSV Converter&lt;/a&gt; and paste your JSON data. The tool automatically detects the structure and extracts column headers from the object keys.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Choose Your Delimiter
&lt;/h3&gt;

&lt;p&gt;Select comma (standard CSV), tab (for tab-separated values), or semicolon (common in European locales where commas are decimal separators).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Download or Copy
&lt;/h3&gt;

&lt;p&gt;Click Download to save as a .csv file, or Copy to paste directly into Excel, Google Sheets, or any spreadsheet application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formatting JSON for Readability
&lt;/h2&gt;

&lt;p&gt;Raw JSON from APIs is typically minified — a single long line with no formatting. This is efficient for transmission but impossible to read.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using the JSON Formatter
&lt;/h3&gt;

&lt;p&gt;Open our &lt;a href="https://toolbox.starnomina.tn/tools/json-formatter" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt;, paste your raw JSON, and it's instantly formatted with proper indentation. You can choose 2-space or 4-space indentation, sort keys alphabetically, or switch to the interactive tree view for deep data exploration.&lt;/p&gt;

&lt;p&gt;The formatter also validates your JSON in real time. If there's a syntax error — a missing comma, an unclosed bracket — you'll see an immediate error message telling you exactly what's wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validating JSON Before Processing
&lt;/h2&gt;

&lt;p&gt;Before sending JSON to an API or saving it to a configuration file, validate it. Common issues include trailing commas (valid in JavaScript but NOT in JSON), single quotes (JSON requires double quotes), and unquoted keys.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://toolbox.starnomina.tn/tools/json-formatter" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt; catches all these errors instantly. The validation runs as you type, so you can fix issues iteratively without switching between tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Nested JSON
&lt;/h2&gt;

&lt;p&gt;Many API responses contain deeply nested structures — objects within arrays within objects. For these, the tree view in our &lt;a href="https://toolbox.starnomina.tn/tools/json-formatter" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt; is invaluable. Each level can be collapsed or expanded independently, and hovering shows the node type and child count.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encoding JSON for URLs and APIs
&lt;/h2&gt;

&lt;p&gt;Need to pass JSON as a URL parameter? Our &lt;a href="https://toolbox.starnomina.tn/tools/url-encoder" rel="noopener noreferrer"&gt;URL Encoder&lt;/a&gt; properly encodes special characters like braces, brackets, and quotes so they survive URL transmission intact.&lt;/p&gt;

&lt;p&gt;For embedding JSON in other contexts (email, database fields), our &lt;a href="https://toolbox.starnomina.tn/tools/base64-encoder" rel="noopener noreferrer"&gt;Base64 Encoder&lt;/a&gt; converts JSON to a safe, portable text format that can be stored or transmitted through any text-based channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing JSON Structures
&lt;/h2&gt;

&lt;p&gt;When you need to compare two JSON objects (e.g., staging vs. production config), use the Sort Keys feature to normalize key ordering first. With keys sorted identically, standard text diff tools will accurately highlight the actual value differences.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSON to CSV Conversion Tips
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Flatten nested objects first:&lt;/strong&gt; CSV is a flat format — it doesn't support nesting. If your JSON has nested objects, you may need to flatten them or select specific fields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handle arrays within objects:&lt;/strong&gt; If an object property contains an array, it will be converted to a string representation in CSV. For complex structures, consider extracting the nested data separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check for consistent schemas:&lt;/strong&gt; The converter works best when all objects have the same keys. Missing keys will produce empty cells in the CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Converting and working with JSON doesn't require programming skills or expensive software. Our free online tools handle the most common tasks — &lt;a href="https://toolbox.starnomina.tn/tools/json-to-csv" rel="noopener noreferrer"&gt;JSON to CSV conversion&lt;/a&gt;, &lt;a href="https://toolbox.starnomina.tn/tools/json-formatter" rel="noopener noreferrer"&gt;formatting and validation&lt;/a&gt;, and &lt;a href="https://toolbox.starnomina.tn/tools/base64-encoder" rel="noopener noreferrer"&gt;encoding for safe transmission&lt;/a&gt; — all in your browser with no data leaving your device.&lt;/p&gt;

&lt;p&gt;Explore our complete &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;collection of 20+ free tools&lt;/a&gt; for more data processing, conversion, and analysis utilities.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/how-to-convert-json-easily-online" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tools</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>DNS Lookup Explained: A Beginner's Guide</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:26:18 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/dns-lookup-explained-a-beginners-guide-547l</link>
      <guid>https://dev.to/toolbox_starnomina/dns-lookup-explained-a-beginners-guide-547l</guid>
      <description>&lt;p&gt;When you type a URL into your browser, a remarkable chain of events happens in milliseconds. The Domain Name System (DNS) translates the human-readable domain name into the numeric IP address that computers use to communicate. Understanding DNS is essential for anyone managing websites, email, or online services.&lt;/p&gt;

&lt;h2&gt;
  
  
  How DNS Works — The Big Picture
&lt;/h2&gt;

&lt;p&gt;Think of DNS as the internet's phone book. Just as you look up a person's name to find their phone number, DNS looks up a domain name to find its IP address.&lt;/p&gt;

&lt;p&gt;When you visit &lt;em&gt;example.com&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Your browser checks its cache.&lt;/strong&gt; If you recently visited the site, the IP address may be stored locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Your operating system checks its cache.&lt;/strong&gt; The OS maintains its own DNS cache.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Your router/ISP resolver queries DNS servers.&lt;/strong&gt; If the answer isn't cached locally, the query goes to a recursive DNS resolver (usually your ISP's or a public resolver like Cloudflare 1.1.1.1 or Google 8.8.8.8).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The resolver queries the authoritative name servers.&lt;/strong&gt; Starting from the root servers, through the TLD (.com, .tn, .org) servers, to the domain's authoritative name servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The IP address is returned.&lt;/strong&gt; Your browser can now connect to the web server.&lt;/p&gt;

&lt;p&gt;This entire process typically takes 20-120 milliseconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding DNS Record Types
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A Records (Address)
&lt;/h3&gt;

&lt;p&gt;The most fundamental record type. An A record maps a domain name to an IPv4 address (e.g., &lt;code&gt;example.com → 93.184.216.34&lt;/code&gt;). This is what directs web traffic to your server.&lt;/p&gt;

&lt;p&gt;You can check A records for any domain using our &lt;a href="https://toolbox.starnomina.tn/tools/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup&lt;/a&gt; tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  AAAA Records (IPv6 Address)
&lt;/h3&gt;

&lt;p&gt;The IPv6 equivalent of A records. As IPv4 addresses run out, AAAA records become increasingly important. They map domains to 128-bit IPv6 addresses like &lt;code&gt;2606:2800:220:1:248:1893:25c8:1946&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  MX Records (Mail Exchange)
&lt;/h3&gt;

&lt;p&gt;MX records specify which mail servers handle email for a domain. They include a priority value — lower numbers indicate higher priority. For example, Google Workspace typically uses:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MX 1 aspmx.l.google.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MX 5 alt1.aspmx.l.google.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MX 10 alt2.aspmx.l.google.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If email isn't working for your domain, MX records are the first thing to check with our &lt;a href="https://toolbox.starnomina.tn/tools/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  CNAME Records (Canonical Name)
&lt;/h3&gt;

&lt;p&gt;CNAME records create aliases. For example, &lt;code&gt;www.example.com&lt;/code&gt; might have a CNAME pointing to &lt;code&gt;example.com&lt;/code&gt;, or to a CDN like &lt;code&gt;d1234.cloudfront.net&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Important: CNAME records cannot coexist with other record types for the same name (except DNSSEC records). This is why the root domain (&lt;code&gt;example.com&lt;/code&gt;) typically uses A records instead of CNAME.&lt;/p&gt;

&lt;h3&gt;
  
  
  TXT Records
&lt;/h3&gt;

&lt;p&gt;TXT records store text data and serve several critical functions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPF (Sender Policy Framework):&lt;/strong&gt; Specifies which mail servers are authorized to send email from your domain. Prevents email spoofing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKIM (DomainKeys Identified Mail):&lt;/strong&gt; Publishes the public key used to verify email digital signatures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DMARC (Domain-based Message Authentication):&lt;/strong&gt; Defines the policy for handling emails that fail SPF/DKIM checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain verification:&lt;/strong&gt; Google, Microsoft, and other services use TXT records to verify domain ownership.&lt;/p&gt;

&lt;h3&gt;
  
  
  NS Records (Name Server)
&lt;/h3&gt;

&lt;p&gt;NS records define which servers are authoritative for a domain's DNS zone. When you register a domain with a registrar and set nameservers, you're updating NS records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common DNS Problems and Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Website Not Found" After Domain Registration
&lt;/h3&gt;

&lt;p&gt;DNS propagation can take 24-48 hours after changing nameservers. Check your A records with our &lt;a href="https://toolbox.starnomina.tn/tools/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup&lt;/a&gt; — if they return the correct IP but the site doesn't load, propagation may still be in progress.&lt;/p&gt;

&lt;h3&gt;
  
  
  Email Not Working
&lt;/h3&gt;

&lt;p&gt;Check MX records first. Missing or incorrect MX records are the most common cause of email delivery failures. Also verify SPF and DKIM TXT records to prevent emails from being rejected as spam.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Not Secure" SSL Warnings
&lt;/h3&gt;

&lt;p&gt;If your SSL certificate covers &lt;code&gt;example.com&lt;/code&gt; but you're accessing &lt;code&gt;www.example.com&lt;/code&gt; (or vice versa), check that both A records and any CNAME records point correctly. Let's Encrypt certificates need to match the exact domain names in your DNS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Our DNS Lookup Tool
&lt;/h2&gt;

&lt;p&gt;Our &lt;a href="https://toolbox.starnomina.tn/tools/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup&lt;/a&gt; queries through Cloudflare's 1.1.1.1 resolver — one of the fastest and most reliable public DNS resolvers. Simply enter a domain and select the record type you want to check.&lt;/p&gt;

&lt;p&gt;The tool queries A, AAAA, MX, CNAME, TXT, and NS records, displaying results with full detail including TTL (Time To Live) values that tell you how long the record is cached.&lt;/p&gt;

&lt;h2&gt;
  
  
  DNS Security Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Always set SPF, DKIM, and DMARC records&lt;/strong&gt; for domains that send email. This prevents spoofing and improves deliverability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use low TTL values during changes&lt;/strong&gt; (300 seconds) so updates propagate quickly. Increase TTL after changes are confirmed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor your DNS records&lt;/strong&gt; regularly. Unexpected changes could indicate a domain hijacking attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;DNS is the invisible infrastructure that makes the internet work. Understanding record types, how resolution works, and how to diagnose common issues makes you more effective at managing any online presence. Start exploring with our &lt;a href="https://toolbox.starnomina.tn/tools/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup&lt;/a&gt; tool and our &lt;a href="https://toolbox.starnomina.tn/tools/ip-address-lookup" rel="noopener noreferrer"&gt;IP Address Lookup&lt;/a&gt; for complete network diagnostics.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/dns-lookup-explained-beginners" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>dns</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why Online Tools Save Time in Daily Work</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:26:09 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/why-online-tools-save-time-in-daily-work-3h41</link>
      <guid>https://dev.to/toolbox_starnomina/why-online-tools-save-time-in-daily-work-3h41</guid>
      <description>&lt;p&gt;We don't lose productivity in big chunks — we lose it in small, repeated moments of friction. Looking up a conversion formula. Finding the right encoding function. Debugging a regex pattern. Checking a DNS record. These tasks take 2-5 minutes each, but they happen dozens of times per week.&lt;/p&gt;

&lt;p&gt;Browser-based tools eliminate these moments entirely. Here's why they matter and how to build a toolkit that saves hours every week.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Small Tasks
&lt;/h2&gt;

&lt;p&gt;Consider a typical developer's week:&lt;/p&gt;

&lt;p&gt;• Formatting JSON responses — 3 times, ~2 minutes each = &lt;strong&gt;6 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Converting between units or currencies — 5 times, ~1 minute each = &lt;strong&gt;5 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Encoding/decoding Base64 or URLs — 4 times, ~2 minutes each = &lt;strong&gt;8 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Generating test passwords — 2 times, ~3 minutes each = &lt;strong&gt;6 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Checking DNS records — 2 times, ~3 minutes each = &lt;strong&gt;6 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Converting text case — 5 times, ~1 minute each = &lt;strong&gt;5 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Counting words or characters — 3 times, ~1 minute each = &lt;strong&gt;3 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;39 minutes per week&lt;/strong&gt; — over &lt;strong&gt;33 hours per year&lt;/strong&gt; — spent on tasks that should be instant. And this is a conservative estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Browser-Based Beats Desktop
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Zero Installation
&lt;/h3&gt;

&lt;p&gt;Desktop tools need downloading, installing, updating, and managing licenses. Browser tools are always available at a URL — open it and work. No setup, no maintenance, no disk space.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-Platform by Default
&lt;/h3&gt;

&lt;p&gt;Working on a Mac at home, Windows at the office, and a Chromebook while traveling? Browser tools work identically everywhere. No platform-specific versions, no compatibility issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Always Current
&lt;/h3&gt;

&lt;p&gt;Desktop software develops update fatigue. Browser tools update on every page load — you're always on the latest version with the newest features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shareable
&lt;/h3&gt;

&lt;p&gt;When a colleague needs a tool, you send them a URL. No "download this app" or "configure these settings." Just a link.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Your Toolkit
&lt;/h2&gt;

&lt;p&gt;The most productive approach is having a curated set of tools bookmarked and ready. Here's a recommended toolkit organized by task type:&lt;/p&gt;

&lt;h3&gt;
  
  
  For Developers
&lt;/h3&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/json-formatter" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt; — Format, validate, and minify JSON&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/regex-tester" rel="noopener noreferrer"&gt;Regex Tester&lt;/a&gt; — Test patterns with real-time matching&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/hash-generator" rel="noopener noreferrer"&gt;Hash Generator&lt;/a&gt; — MD5/SHA hashes for integrity checks&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/base64-encoder" rel="noopener noreferrer"&gt;Base64 Encoder&lt;/a&gt; — Encode/decode strings and files&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/url-encoder" rel="noopener noreferrer"&gt;URL Encoder&lt;/a&gt; — Encode URL components safely&lt;/p&gt;

&lt;h3&gt;
  
  
  For Writers &amp;amp; Marketers
&lt;/h3&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/word-counter" rel="noopener noreferrer"&gt;Word Counter&lt;/a&gt; — Count words with readability scoring&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/text-case-converter" rel="noopener noreferrer"&gt;Text Case Converter&lt;/a&gt; — Convert between text cases&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/lorem-ipsum-generator" rel="noopener noreferrer"&gt;Lorem Ipsum Generator&lt;/a&gt; — Generate placeholder text&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/qr-code-generator" rel="noopener noreferrer"&gt;QR Code Generator&lt;/a&gt; — Create codes for campaigns&lt;/p&gt;

&lt;h3&gt;
  
  
  For Everyone
&lt;/h3&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/currency-converter" rel="noopener noreferrer"&gt;Currency Converter&lt;/a&gt; — Live exchange rates for 145+ currencies&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/unit-converter" rel="noopener noreferrer"&gt;Unit Converter&lt;/a&gt; — Length, weight, temperature, and more&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/time-zone-converter" rel="noopener noreferrer"&gt;Time Zone Converter&lt;/a&gt; — Schedule across timezones&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/password-generator" rel="noopener noreferrer"&gt;Password Generator&lt;/a&gt; — Create secure passwords&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://toolbox.starnomina.tn/tools/image-compressor" rel="noopener noreferrer"&gt;Image Compressor&lt;/a&gt; — Shrink images for web&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy Advantage
&lt;/h2&gt;

&lt;p&gt;Many online tools send your data to servers for processing. This creates privacy concerns, especially for sensitive content like passwords, source code, or business data.&lt;/p&gt;

&lt;p&gt;Client-side tools process everything in your browser — no data ever leaves your device. Every tool in our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;collection&lt;/a&gt; is 100% client-side, which means you can safely process confidential information without privacy worries.&lt;/p&gt;

&lt;p&gt;Learn more about why this matters in our article on &lt;a href="https://toolbox.starnomina.tn/blog/why-client-side-matters" rel="noopener noreferrer"&gt;client-side processing and privacy&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maximizing Efficiency
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bookmark your top 5 tools.&lt;/strong&gt; The tools you use most should be one click away in your browser's bookmarks bar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use keyboard shortcuts.&lt;/strong&gt; Most tools support Ctrl+V for paste and Ctrl+C for copy. Our tools also support Ctrl+K for a quick search across all tools from the header.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep tools open in pinned tabs.&lt;/strong&gt; For tools you use many times per day (like JSON Formatter or Text Case Converter), pin the tab so it's always accessible without navigating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Productivity is about eliminating friction, not working harder. Browser-based tools turn 2-minute tasks into 2-second tasks, and those saved minutes compound into significant time over weeks and months. Build your toolkit, bookmark the essentials, and reclaim your time for work that actually matters.&lt;/p&gt;

&lt;p&gt;Start building your toolkit at &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;toolbox.starnomina.tn/tools&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/online-tools-save-time-daily-work" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tools</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>SPF Records Explained: Prevent Email Spoofing with Sender Policy Framework</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:25:53 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/spf-records-explained-prevent-email-spoofing-with-sender-policy-framework-1lad</link>
      <guid>https://dev.to/toolbox_starnomina/spf-records-explained-prevent-email-spoofing-with-sender-policy-framework-1lad</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
SPF (Sender Policy Framework) is the first line of defense against email spoofing, allowing domain owners to declare which IP addresses and servers are authorized to send mail on their behalf. Defined in RFC 7208, SPF has a deceptively simple syntax but hides critical constraints — most notably the 10 DNS lookup limit that silently breaks authentication for complex sending infrastructures. This guide covers every mechanism, qualifier, and modifier in the SPF specification, walks through real-world lookup counting, and explains how SPF interacts with DMARC alignment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How SPF Works&lt;/li&gt;
&lt;li&gt;SPF Result Codes&lt;/li&gt;
&lt;li&gt;Full Mechanism Reference&lt;/li&gt;
&lt;li&gt;The 10-Lookup Limit&lt;/li&gt;
&lt;li&gt;Real Lookup Count Examples&lt;/li&gt;
&lt;li&gt;Provider Include Directives&lt;/li&gt;
&lt;li&gt;SPF + DMARC Alignment&lt;/li&gt;
&lt;li&gt;SPF Flattening Techniques&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;Sources &amp;amp; References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. How SPF Works
&lt;/h2&gt;

&lt;p&gt;When a receiving mail server accepts an incoming SMTP connection, it extracts the domain from the &lt;code&gt;MAIL FROM&lt;/code&gt; command (the &lt;strong&gt;envelope sender&lt;/strong&gt;, also called the Return-Path) and performs a DNS TXT lookup on that domain. If an SPF record is found, the receiver evaluates the connecting IP against the authorized mechanisms listed in the record.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — SPF (Sender Policy Framework) is a DNS-based email authentication protocol (RFC 7208) that allows a domain owner to publish a list of IP addresses and hostnames authorized to send email using that domain as the envelope sender.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# SPF evaluation flow
1. Sender connects from IP 198.51.100.42
2. SMTP MAIL FROM: user@example.com
3. Receiver queries TXT record for example.com
4. Record: "v=spf1 ip4:198.51.100.0/24 include:_spf.google.com -all"
5. 198.51.100.42 matches ip4:198.51.100.0/24 → Result: PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ SPF does NOT validate the From: header that users see in their mail client. It validates the MAIL FROM (envelope sender / Return-Path). This is why DMARC alignment is required to connect SPF results to the visible sender identity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. SPF Result Codes
&lt;/h2&gt;

&lt;p&gt;RFC 7208 §2.6 defines seven possible evaluation results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Qualifier&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Typical Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pass&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;+&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;IP is explicitly authorized&lt;/td&gt;
&lt;td&gt;Accept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fail&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP is explicitly not authorized&lt;/td&gt;
&lt;td&gt;Reject or mark as spam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SoftFail&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP is probably not authorized (transitional)&lt;/td&gt;
&lt;td&gt;Accept but flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neutral&lt;/td&gt;
&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain makes no assertion about this IP&lt;/td&gt;
&lt;td&gt;Accept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;No SPF record found&lt;/td&gt;
&lt;td&gt;Accept (no policy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PermError&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Permanent error (syntax error, &amp;gt;10 lookups)&lt;/td&gt;
&lt;td&gt;Treat as fail or neutral (receiver-dependent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TempError&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Temporary DNS error&lt;/td&gt;
&lt;td&gt;Try again later (4xx)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🚫 PermError is silent and catastrophic. If your SPF record exceeds 10 DNS lookups, receivers return PermError — which many treat as a fail. Your legitimate mail gets blocked or junked, and you receive no bounce notification.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Full Mechanism Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;DNS Lookups&lt;/th&gt;
&lt;th&gt;Syntax&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ip4:198.51.100.0/24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Match IPv4 address or CIDR range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ip6:2001:db8::/32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Match IPv6 address or CIDR range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;a&lt;/code&gt; or &lt;code&gt;a:mail.example.com&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Match the A/AAAA record of the domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 + MX lookups&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mx&lt;/code&gt; or &lt;code&gt;mx:example.com&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Match the MX hosts' IPs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 + nested&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.google.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Evaluate another domain's SPF record recursively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exists&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;exists:%{i}.bl.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pass if A record exists for macro-expanded domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-all&lt;/code&gt; / &lt;code&gt;~all&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Catch-all — always matches (must be last)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;redirect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;redirect=_spf.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Replace entire record with another domain's SPF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;exp=explain._spf.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom explanation string for failures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 The ptr mechanism exists in the spec but RFC 7208 §5.5 explicitly discourages its use: "This mechanism SHOULD NOT be published." It is slow, unreliable, and counts as a DNS lookup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. The 10 DNS Lookup Limit
&lt;/h2&gt;

&lt;p&gt;RFC 7208 §4.6.4 imposes a hard limit: SPF evaluation must not cause more than &lt;strong&gt;10 DNS mechanisms/modifiers that require lookups&lt;/strong&gt;. This includes &lt;code&gt;include&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;mx&lt;/code&gt;, &lt;code&gt;exists&lt;/code&gt;, &lt;code&gt;redirect&lt;/code&gt;, and &lt;code&gt;ptr&lt;/code&gt;. It does &lt;strong&gt;not&lt;/strong&gt; include &lt;code&gt;ip4&lt;/code&gt;, &lt;code&gt;ip6&lt;/code&gt;, or &lt;code&gt;all&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# These count toward the 10-lookup limit:
include:   → 1 lookup (+ any nested lookups from the included record)
a          → 1 lookup
mx         → 1 lookup (+ additional A lookups for each MX host)
exists     → 1 lookup
redirect   → 1 lookup
ptr        → 1 lookup (deprecated)

# These do NOT count:
ip4:       → 0 lookups (direct IP comparison)
ip6:       → 0 lookups (direct IP comparison)
all        → 0 lookups (catch-all terminator)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;10maximum DNS lookups allowed per SPF evaluation (RFC 7208 §4.6.4)&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The limit is recursive. If include:_spf.google.com itself contains 3 include: directives, those 3 count toward your total of 10.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Void Lookup Limit
&lt;/h3&gt;

&lt;p&gt;RFC 7208 §4.6.4 also defines a &lt;strong&gt;void lookup limit of 2&lt;/strong&gt;. A void lookup is a DNS query that returns either NXDOMAIN or an empty answer. If more than 2 void lookups occur during evaluation, the result is PermError.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Real Lookup Count Examples
&lt;/h2&gt;

&lt;p&gt;Here is a real-world example of how lookups accumulate for a domain using Google Workspace, Mailchimp, and SendGrid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:servers.mcsv.net include:sendgrid.net -all

Lookup count breakdown:
┌─ include:_spf.google.com          → 1
│  ├─ include:_netblocks.google.com  → 2
│  ├─ include:_netblocks2.google.com → 3
│  └─ include:_netblocks3.google.com → 4
├─ include:servers.mcsv.net          → 5
│  └─ include:mcsv.net               → 6
├─ include:sendgrid.net              → 7
│  └─ include:u12345.wl.sendgrid.net → 8
└─ Total: 8 lookups ✅ (under 10)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🚫 Now add Salesforce (include:_spf.salesforce.com → 1) and Zendesk (include:mail.zendesk.com → 2 nested). That brings you to 11 lookups — PermError. Your email breaks silently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6. Provider Include Directives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Include Directive&lt;/th&gt;
&lt;th&gt;DNS Lookups Used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.google.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:spf.protection.outlook.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:sendgrid.net&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mailchimp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:servers.mcsv.net&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon SES&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:amazonses.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salesforce&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.salesforce.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HubSpot&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:spf.hubspot.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:mail.zendesk.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freshdesk&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:email.freshdesk.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Before adding a new include:, always check its nested lookup count with an SPF checker tool. A single include can consume 1–5 lookups depending on the provider's own SPF chain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7. SPF + DMARC Alignment
&lt;/h2&gt;

&lt;p&gt;For DMARC to consider SPF as a passing authentication method, two conditions must be met:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;SPF must evaluate to Pass for the &lt;code&gt;MAIL FROM&lt;/code&gt; domain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;MAIL FROM&lt;/code&gt; domain must align with the &lt;code&gt;From:&lt;/code&gt; header domain (relaxed or strict per DMARC's &lt;code&gt;aspf&lt;/code&gt; tag).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Most third-party senders use their own Return-Path (e.g., bounces.sendgrid.net), which means SPF passes for their domain, not yours. SPF alignment fails — DMARC must rely on DKIM alignment instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Custom Return-Path
&lt;/h3&gt;

&lt;p&gt;To achieve SPF alignment with third-party senders, configure a &lt;strong&gt;custom return-path&lt;/strong&gt; using your subdomain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instead of:
&lt;/span&gt;&lt;span class="n"&gt;Return&lt;/span&gt;-&lt;span class="n"&gt;Path&lt;/span&gt;: &lt;span class="n"&gt;bounces&lt;/span&gt;@&lt;span class="n"&gt;em&lt;/span&gt;.&lt;span class="n"&gt;sendgrid&lt;/span&gt;.&lt;span class="n"&gt;net&lt;/span&gt;     → &lt;span class="n"&gt;SPF&lt;/span&gt; &lt;span class="n"&gt;passes&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sendgrid&lt;/span&gt;.&lt;span class="n"&gt;net&lt;/span&gt; (&lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;aligned&lt;/span&gt;)

&lt;span class="c"&gt;# Configure:
&lt;/span&gt;&lt;span class="n"&gt;Return&lt;/span&gt;-&lt;span class="n"&gt;Path&lt;/span&gt;: &lt;span class="n"&gt;bounces&lt;/span&gt;@&lt;span class="n"&gt;em&lt;/span&gt;.&lt;span class="n"&gt;yourdomain&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;   → &lt;span class="n"&gt;SPF&lt;/span&gt; &lt;span class="n"&gt;passes&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt; &lt;span class="n"&gt;yourdomain&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt; (&lt;span class="n"&gt;aligned&lt;/span&gt;!)

&lt;span class="c"&gt;# DNS: Add CNAME
&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;.&lt;span class="n"&gt;yourdomain&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt; → &lt;span class="n"&gt;u12345&lt;/span&gt;.&lt;span class="n"&gt;wl&lt;/span&gt;.&lt;span class="n"&gt;sendgrid&lt;/span&gt;.&lt;span class="n"&gt;net&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. SPF Flattening Techniques
&lt;/h2&gt;

&lt;p&gt;When you hit the 10-lookup limit, &lt;strong&gt;SPF flattening&lt;/strong&gt; replaces &lt;code&gt;include:&lt;/code&gt; directives with their resolved &lt;code&gt;ip4:&lt;/code&gt; and &lt;code&gt;ip6:&lt;/code&gt; addresses, reducing lookups to zero for those entries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before flattening (8 lookups):
&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;=&lt;span class="n"&gt;spf1&lt;/span&gt; &lt;span class="n"&gt;include&lt;/span&gt;:&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;spf&lt;/span&gt;.&lt;span class="n"&gt;google&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;include&lt;/span&gt;:&lt;span class="n"&gt;servers&lt;/span&gt;.&lt;span class="n"&gt;mcsv&lt;/span&gt;.&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="n"&gt;include&lt;/span&gt;:&lt;span class="n"&gt;sendgrid&lt;/span&gt;.&lt;span class="n"&gt;net&lt;/span&gt; -&lt;span class="n"&gt;all&lt;/span&gt;

&lt;span class="c"&gt;# After flattening (0 lookups for Google IPs):
&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;=&lt;span class="n"&gt;spf1&lt;/span&gt; &lt;span class="n"&gt;ip4&lt;/span&gt;:&lt;span class="m"&gt;209&lt;/span&gt;.&lt;span class="m"&gt;85&lt;/span&gt;.&lt;span class="m"&gt;128&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;/&lt;span class="m"&gt;17&lt;/span&gt; &lt;span class="n"&gt;ip4&lt;/span&gt;:&lt;span class="m"&gt;172&lt;/span&gt;.&lt;span class="m"&gt;217&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;/&lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="n"&gt;ip4&lt;/span&gt;:&lt;span class="m"&gt;108&lt;/span&gt;.&lt;span class="m"&gt;177&lt;/span&gt;.&lt;span class="m"&gt;8&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;/&lt;span class="m"&gt;21&lt;/span&gt;
       &lt;span class="n"&gt;include&lt;/span&gt;:&lt;span class="n"&gt;servers&lt;/span&gt;.&lt;span class="n"&gt;mcsv&lt;/span&gt;.&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="n"&gt;include&lt;/span&gt;:&lt;span class="n"&gt;sendgrid&lt;/span&gt;.&lt;span class="n"&gt;net&lt;/span&gt; -&lt;span class="n"&gt;all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🚫 Flattening is fragile. Provider IPs change without notice. If Google adds a new IP range and your flattened record doesn't include it, mail from that IP fails SPF. You must automate flattening with a tool that re-resolves and updates your DNS record regularly.&lt;/p&gt;

&lt;p&gt;🎯 A safer alternative to flattening is using the redirect= modifier to point to a dynamically managed SPF record on a subdomain, or using a service like Cloudflare's SPF management that handles flattening automatically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  9. Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;End with &lt;code&gt;-all&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Use a hard fail (&lt;code&gt;-all&lt;/code&gt;) in production. &lt;code&gt;~all&lt;/code&gt; (softfail) is for testing only; it lets unauthorized mail through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor lookup count&lt;/strong&gt;&lt;br&gt;
Check your total DNS lookup count after every change. A single vendor addition can push you over 10.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One record per domain&lt;/strong&gt;&lt;br&gt;
RFC 7208 §3.2: a domain must not have multiple SPF records. Two records cause PermError.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid deprecated mechanisms&lt;/strong&gt;&lt;br&gt;
Never use &lt;code&gt;ptr&lt;/code&gt;. It's slow, unreliable, and wastes a lookup. RFC 7208 explicitly discourages it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use ip4/ip6 for static IPs&lt;/strong&gt;&lt;br&gt;
Dedicated servers with fixed IPs should use &lt;code&gt;ip4:&lt;/code&gt;/&lt;code&gt;ip6:&lt;/code&gt; — no lookup cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep under 255 characters per string&lt;/strong&gt;&lt;br&gt;
DNS TXT records are limited to 255-byte strings. Long records must be split into multiple strings within a single TXT record set.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Common Mistakes
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🚫 Multiple SPF records on the same domain. Publishing two TXT records that start with v=spf1 causes PermError (RFC 7208 §3.2). Merge them into one record.&lt;/p&gt;

&lt;p&gt;🚫 Exceeding the 10-lookup limit. This is the #1 SPF misconfiguration. Every include: adds lookups recursively. Use an SPF checker to validate the total.&lt;/p&gt;

&lt;p&gt;⚠️ Using +all. A record ending with +all authorizes the entire internet to send as your domain. This is equivalent to having no SPF record at all.&lt;/p&gt;

&lt;p&gt;⚠️ Forgetting the v=spf1 prefix. Without the version tag, the TXT record is not recognized as SPF. Receivers will return "None" (no SPF found).&lt;/p&gt;

&lt;p&gt;⚠️ Confusing include with redirect. include: evaluates another record and returns its result. redirect= replaces the entire evaluation with another domain's record. redirect cannot coexist with all.&lt;/p&gt;

&lt;p&gt;⚠️ Placing mechanisms after all. The all mechanism matches everything — anything after it is never evaluated. Always put all last.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  11. Tools
&lt;/h2&gt;

&lt;p&gt;Validate and build your SPF records with these tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SPF Record Checker&lt;/td&gt;
&lt;td&gt;Validate syntax, count DNS lookups, detect errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPF Record Generator&lt;/td&gt;
&lt;td&gt;Build a syntactically correct SPF record by selecting providers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  12. Sources &amp;amp; References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 7208 — Sender Policy Framework (SPF) for Authorizing Use of Domains in Email&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 7489 — DMARC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Google Workspace — Authorize email senders with SPF&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Microsoft 365 — Set up SPF to help prevent spoofing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Cloudflare — What is an SPF record?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 M3AAWG — Best Practices for Implementing DMARC (includes SPF guidance)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; SPF tells the world which IPs may send email as your domain — but it only validates the envelope sender, not the visible From: header. Respect the 10 DNS lookup limit religiously, always end with -all, and pair SPF with DKIM so DMARC has a reliable alignment path that survives forwarding. Check your lookup count after every change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/spf-record-guide-prevent-email-spoofing" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>security</category>
      <category>dns</category>
      <category>devops</category>
    </item>
    <item>
      <title>DKIM Explained: How Email Digital Signatures Protect Your Domain</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:25:12 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/dkim-explained-how-email-digital-signatures-protect-your-domain-1i9i</link>
      <guid>https://dev.to/toolbox_starnomina/dkim-explained-how-email-digital-signatures-protect-your-domain-1i9i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
DKIM (DomainKeys Identified Mail) adds a cryptographic signature to every outgoing email, allowing recipients to verify that the message was authorized by the domain owner and was not tampered with in transit. Defined in RFC 6376, DKIM is the most resilient authentication mechanism in the email stack — unlike SPF, it survives forwarding. This guide details the signing architecture, dissects every tag in the DKIM-Signature header, compares RSA and Ed25519 algorithms, and covers key rotation, canonicalization, over-signing, and common failure modes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How DKIM Works&lt;/li&gt;
&lt;li&gt;DKIM-Signature Header Anatomy&lt;/li&gt;
&lt;li&gt;The Selector Concept&lt;/li&gt;
&lt;li&gt;RSA vs Ed25519&lt;/li&gt;
&lt;li&gt;Canonicalization: Simple vs Relaxed&lt;/li&gt;
&lt;li&gt;Key Rotation Procedure&lt;/li&gt;
&lt;li&gt;DKIM + DMARC Alignment&lt;/li&gt;
&lt;li&gt;Over-Signing&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Failures&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;Sources &amp;amp; References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. How DKIM Works
&lt;/h2&gt;

&lt;p&gt;DKIM uses &lt;strong&gt;asymmetric cryptography&lt;/strong&gt; (public/private key pair) to sign emails. The sending server holds the private key; the public key is published in DNS. When a recipient receives the message, it retrieves the public key and verifies the signature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Generation&lt;/strong&gt;&lt;br&gt;
The domain owner generates an RSA (or Ed25519) key pair. The private key is installed on the mail server or ESP. The public key is published as a DNS TXT record at &lt;code&gt;selector._domainkey.example.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Message Signing&lt;/strong&gt;&lt;br&gt;
The sending MTA selects headers to sign (e.g., &lt;code&gt;From&lt;/code&gt;, &lt;code&gt;To&lt;/code&gt;, &lt;code&gt;Subject&lt;/code&gt;, &lt;code&gt;Date&lt;/code&gt;) and the message body. It canonicalizes them (normalizes whitespace), hashes the result, and encrypts the hash with the private key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signature Insertion&lt;/strong&gt;&lt;br&gt;
The encrypted hash (signature) and metadata are placed in a &lt;code&gt;DKIM-Signature&lt;/code&gt; header prepended to the message. This header includes the selector, algorithm, signed headers list, and the base64-encoded signature value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS Lookup&lt;/strong&gt;&lt;br&gt;
The receiving MTA reads the &lt;code&gt;DKIM-Signature&lt;/code&gt; header, extracts the selector (&lt;code&gt;s=&lt;/code&gt;) and domain (&lt;code&gt;d=&lt;/code&gt;), and queries &lt;code&gt;s._domainkey.d&lt;/code&gt; for the public key TXT record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;br&gt;
The receiver re-canonicalizes the signed headers and body, computes the hash, and uses the public key to decrypt the signature. If the hashes match, the signature is &lt;strong&gt;valid&lt;/strong&gt; — the message is authentic and unmodified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DMARC Evaluation&lt;/strong&gt;&lt;br&gt;
If the &lt;code&gt;d=&lt;/code&gt; domain aligns with the &lt;code&gt;From:&lt;/code&gt; header domain (relaxed or strict), DMARC considers DKIM as a passing authentication result.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 DKIM does not encrypt the message content. It only provides a digital signature that proves origin and integrity. The message itself is still transmitted in cleartext (unless TLS is used at the transport layer).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  2. DKIM-Signature Header Anatomy
&lt;/h2&gt;

&lt;p&gt;Every DKIM-signed message contains a &lt;code&gt;DKIM-Signature&lt;/code&gt; header with the following tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;DKIM-Signature&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; v=1; a=rsa-sha256; c=relaxed/relaxed;
  d=example.com; s=selector1; t=1712880000;
  x=1713484800; h=from:to:subject:date:message-id:mime-version;
  bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;
  b=LjxLMKpHN2kQz... (signature value)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Values&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; (always)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Signing algorithm&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;rsa-sha256&lt;/code&gt;, &lt;code&gt;rsa-sha1&lt;/code&gt; (deprecated), &lt;code&gt;ed25519-sha256&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Signing domain (DMARC alignment key)&lt;/td&gt;
&lt;td&gt;e.g., &lt;code&gt;example.com&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Selector (lookup key for public key)&lt;/td&gt;
&lt;td&gt;e.g., &lt;code&gt;selector1&lt;/code&gt;, &lt;code&gt;google&lt;/code&gt;, &lt;code&gt;s1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Signed header fields&lt;/td&gt;
&lt;td&gt;Colon-separated list of header names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Signature data (base64)&lt;/td&gt;
&lt;td&gt;Cryptographic signature value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Body hash (base64)&lt;/td&gt;
&lt;td&gt;Hash of the canonicalized body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Canonicalization (header/body)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;simple/simple&lt;/code&gt; (default), &lt;code&gt;relaxed/relaxed&lt;/code&gt;, &lt;code&gt;relaxed/simple&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Signature timestamp (Unix epoch)&lt;/td&gt;
&lt;td&gt;e.g., &lt;code&gt;1712880000&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Signature expiration (Unix epoch)&lt;/td&gt;
&lt;td&gt;e.g., &lt;code&gt;1713484800&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Body length limit (bytes signed)&lt;/td&gt;
&lt;td&gt;Integer — avoid using&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Agent or user identifier&lt;/td&gt;
&lt;td&gt;Must be a subdomain of &lt;code&gt;d=&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Query method&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dns/txt&lt;/code&gt; (default, only value)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Copied header fields (for diagnostics)&lt;/td&gt;
&lt;td&gt;Pipe-separated copies of signed headers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🚫 Never use the l= (body length) tag. It tells verifiers to only check the first N bytes of the body, allowing attackers to append malicious content after the signed portion. RFC 6376 §8.2 explicitly warns about this vulnerability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. The Selector Concept
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;selector&lt;/strong&gt; is a label that lets a single domain have multiple DKIM keys simultaneously — essential for key rotation and multi-service environments. The public key is published at &lt;code&gt;._domainkey.&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — A DKIM selector is an arbitrary string chosen by the domain owner that identifies a specific public key record in DNS. It is specified in the s= tag of the DKIM-Signature header and used to construct the DNS query: selector._domainkey.domain.com.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Selectors by Provider
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Typical Selector(s)&lt;/th&gt;
&lt;th&gt;DNS Record Location&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;google&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;google._domainkey.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;selector1&lt;/code&gt;, &lt;code&gt;selector2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;selector1._domainkey.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;s1&lt;/code&gt;, &lt;code&gt;s2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s1._domainkey.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mailchimp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;k1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;k1._domainkey.example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon SES&lt;/td&gt;
&lt;td&gt;Auto-generated (CNAME-based)&lt;/td&gt;
&lt;td&gt;3 CNAME records per domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postmark&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;20240101&lt;/code&gt; (date-based)&lt;/td&gt;
&lt;td&gt;CNAME to Postmark DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Use descriptive selectors that include the date or purpose: google-2024, marketing-q1. This makes key rotation audits much easier — you can tell at a glance which keys are current and which are deprecated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. RSA vs Ed25519
&lt;/h2&gt;

&lt;p&gt;RFC 8463 (2018) introduced Ed25519 as an alternative to RSA for DKIM signatures. Here's how they compare:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;RSA-SHA256&lt;/th&gt;
&lt;th&gt;Ed25519-SHA256&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RFC&lt;/td&gt;
&lt;td&gt;RFC 6376&lt;/td&gt;
&lt;td&gt;RFC 8463&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key Size&lt;/td&gt;
&lt;td&gt;1024–4096 bits (2048 recommended)&lt;/td&gt;
&lt;td&gt;256 bits (fixed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signature Size&lt;/td&gt;
&lt;td&gt;~342 bytes (2048-bit)&lt;/td&gt;
&lt;td&gt;88 bytes (fixed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS TXT Record Size&lt;/td&gt;
&lt;td&gt;~400 bytes (2048-bit public key)&lt;/td&gt;
&lt;td&gt;~60 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Slower signing &amp;amp; verification&lt;/td&gt;
&lt;td&gt;Significantly faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Secure at 2048+ bits&lt;/td&gt;
&lt;td&gt;128-bit equivalent security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Receiver Support&lt;/td&gt;
&lt;td&gt;Universal&lt;/td&gt;
&lt;td&gt;Growing (Gmail, Fastmail support it)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 Dual-sign with both RSA-2048 and Ed25519. Receivers that support Ed25519 benefit from smaller signatures and faster verification. Receivers that don't will fall back to the RSA signature. Each signature uses a different selector.&lt;/p&gt;

&lt;p&gt;⚠️ 1024-bit RSA keys are deprecated. RFC 8301 (2018) requires a minimum of 2048 bits for RSA DKIM keys. Some receivers (notably Gmail) will reject 1024-bit signatures. Rotate immediately if you're still using 1024-bit keys.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5. Canonicalization: Simple vs Relaxed
&lt;/h2&gt;

&lt;p&gt;Canonicalization normalizes the message before hashing to tolerate minor modifications by intermediate mail servers. The &lt;code&gt;c=&lt;/code&gt; tag specifies the algorithm for headers and body separately (e.g., &lt;code&gt;c=relaxed/relaxed&lt;/code&gt;).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Headers&lt;/th&gt;
&lt;th&gt;Body&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simple&lt;/td&gt;
&lt;td&gt;No changes — headers must be byte-identical&lt;/td&gt;
&lt;td&gt;Trailing empty lines removed; no other changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relaxed&lt;/td&gt;
&lt;td&gt;Header names lowercased; whitespace folding normalized; trailing whitespace removed&lt;/td&gt;
&lt;td&gt;Whitespace sequences reduced to single space; trailing whitespace on lines removed; trailing empty lines removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# simple/simple — very strict, breaks easily:
Subject: Hello World     ←  exact bytes must match

# relaxed/relaxed — tolerant of whitespace changes:
Subject:Hello World      ←  extra spaces and case changes are normalized
subject: hello world     ←  both canonicalize to the same form
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Always use c=relaxed/relaxed. Intermediate servers (mailing lists, forwarding services, antivirus gateways) frequently modify whitespace. Simple canonicalization causes unnecessary DKIM failures in real-world mail flows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6. Key Rotation Procedure
&lt;/h2&gt;

&lt;p&gt;DKIM keys should be rotated periodically (every 6–12 months) to limit exposure if a private key is compromised. The selector mechanism makes zero-downtime rotation straightforward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate new key pair&lt;/strong&gt;&lt;br&gt;
Create a new RSA-2048 or Ed25519 key pair with a new selector (e.g., &lt;code&gt;dkim-202604&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publish new public key&lt;/strong&gt;&lt;br&gt;
Add the new TXT record at &lt;code&gt;dkim-202604._domainkey.example.com&lt;/code&gt;. Wait for DNS propagation (TTL).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Switch signing to new selector&lt;/strong&gt;&lt;br&gt;
Configure your MTA/ESP to sign outgoing mail with the new private key and selector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor for failures&lt;/strong&gt;&lt;br&gt;
Watch DMARC reports and DKIM verification headers for a few days. Ensure the new key passes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Revoke old key&lt;/strong&gt;&lt;br&gt;
After the overlap period (1–2 weeks), publish an empty &lt;code&gt;p=&lt;/code&gt; tag for the old selector: &lt;code&gt;v=DKIM1; p=&lt;/code&gt;. This tells receivers the key is revoked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remove old DNS record&lt;/strong&gt;&lt;br&gt;
After another TTL cycle, delete the old selector's DNS record entirely.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 An empty p= tag in a DKIM DNS record (RFC 6376 §3.6.1) is the official revocation signal. It tells verifiers that the key has been deliberately revoked, as opposed to a missing record which could be a DNS failure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  7. DKIM + DMARC Alignment
&lt;/h2&gt;

&lt;p&gt;For DMARC to consider DKIM as a passing result, two conditions must be met:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;DKIM signature must verify (valid cryptographic signature).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;d=&lt;/code&gt; domain must align with the &lt;code&gt;From:&lt;/code&gt; header domain.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;DKIM &lt;code&gt;d=&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;From Header&lt;/th&gt;
&lt;th&gt;DMARC &lt;code&gt;adkim&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;Aligned?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exact match&lt;/td&gt;
&lt;td&gt;&lt;code&gt;example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user@example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdomain (relaxed)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mail.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user@example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdomain (strict)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mail.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user@example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party domain&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sendgrid.net&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user@example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Many ESPs sign with d=esp-domain.com by default. You must configure custom DKIM signing so the d= tag uses your domain (or a subdomain of it in relaxed mode) for DMARC alignment to work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  8. Over-Signing
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — Over-signing is a DKIM best practice where the h= tag includes headers that are not present in the message (e.g., listing Reply-To twice). This prevents attackers from adding a spoofed Reply-To header after signing — any addition would invalidate the signature.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Over-signing example: listing headers that don't exist in the message
h=from:to:subject:date:reply-to:reply-to:cc:cc

# "reply-to" is listed twice:
# First instance covers the actual Reply-To header (if present)
# Second instance "seals" the slot — adding a new Reply-To breaks the signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🎯 Over-sign these headers at minimum: From, To, Subject, Date, Reply-To, CC, Content-Type, MIME-Version, Message-ID. Over-signing prevents post-signature header injection attacks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  9. Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use 2048-bit RSA minimum&lt;/strong&gt;&lt;br&gt;
1024-bit keys are deprecated (RFC 8301). Generate 2048-bit keys for all selectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;relaxed/relaxed&lt;/code&gt; canonicalization&lt;/strong&gt;&lt;br&gt;
Simple canonicalization fails too easily with intermediate MTAs. Relaxed is the industry standard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sign with your domain&lt;/strong&gt;&lt;br&gt;
Ensure the &lt;code&gt;d=&lt;/code&gt; tag matches your &lt;code&gt;From:&lt;/code&gt; domain for DMARC alignment. Configure custom DKIM on every ESP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rotate keys every 6–12 months&lt;/strong&gt;&lt;br&gt;
Use the selector system for zero-downtime rotation. Revoke old keys with an empty &lt;code&gt;p=&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-sign critical headers&lt;/strong&gt;&lt;br&gt;
List &lt;code&gt;From&lt;/code&gt;, &lt;code&gt;Reply-To&lt;/code&gt;, &lt;code&gt;Subject&lt;/code&gt;, and &lt;code&gt;CC&lt;/code&gt; twice in the &lt;code&gt;h=&lt;/code&gt; tag to prevent header injection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never use the &lt;code&gt;l=&lt;/code&gt; tag&lt;/strong&gt;&lt;br&gt;
Body length limits allow content to be appended to signed messages. Always sign the full body.&lt;/p&gt;
&lt;h2&gt;
  
  
  10. Common Failures
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🚫 DNS record not found. The most common DKIM failure. Usually caused by a typo in the selector name, missing CNAME, or DNS propagation delay. Always verify with dig TXT selector._domainkey.example.com.&lt;/p&gt;

&lt;p&gt;🚫 Body hash mismatch (bh= tag). The body was modified after signing — typically by a mailing list, antivirus gateway, or footer-appending service. Use relaxed body canonicalization and investigate the specific MTAs in the delivery chain.&lt;/p&gt;

&lt;p&gt;⚠️ Key too short. 512-bit and 1024-bit RSA keys are rejected by many receivers. Gmail logs dkim=neutral (body hash did not verify) for weak keys even when the signature is mathematically valid.&lt;/p&gt;

&lt;p&gt;⚠️ Expired signature. If the x= tag is set and the current time exceeds it, the signature is treated as invalid. Use generous expiration windows (7+ days) or omit x= entirely.&lt;/p&gt;

&lt;p&gt;⚠️ Testing with email headers. To debug DKIM, view the full message headers and look for Authentication-Results. Gmail shows dkim=pass, dkim=fail, or dkim=neutral with a reason string.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;# Gmail Authentication-Results header example&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;Authentication-Results&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; mx.google.com;
  dkim=pass header.i=@example.com header.s=selector1 header.b=LjxLMKpH;
  spf=pass (google.com: domain of user@example.com designates 198.51.100.42 as permitted sender);
  dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DKIM Record Checker&lt;/td&gt;
&lt;td&gt;Look up any selector's public key and validate record syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  12. Sources &amp;amp; References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 6376 — DomainKeys Identified Mail (DKIM) Signatures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 8463 — A New Cryptographic Signature Method for DKIM (Ed25519-SHA256)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 8301 — Cryptographic Algorithm and Key Usage Update to DKIM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 7489 — DMARC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Google Workspace — Turn on DKIM signing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Microsoft 365 — Use DKIM to validate outbound email&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Cloudflare — What is a DKIM record?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 M3AAWG — Best Practices (includes DKIM guidance)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; DKIM is the most durable email authentication mechanism — it survives forwarding, validates message integrity, and provides the preferred alignment path for DMARC. Use 2048-bit RSA or Ed25519, always choose relaxed/relaxed canonicalization, sign with your own domain for DMARC alignment, over-sign critical headers, rotate keys every 6–12 months, and never use the l= body length tag.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/dkim-explained-email-signatures" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>security</category>
      <category>dns</category>
      <category>devops</category>
    </item>
    <item>
      <title>BIMI: Display Your Brand Logo in Email Inboxes</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:24:22 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/bimi-display-your-brand-logo-in-email-inboxes-1hjo</link>
      <guid>https://dev.to/toolbox_starnomina/bimi-display-your-brand-logo-in-email-inboxes-1hjo</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
BIMI (Brand Indicators for Message Identification) is the final layer in the email authentication stack, allowing organizations to display their brand logo directly in recipients' inboxes next to authenticated messages. Built on top of DMARC enforcement, BIMI transforms email authentication from an invisible infrastructure concern into a visible brand asset. This guide covers the DNS record format, SVG Tiny PS requirements, VMC certificates, provider support, cost analysis, and the full setup procedure — including when BIMI is (and isn't) worth the investment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How BIMI Works&lt;/li&gt;
&lt;li&gt;DNS Record Format&lt;/li&gt;
&lt;li&gt;SVG Tiny PS Requirements&lt;/li&gt;
&lt;li&gt;VMC Certificates&lt;/li&gt;
&lt;li&gt;Provider Support Matrix&lt;/li&gt;
&lt;li&gt;DMARC Prerequisite&lt;/li&gt;
&lt;li&gt;Cost Analysis&lt;/li&gt;
&lt;li&gt;Setup Steps&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;Sources &amp;amp; References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. How BIMI Works
&lt;/h2&gt;

&lt;p&gt;BIMI leverages the existing email authentication stack (SPF, DKIM, DMARC) and adds a &lt;strong&gt;visual trust indicator&lt;/strong&gt;. When a message passes DMARC with an enforcement policy, the receiving mail client looks up the sender's BIMI DNS record to retrieve a logo URL and (optionally) a VMC certificate that validates brand ownership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Message arrives&lt;/strong&gt;&lt;br&gt;
The receiver performs standard SPF, DKIM, and DMARC evaluation. The message must pass DMARC with &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BIMI DNS lookup&lt;/strong&gt;&lt;br&gt;
The receiver queries &lt;code&gt;default._bimi.example.com&lt;/code&gt; for a TXT record containing the logo URL and optional VMC URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logo retrieval &amp;amp; VMC validation&lt;/strong&gt;&lt;br&gt;
The receiver fetches the SVG logo from the &lt;code&gt;l=&lt;/code&gt; URL. If a &lt;code&gt;a=&lt;/code&gt; (authority) URL is present, it fetches and validates the VMC certificate against the domain and logo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logo display&lt;/strong&gt;&lt;br&gt;
If all checks pass, the mail client displays the brand logo as the sender's avatar. Without BIMI, a generic initial or silhouette is shown.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — BIMI (Brand Indicators for Message Identification) is an email specification that enables domain owners to display a verified brand logo in supporting email clients, contingent on DMARC enforcement and (for some providers) a Verified Mark Certificate (VMC).&lt;/p&gt;

&lt;p&gt;💡 BIMI is not just cosmetic. Research from the BIMI Working Group shows that brand logos increase email open rates by 10–39% and significantly improve brand recall. It's a deliverability and marketing asset as much as a security one.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  2. DNS Record Format
&lt;/h2&gt;

&lt;p&gt;A BIMI record is a DNS TXT record published at &lt;code&gt;default._bimi.yourdomain.com&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default._bimi.example.com  TXT  "v=BIMI1; l=https://example.com/brand/logo.svg; a=https://example.com/brand/vmc.pem"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BIMI1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Logo URL (HTTPS)&lt;/td&gt;
&lt;td&gt;URL to SVG Tiny PS file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No*&lt;/td&gt;
&lt;td&gt;Authority (VMC certificate URL)&lt;/td&gt;
&lt;td&gt;URL to PEM-encoded VMC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Gmail and Apple Mail **require&lt;/em&gt;* a VMC (&lt;code&gt;a=&lt;/code&gt; tag) to display the logo. Without it, only providers like Fastmail and Yahoo display BIMI logos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The l= URL must use HTTPS with a valid TLS certificate. HTTP URLs are rejected. The SVG file must be served with Content-Type: image/svg+xml and appropriate CORS headers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Selector Variants
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;default&lt;/code&gt; selector covers all mail. You can publish additional selectors for different use cases (e.g., &lt;code&gt;marketing._bimi.example.com&lt;/code&gt;), though receiver support for non-default selectors is limited.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Default BIMI record — applies to all mail
default._bimi.example.com  TXT  "v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/vmc.pem"

# To explicitly disable BIMI for a domain:
default._bimi.example.com  TXT  "v=BIMI1; l=;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. SVG Tiny PS Requirements
&lt;/h2&gt;

&lt;p&gt;BIMI does &lt;strong&gt;not&lt;/strong&gt; accept standard SVG files. The logo must conform to &lt;strong&gt;SVG Tiny PS (Portable/Secure)&lt;/strong&gt;, a restricted profile designed for security and consistent rendering across mail clients.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — SVG Tiny PS is a constrained subset of the SVG Tiny 1.2 specification, created specifically for BIMI. It removes scripting, external references, and other features that could pose security risks in email clients.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Key Requirements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Profile declaration&lt;/td&gt;
&lt;td&gt;Must include &lt;code&gt;baseProfile="tiny-ps"&lt;/code&gt; and &lt;code&gt;version="1.2"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dimensions&lt;/td&gt;
&lt;td&gt;Square aspect ratio required; &lt;code&gt;viewBox&lt;/code&gt; must be square&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Title element&lt;/td&gt;
&lt;td&gt;Must contain a `` element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No scripting&lt;/td&gt;
&lt;td&gt;No ``, event handlers, or JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No external references&lt;/td&gt;
&lt;td&gt;No &lt;code&gt;xlink:href&lt;/code&gt; to external resources, no `` elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No animations&lt;/td&gt;
&lt;td&gt;No &lt;code&gt;, &lt;/code&gt;, or SMIL elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No raster images&lt;/td&gt;
&lt;td&gt;No embedded PNG/JPEG via data URIs or external links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File size&lt;/td&gt;
&lt;td&gt;Should be under 32 KB (recommended limit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background&lt;/td&gt;
&lt;td&gt;Should have a solid background — transparent logos render poorly on varied email client backgrounds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Minimal Valid SVG Tiny PS Template
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;plaintext&lt;/p&gt;

&lt;p&gt;Example Corp Logo&lt;/p&gt;

&lt;p&gt;E&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚫 Common SVG errors that break BIMI: Missing baseProfile="tiny-ps", non-square viewBox, embedded  tags, xlink:href references, inline styles using url() for external resources, gradients referencing filters. Always validate with the BIMI Group's SVG checker.&lt;/p&gt;

&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Export your logo from a vector editor (Illustrator, Figma), then manually clean the SVG: remove metadata, comments, embedded fonts, and Illustrator-specific namespaces. Add the baseProfile="tiny-ps" and version="1.2" attributes. Validate with the BIMI validator before publishing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. VMC Certificates
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Verified Mark Certificate (VMC)&lt;/strong&gt; is an X.509 certificate that cryptographically binds your brand logo to your domain. It is issued by a Certificate Authority after verifying your trademark registration and domain ownership.&lt;/p&gt;

&lt;h3&gt;
  
  
  VMC Issuers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Certificate Authority&lt;/th&gt;
&lt;th&gt;Annual Cost (approx.)&lt;/th&gt;
&lt;th&gt;Trademark Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DigiCert&lt;/td&gt;
&lt;td&gt;$1,299 – $1,499/year&lt;/td&gt;
&lt;td&gt;Registered trademark (USPTO, EUIPO, WIPO Madrid, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrust&lt;/td&gt;
&lt;td&gt;$1,299 – $1,499/year&lt;/td&gt;
&lt;td&gt;Registered trademark&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 As of 2024, DigiCert and Entrust are the only two Certificate Authorities authorized to issue VMC certificates. The BIMI Working Group requires CAs to be members and follow strict validation procedures.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  VMC Validation Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Registered trademark — Your logo must be a registered trademark in an accepted jurisdiction (USPTO, EUIPO, CIPO, IP Australia, WIPO Madrid Protocol, and others).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Domain ownership — You must prove ownership/control of the domain specified in the certificate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Logo match — The SVG file referenced in your BIMI record must match the trademarked logo in the VMC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DMARC enforcement — Your domain must have &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The VMC issuance process typically takes 3–6 weeks due to trademark verification. Plan ahead — you cannot rush this step.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5. Provider Support Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mail Provider&lt;/th&gt;
&lt;th&gt;BIMI Support&lt;/th&gt;
&lt;th&gt;VMC Required?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gmail&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Full support since July 2021; requires VMC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple Mail&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Supported since iOS 16 / macOS Ventura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yahoo/AOL&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Displays BIMI logos without VMC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fastmail&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Early BIMI adopter; no VMC needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Outlook&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Uses proprietary "Brand Indicators" via Microsoft 365 admin; not standard BIMI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zoho Mail&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Supports BIMI without VMC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ProtonMail&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;No BIMI support as of 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thunderbird&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;No BIMI support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;1.8B+mailboxes support BIMI (Gmail + Apple Mail + Yahoo)&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. DMARC Prerequisite
&lt;/h2&gt;

&lt;p&gt;BIMI has a hard dependency on DMARC enforcement. Your domain &lt;strong&gt;must&lt;/strong&gt; have a DMARC record with &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; for BIMI logos to be displayed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DMARC Policy&lt;/th&gt;
&lt;th&gt;BIMI Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BIMI ignored — logo is not displayed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=quarantine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BIMI active — logo displayed for passing messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=reject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BIMI active — logo displayed for passing messages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 If you haven't deployed DMARC yet, start there. Follow the phased rollout (p=none → p=quarantine → p=reject) before investing in BIMI and VMC. BIMI is the reward for achieving full email authentication maturity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7. Cost Analysis
&lt;/h2&gt;

&lt;p&gt;BIMI itself is free (it's a DNS record). The costs come from the VMC certificate and preparation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BIMI DNS record&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;One-time setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVG Tiny PS logo creation&lt;/td&gt;
&lt;td&gt;$0 – $500&lt;/td&gt;
&lt;td&gt;One-time (designer time or self-service)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trademark registration (if not already registered)&lt;/td&gt;
&lt;td&gt;$250 – $2,000+&lt;/td&gt;
&lt;td&gt;Initial filing + maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VMC certificate (DigiCert or Entrust)&lt;/td&gt;
&lt;td&gt;$1,299 – $1,499&lt;/td&gt;
&lt;td&gt;Annual renewal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC enforcement (prerequisite)&lt;/td&gt;
&lt;td&gt;$0 – varies&lt;/td&gt;
&lt;td&gt;Ongoing monitoring &amp;amp; management&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Without VMC: For Yahoo, Fastmail, and Zoho, you can deploy BIMI for free (just a DNS record + SVG). For Gmail and Apple Mail (the vast majority of consumer mailboxes), you need a VMC. The total first-year cost with VMC is typically $1,500 – $3,500.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  When BIMI Is Worth It
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;High email volume&lt;/strong&gt;&lt;br&gt;
If you send millions of emails monthly, a 10–39% increase in open rates easily justifies the VMC cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strong brand recognition&lt;/strong&gt;&lt;br&gt;
Recognizable logos (retail, finance, SaaS) benefit most. A logo people don't recognize adds no value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Already have a trademark&lt;/strong&gt;&lt;br&gt;
If your logo is already registered, VMC cost is the only expense — the ROI is very favorable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phishing target&lt;/strong&gt;&lt;br&gt;
Financial institutions, e-commerce platforms, and government agencies that are frequently impersonated get anti-phishing benefits from visual brand verification.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ BIMI is NOT worth it if: You haven't achieved p=reject DMARC yet, you send very low volume, your brand is new/unknown, or your logo isn't trademarked and you don't plan to trademark it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  8. Setup Steps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Achieve DMARC Enforcement&lt;/strong&gt;&lt;br&gt;
Ensure your domain has &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; with 100% alignment. BIMI requires DMARC to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prepare SVG Tiny PS Logo&lt;/strong&gt;&lt;br&gt;
Convert your logo to SVG Tiny PS format. Square aspect ratio, no scripts, no external references, no raster images. Set &lt;code&gt;baseProfile="tiny-ps"&lt;/code&gt; and &lt;code&gt;version="1.2"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validate SVG&lt;/strong&gt;&lt;br&gt;
Use the BIMI Group's SVG validator or the BIMI Inspector tool to check compliance before publishing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obtain VMC (Optional/Required)&lt;/strong&gt;&lt;br&gt;
If targeting Gmail/Apple Mail, purchase a VMC from DigiCert or Entrust. Provide your trademark registration number and domain verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host Assets&lt;/strong&gt;&lt;br&gt;
Upload the SVG and VMC PEM file to your web server over HTTPS. Ensure correct &lt;code&gt;Content-Type&lt;/code&gt; headers and public accessibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publish DNS Record&lt;/strong&gt;&lt;br&gt;
Add a TXT record at &lt;code&gt;default._bimi.yourdomain.com&lt;/code&gt; with the &lt;code&gt;v=BIMI1; l=&lt;/code&gt; and &lt;code&gt;a=&lt;/code&gt; tags pointing to your hosted files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test &amp;amp; Verify&lt;/strong&gt;&lt;br&gt;
Send a test email to a Gmail account and check if the logo appears. Use BIMI Inspector to verify DNS, SVG, and VMC configuration.&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;plaintext&lt;/p&gt;

&lt;h1&gt;
  
  
  Complete DNS configuration example:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  1. DMARC record (prerequisite)
&lt;/h1&gt;

&lt;p&gt;_dmarc.example.com  TXT  "v=DMARC1; p=reject; rua=mailto:&lt;a href="mailto:dmarc@example.com"&gt;dmarc@example.com&lt;/a&gt;"&lt;/p&gt;

&lt;h1&gt;
  
  
  2. BIMI record
&lt;/h1&gt;

&lt;p&gt;default._bimi.example.com  TXT  "v=BIMI1; l=&lt;a href="https://example.com/brand/logo.svg" rel="noopener noreferrer"&gt;https://example.com/brand/logo.svg&lt;/a&gt;; a=&lt;a href="https://example.com/brand/vmc.pem" rel="noopener noreferrer"&gt;https://example.com/brand/vmc.pem&lt;/a&gt;"&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Validate SVG rigorously&lt;/strong&gt;&lt;br&gt;
Use the official BIMI Group validator. Even minor deviations from SVG Tiny PS will cause silent failures — no logo, no error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a solid background&lt;/strong&gt;&lt;br&gt;
Transparent SVG backgrounds render differently across email clients. Use a solid brand-color background for consistent appearance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep SVG under 32 KB&lt;/strong&gt;&lt;br&gt;
While not a hard limit, larger files may be rejected or slow to render. Optimize paths and remove unnecessary metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor DMARC continuously&lt;/strong&gt;&lt;br&gt;
BIMI vanishes if your DMARC policy drops below enforcement. A single misconfiguration can remove your logo from billions of inboxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan for VMC renewal&lt;/strong&gt;&lt;br&gt;
VMC certificates expire annually. Set a calendar reminder 30 days before expiration and renew early to avoid logo disappearance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache and CDN considerations&lt;/strong&gt;&lt;br&gt;
Receivers cache your SVG logo. After updating, it may take days for the new version to propagate. Use a different filename or cache-busting query parameter.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Common Mistakes
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🚫 Using standard SVG instead of SVG Tiny PS. Regular SVG files exported from Illustrator, Figma, or Inkscape include features not allowed in Tiny PS (gradients with filters, embedded images, metadata). The logo will silently fail to display.&lt;/p&gt;

&lt;p&gt;🚫 Deploying BIMI with p=none DMARC. BIMI requires DMARC enforcement (quarantine or reject). With p=none, receivers ignore the BIMI record entirely.&lt;/p&gt;

&lt;p&gt;⚠️ Non-square logo. BIMI requires a square aspect ratio. Rectangular logos will be rejected or cropped unpredictably by mail clients.&lt;/p&gt;

&lt;p&gt;⚠️ Hosting SVG over HTTP. The l= tag must point to an HTTPS URL with a valid TLS certificate. HTTP URLs are rejected by all BIMI-supporting receivers.&lt;/p&gt;

&lt;p&gt;⚠️ Expecting instant display. After publishing a BIMI record, it can take 24–72 hours for receiver caches to populate. Gmail specifically crawls BIMI records on its own schedule.&lt;/p&gt;

&lt;p&gt;⚠️ Forgetting the VMC for Gmail. About 30% of all email goes to Gmail. Without a VMC, your BIMI setup covers only Yahoo, Fastmail, and smaller providers — a fraction of your audience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  11. Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BIMI Record Checker&lt;/td&gt;
&lt;td&gt;Look up BIMI DNS records, validate SVG URL, and check VMC presence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  12. Sources &amp;amp; References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 BIMI Group — Implementation Guide&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 BIMI Group — SVG Tiny PS Specification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Google Workspace — Set up BIMI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Google — BIMI requirements and troubleshooting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 DigiCert — Verified Mark Certificates (VMC)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Entrust — Verified Mark Certificates (VMC)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 7489 — DMARC (BIMI dependency)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 6376 — DKIM (authentication layer)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 7208 — SPF (authentication layer)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; BIMI is the visible payoff of a mature email authentication stack. It requires DMARC enforcement (p=quarantine or p=reject), a logo in SVG Tiny PS format, and — for Gmail and Apple Mail — a Verified Mark Certificate (~$1,500/year). Deploy BIMI after you've achieved full DMARC enforcement, not before. For high-volume senders with recognized brands, the ROI in open rates and brand protection is substantial. For everyone else, get your DMARC house in order first — BIMI is the cherry on top.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/bimi-brand-logo-email-guide" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>security</category>
      <category>dns</category>
      <category>devops</category>
    </item>
    <item>
      <title>SSL/TLS Certificates Explained: HTTPS Security for Every Website</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:24:11 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/ssltls-certificates-explained-https-security-for-every-website-55ci</link>
      <guid>https://dev.to/toolbox_starnomina/ssltls-certificates-explained-https-security-for-every-website-55ci</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
SSL/TLS certificates are the backbone of encrypted web communication, authenticating server identity and&lt;br&gt;
    protecting data in transit. With over 95% of web traffic now encrypted via HTTPS, understanding certificate&lt;br&gt;
    types, the TLS 1.3 handshake, certificate chains, and common pitfalls is essential for every developer and&lt;br&gt;
    sysadmin. This guide covers the full lifecycle — from issuance to renewal — with practical tooling.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What Is SSL/TLS?&lt;/li&gt;
&lt;li&gt;The TLS 1.3 Handshake&lt;/li&gt;
&lt;li&gt;Certificate Types&lt;/li&gt;
&lt;li&gt;Certificate Chain of Trust&lt;/li&gt;
&lt;li&gt;OCSP &amp;amp; Revocation&lt;/li&gt;
&lt;li&gt;HSTS — HTTP Strict Transport Security&lt;/li&gt;
&lt;li&gt;Certbot &amp;amp; Automation&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is SSL/TLS?
&lt;/h2&gt;

&lt;p&gt;Transport Layer Security (TLS) — the successor to the deprecated SSL protocol — provides encryption,&lt;br&gt;
  authentication, and integrity for data transmitted between clients and servers. As of 2024, TLS 1.3&lt;br&gt;
  accounts for over &lt;strong&gt;60%&lt;/strong&gt; of all encrypted connections, with TLS 1.2 covering most of the remainder.&lt;br&gt;
  SSL 2.0 and 3.0 are considered insecure and must never be used.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — A digital certificate is a digitally signed document that binds a public key to an identity (domain, organization). It is issued by a Certificate Authority (CA) after validating ownership.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The TLS 1.3 Handshake
&lt;/h2&gt;

&lt;p&gt;TLS 1.3 (defined in &lt;strong&gt;RFC 8446&lt;/strong&gt;) reduces the handshake from two round-trips to just &lt;strong&gt;one&lt;/strong&gt; (1-RTT),&lt;br&gt;
  and supports &lt;strong&gt;0-RTT&lt;/strong&gt; resumption for returning clients, dramatically reducing latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ClientHello&lt;/strong&gt; — Client sends supported cipher suites, key shares (ECDHE), and a random nonce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ServerHello&lt;/strong&gt; — Server selects cipher suite, sends its key share, and the handshake is encrypted from this point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server Parameters &amp;amp; Certificate&lt;/strong&gt; — Server sends encrypted extensions, its certificate, and a CertificateVerify signature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finished&lt;/strong&gt; — Both sides derive session keys and exchange Finished messages. Application data flows immediately.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 TLS 1.3 removed insecure algorithms: RSA key exchange, CBC ciphers, SHA-1, RC4, DES, and 3DES are all gone. Only AEAD ciphers (AES-GCM, ChaCha20-Poly1305) remain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Certificate Types
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Validation&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Issuance Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DV Domain Validated&lt;/td&gt;
&lt;td&gt;Domain ownership only&lt;/td&gt;
&lt;td&gt;Blogs, personal sites, APIs&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OV Organization Validated&lt;/td&gt;
&lt;td&gt;Domain + org identity&lt;/td&gt;
&lt;td&gt;Business websites&lt;/td&gt;
&lt;td&gt;1–3 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EV Extended Validation&lt;/td&gt;
&lt;td&gt;Rigorous legal/physical checks&lt;/td&gt;
&lt;td&gt;Banks, e-commerce&lt;/td&gt;
&lt;td&gt;1–2 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wildcard&lt;/td&gt;
&lt;td&gt;Covers *.example.com&lt;/td&gt;
&lt;td&gt;Multi-subdomain projects&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Wildcard certificates cover only one level of subdomain. *.example.com covers api.example.com but NOT v2.api.example.com.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Certificate Chain of Trust
&lt;/h2&gt;

&lt;p&gt;A certificate chain links your server's &lt;strong&gt;leaf certificate&lt;/strong&gt; to a trusted &lt;strong&gt;root CA&lt;/strong&gt; via one or more&lt;br&gt;
  &lt;strong&gt;intermediate CAs&lt;/strong&gt;. Browsers and OS trust stores contain root CAs; the server must send the intermediates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Leaf Certificate  (your domain)
    ↓  signed by
Intermediate CA   (e.g., R3 — Let's Encrypt)
    ↓  signed by
Root CA           (e.g., ISRG Root X1 — in trust stores)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🚫 Never serve only the leaf certificate without intermediates. This causes "unable to verify the first certificate" errors in clients that don't have the intermediate cached.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  OCSP &amp;amp; Revocation
&lt;/h2&gt;

&lt;p&gt;When a private key is compromised, the certificate must be revoked. Two mechanisms exist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CRL (Certificate Revocation List) — A downloadable list of revoked serial numbers. Can be large and slow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OCSP (Online Certificate Status Protocol) — Real-time check against the CA. Preferred method.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Enable OCSP Stapling on your server. The server fetches the OCSP response periodically and sends it during the TLS handshake, eliminating the client's need to contact the CA — improving privacy and performance.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Nginx — enable OCSP stapling&lt;/span&gt;
&lt;span class="k"&gt;ssl_stapling&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ssl_stapling_verify&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;resolver&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="s"&gt;.1.1&lt;/span&gt; &lt;span class="mf"&gt;8.8&lt;/span&gt;&lt;span class="s"&gt;.8.8&lt;/span&gt; &lt;span class="s"&gt;valid=300s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;resolver_timeout&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  HSTS — HTTP Strict Transport Security
&lt;/h2&gt;

&lt;p&gt;HSTS tells browsers to &lt;strong&gt;always&lt;/strong&gt; use HTTPS for your domain, preventing protocol downgrade attacks and cookie hijacking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Nginx header&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;"max-age=63072000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;includeSubDomains&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;preload"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🎯 Submit your domain to the HSTS Preload List to have browsers enforce HTTPS before the first visit. Requires max-age ≥ 1 year, includeSubDomains, and preload.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Certbot &amp;amp; Automation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Certbot&lt;/strong&gt; is the official ACME client from the EFF for obtaining and renewing free Let's Encrypt certificates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install and obtain a certificate (Nginx)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;certbot python3-certbot-nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-d&lt;/span&gt; www.example.com

&lt;span class="c"&gt;# Auto-renewal (cron or systemd timer)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 Let's Encrypt certificates are valid for 90 days. Certbot's systemd timer renews at 60 days by default. Always test renewal with --dry-run first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;TLS 1.3&lt;/strong&gt; as the minimum version. Disable TLS 1.0 and 1.1 entirely.&lt;/p&gt;

&lt;p&gt;Enable &lt;strong&gt;OCSP Stapling&lt;/strong&gt; and configure a valid resolver.&lt;/p&gt;

&lt;p&gt;Deploy &lt;strong&gt;HSTS&lt;/strong&gt; with a long max-age and consider preloading.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;ECDSA P-256&lt;/strong&gt; keys for better performance than RSA 2048.&lt;/p&gt;

&lt;p&gt;Automate renewal — never let certificates expire manually.&lt;/p&gt;

&lt;p&gt;Redirect all HTTP traffic to HTTPS with a &lt;strong&gt;301&lt;/strong&gt; redirect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Missing intermediate certificate&lt;/td&gt;
&lt;td&gt;Broken chain on some clients&lt;/td&gt;
&lt;td&gt;Bundle intermediates in the cert file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expired certificate&lt;/td&gt;
&lt;td&gt;Browser security warnings, lost trust&lt;/td&gt;
&lt;td&gt;Automate renewal with Certbot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mixed content (HTTP resources on HTTPS page)&lt;/td&gt;
&lt;td&gt;Browser blocks insecure resources&lt;/td&gt;
&lt;td&gt;Use protocol-relative or HTTPS URLs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allowing TLS 1.0/1.1&lt;/td&gt;
&lt;td&gt;Vulnerable to POODLE, BEAST attacks&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;ssl_protocols TLSv1.2 TLSv1.3;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weak cipher suites&lt;/td&gt;
&lt;td&gt;Susceptible to brute-force or downgrade&lt;/td&gt;
&lt;td&gt;Use Mozilla SSL Configuration Generator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;Check your SSL/TLS configuration with our built-in checker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 SSL Certificate Checker — Verify certificate validity, chain, expiry, and protocol support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Let's Encrypt Documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Mozilla Server Side TLS Guidelines&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Mozilla SSL Configuration Generator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Certbot — EFF&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 HSTS Preload List Submission&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; Modern TLS is non-negotiable. Use TLS 1.3 with AEAD ciphers, automate certificate management with Certbot,&lt;br&gt;
    serve the full certificate chain, enable OCSP Stapling, and enforce HTTPS via HSTS. A misconfigured certificate&lt;br&gt;
    erodes user trust faster than almost any other infrastructure issue.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/ssl-tls-certificates-explained" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>DNS Records: The Complete Reference Guide for Every Record Type</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:24:02 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/dns-records-the-complete-reference-guide-for-every-record-type-5fc4</link>
      <guid>https://dev.to/toolbox_starnomina/dns-records-the-complete-reference-guide-for-every-record-type-5fc4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
DNS (Domain Name System) translates human-readable domain names into IP addresses and service endpoints.&lt;br&gt;
    With over 1.1 trillion DNS queries handled daily worldwide, understanding every record type — from&lt;br&gt;
    the ubiquitous A record to specialized CAA and SRV entries — is fundamental to deploying, securing,&lt;br&gt;
    and troubleshooting any internet service. This reference covers all major record types with real-world examples.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How DNS Works&lt;/li&gt;
&lt;li&gt;A &amp;amp; AAAA Records&lt;/li&gt;
&lt;li&gt;CNAME Records&lt;/li&gt;
&lt;li&gt;MX Records&lt;/li&gt;
&lt;li&gt;TXT Records&lt;/li&gt;
&lt;li&gt;NS &amp;amp; SOA Records&lt;/li&gt;
&lt;li&gt;SRV Records&lt;/li&gt;
&lt;li&gt;CAA Records&lt;/li&gt;
&lt;li&gt;PTR Records&lt;/li&gt;
&lt;li&gt;Understanding TTL&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How DNS Works
&lt;/h2&gt;

&lt;p&gt;A DNS query follows a hierarchical resolution path: your device's &lt;strong&gt;stub resolver&lt;/strong&gt; asks a&lt;br&gt;
  &lt;strong&gt;recursive resolver&lt;/strong&gt; (e.g., 1.1.1.1 or 8.8.8.8), which queries &lt;strong&gt;root servers&lt;/strong&gt;,&lt;br&gt;
  then the &lt;strong&gt;TLD nameserver&lt;/strong&gt; (.com, .org), and finally the domain's &lt;strong&gt;authoritative nameserver&lt;/strong&gt;&lt;br&gt;
  to return the answer. Responses are cached at each level according to the record's TTL.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — A DNS record (Resource Record) is an entry in a zone file that maps a domain name to a specific value — an IP address, mail server, text string, or another domain name.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  A &amp;amp; AAAA Records
&lt;/h2&gt;

&lt;p&gt;The most fundamental record types. &lt;strong&gt;A&lt;/strong&gt; records map a domain to an IPv4 address;&lt;br&gt;
  &lt;strong&gt;AAAA&lt;/strong&gt; records map to an IPv6 address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; A Record — IPv4
example.com.    300    IN    A      93.184.216.34

; AAAA Record — IPv6
example.com.    300    IN    AAAA   2606:2800:220:1:248:1893:25c8:1946
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🎯 Always publish both A and AAAA records for dual-stack compatibility. IPv6 adoption crossed 40% globally in 2024.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  CNAME Records
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;CNAME&lt;/strong&gt; (Canonical Name) record aliases one domain to another. The DNS resolver follows the chain&lt;br&gt;
  until it reaches an A/AAAA record.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;www.example.com.    3600    IN    CNAME    example.com.
blog.example.com.   3600    IN    CNAME    myhost.github.io.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ A CNAME cannot coexist with any other record type at the same name (RFC 1034 §3.6.2). You cannot place a CNAME at the zone apex alongside SOA/NS records. Use ALIAS/ANAME (provider-specific) for apex domains.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  MX Records
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MX&lt;/strong&gt; (Mail Exchanger) records direct email to the correct mail servers. The &lt;strong&gt;priority&lt;/strong&gt;&lt;br&gt;
  value determines failover order — lower numbers are tried first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example.com.    3600    IN    MX    10    mail1.example.com.
example.com.    3600    IN    MX    20    mail2.example.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;mail1.example.com&lt;/td&gt;
&lt;td&gt;Primary mail server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;mail2.example.com&lt;/td&gt;
&lt;td&gt;Backup mail server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  TXT Records
&lt;/h2&gt;

&lt;p&gt;TXT records store arbitrary text and are heavily used for email authentication, domain verification, and security policies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; SPF — Authorize mail senders
example.com.    3600    IN    TXT    "v=spf1 include:_spf.google.com ~all"

; DKIM — Email signature verification
selector._domainkey.example.com.    3600    IN    TXT    "v=DKIM1; k=rsa; p=MIGfMA0G..."

; DMARC — Email policy
_dmarc.example.com.    3600    IN    TXT    "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"

; Domain verification
example.com.    3600    IN    TXT    "google-site-verification=abc123..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 A single domain can have multiple TXT records. However, only one SPF record is allowed per domain — multiple SPF records cause authentication failures (RFC 7208 §3.2).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  NS &amp;amp; SOA Records
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NS&lt;/strong&gt; records delegate a zone to specific nameservers. &lt;strong&gt;SOA&lt;/strong&gt; (Start of Authority) records&lt;br&gt;
  define the zone's primary nameserver, admin email, and serial/refresh/retry/expire timers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; NS Records
example.com.    86400    IN    NS    ns1.provider.com.
example.com.    86400    IN    NS    ns2.provider.com.

; SOA Record
example.com.    3600    IN    SOA    ns1.provider.com. admin.example.com. (
                        2024031501  ; Serial
                        7200        ; Refresh (2h)
                        3600        ; Retry (1h)
                        1209600     ; Expire (14d)
                        86400       ; Minimum TTL (1d)
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SRV Records
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SRV&lt;/strong&gt; records specify the host and port for specific services (e.g., SIP, XMPP, LDAP).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; _service._protocol.name    TTL    class    SRV    priority weight port target
_sip._tcp.example.com.    3600    IN    SRV    10 60 5060 sip1.example.com.
_sip._tcp.example.com.    3600    IN    SRV    10 40 5060 sip2.example.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 The weight field enables load balancing among servers with the same priority. Higher weight = more traffic share.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  CAA Records
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CAA&lt;/strong&gt; (Certificate Authority Authorization, RFC 8659) records specify which CAs are permitted to issue&lt;br&gt;
  certificates for a domain — a critical security control.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example.com.    3600    IN    CAA    0 issue "letsencrypt.org"
example.com.    3600    IN    CAA    0 issuewild ";"
example.com.    3600    IN    CAA    0 iodef "mailto:security@example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🎯 Use issuewild ";" to explicitly block wildcard certificate issuance if you don't need wildcards. The iodef tag notifies you of policy violations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  PTR Records
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PTR&lt;/strong&gt; (Pointer) records provide reverse DNS — mapping an IP address back to a domain name.&lt;br&gt;
  Essential for mail server reputation and network diagnostics.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Reverse DNS for 93.184.216.34
34.216.184.93.in-addr.arpa.    3600    IN    PTR    example.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Understanding TTL
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TTL Value&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;1 minute&lt;/td&gt;
&lt;td&gt;Failover, migrations, testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;td&gt;Dynamic services, CDNs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3600&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;Standard web records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;td&gt;24 hours&lt;/td&gt;
&lt;td&gt;Stable records (NS, MX)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Before a planned DNS change, lower the TTL to 60–300 seconds at least 48 hours in advance (to let the old high TTL expire from caches). After the change propagates, raise TTL back to its normal value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;Publish both &lt;strong&gt;A and AAAA&lt;/strong&gt; records for every public hostname.&lt;/p&gt;

&lt;p&gt;Set &lt;strong&gt;CAA records&lt;/strong&gt; to restrict certificate issuance to your chosen CA.&lt;/p&gt;

&lt;p&gt;Configure &lt;strong&gt;SPF + DKIM + DMARC&lt;/strong&gt; TXT records for every domain that sends email.&lt;/p&gt;

&lt;p&gt;Use at least &lt;strong&gt;two geographically diverse&lt;/strong&gt; NS records.&lt;/p&gt;

&lt;p&gt;Set up &lt;strong&gt;PTR records&lt;/strong&gt; for all mail server IPs.&lt;/p&gt;

&lt;p&gt;Lower TTL &lt;strong&gt;before&lt;/strong&gt; migrations, restore afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CNAME at zone apex&lt;/td&gt;
&lt;td&gt;Broken NS/SOA coexistence&lt;/td&gt;
&lt;td&gt;Use ALIAS/ANAME or A record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple SPF TXT records&lt;/td&gt;
&lt;td&gt;SPF PermError — email fails auth&lt;/td&gt;
&lt;td&gt;Merge into one &lt;code&gt;v=spf1&lt;/code&gt; record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing trailing dot in zone files&lt;/td&gt;
&lt;td&gt;Relative name interpreted wrong&lt;/td&gt;
&lt;td&gt;Always use FQDN with trailing dot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTL too high before migration&lt;/td&gt;
&lt;td&gt;Long propagation delays&lt;/td&gt;
&lt;td&gt;Pre-lower TTL 48h before changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No CAA records&lt;/td&gt;
&lt;td&gt;Any CA can issue certs for your domain&lt;/td&gt;
&lt;td&gt;Publish restrictive CAA records&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;Inspect and verify your DNS configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🔧 DNS Lookup — Query A, AAAA, MX, NS, SOA, SRV, and other record types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔧 TXT Record Lookup — Inspect SPF, DKIM, DMARC, and verification records.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔧 CNAME Lookup — Trace CNAME chains to their canonical target.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 1035 — Domain Names: Implementation and Specification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 8659 — DNS Certification Authority Authorization (CAA)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 7208 — Sender Policy Framework (SPF)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 2782 — A DNS RR for Specifying the Location of Services (SRV)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Cloudflare DNS Documentation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; DNS is the invisible foundation of every internet service. Master the record types — A/AAAA for addresses,&lt;br&gt;
    CNAME for aliases, MX for mail, TXT for authentication, CAA for certificate control, and SRV for service&lt;br&gt;
    discovery. Combine proper TTL management with email authentication (SPF/DKIM/DMARC) to build a secure,&lt;br&gt;
    resilient DNS configuration.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/dns-records-complete-reference" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dns</category>
      <category>networking</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>HTTP Security Headers: The Complete Guide to Securing Your Website</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:23:52 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/http-security-headers-the-complete-guide-to-securing-your-website-201k</link>
      <guid>https://dev.to/toolbox_starnomina/http-security-headers-the-complete-guide-to-securing-your-website-201k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
HTTP security headers are your first line of defense against cross-site scripting (XSS), clickjacking,&lt;br&gt;
    MIME sniffing, and data injection attacks. Despite being simple response headers, a 2024 scan of the&lt;br&gt;
    top 1 million websites found that fewer than 12% deploy a Content Security Policy. This guide&lt;br&gt;
    covers every critical security header with production-ready Nginx and Apache configurations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Why Security Headers Matter&lt;/li&gt;
&lt;li&gt;Content Security Policy (CSP)&lt;/li&gt;
&lt;li&gt;Strict-Transport-Security (HSTS)&lt;/li&gt;
&lt;li&gt;X-Frame-Options&lt;/li&gt;
&lt;li&gt;X-Content-Type-Options&lt;/li&gt;
&lt;li&gt;Referrer-Policy&lt;/li&gt;
&lt;li&gt;Permissions-Policy&lt;/li&gt;
&lt;li&gt;Additional Useful Headers&lt;/li&gt;
&lt;li&gt;Nginx &amp;amp; Apache Configuration&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Security Headers Matter
&lt;/h2&gt;

&lt;p&gt;Security headers instruct browsers on &lt;strong&gt;how&lt;/strong&gt; to handle your content — which scripts can run,&lt;br&gt;
  whether your page can be framed, and what information is leaked in referrers. They cost nothing to deploy&lt;br&gt;
  and defend against entire categories of attacks identified in the &lt;strong&gt;OWASP Top 10&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — HTTP security headers are response headers sent by the server that activate browser-side security mechanisms, restricting behavior that could be exploited by attackers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Content Security Policy (CSP)
&lt;/h2&gt;

&lt;p&gt;CSP is the most powerful security header. It defines an allowlist of content sources, effectively neutralizing&lt;br&gt;
  XSS, data injection, and unauthorized inline scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://cdn.example.com;
  style-src 'self' 'unsafe-inline';
  img-src 'self' data: https:;
  font-src 'self' https://fonts.gstatic.com;
  connect-src 'self' https://api.example.com;
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self';
  upgrade-insecure-requests;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directive&lt;/th&gt;
&lt;th&gt;Controls&lt;/th&gt;
&lt;th&gt;Recommended Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;default-src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fallback for all resource types&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'self'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;script-src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JavaScript sources&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;'self'&lt;/code&gt; + specific CDNs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style-src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CSS sources&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;'self'&lt;/code&gt; (avoid &lt;code&gt;'unsafe-inline'&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;img-src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image sources&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'self' data: https:&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frame-ancestors&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Who can embed your page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'none'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;base-uri&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restricts `` element&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'self'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 Start with Content-Security-Policy-Report-Only to log violations without blocking. Use the report-uri or report-to directive to collect reports, then tighten the policy iteratively.&lt;/p&gt;

&lt;p&gt;🚫 Never use 'unsafe-eval' in production CSP. It re-enables eval(), completely undermining XSS protection. Refactor code that calls eval(), new Function(), or inline event handlers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Strict-Transport-Security (HSTS)
&lt;/h2&gt;

&lt;p&gt;Forces browsers to connect over HTTPS only, preventing protocol downgrade attacks and SSL stripping.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`http&lt;br&gt;
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Once HSTS is deployed with includeSubDomains, every subdomain must have a valid TLS certificate. Rolling this out without full HTTPS coverage will break subdomains.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  X-Frame-Options
&lt;/h2&gt;

&lt;p&gt;Prevents your page from being embedded in &lt;code&gt;, &lt;/code&gt;, or&lt;br&gt;
  `` elements on other sites — blocking clickjacking attacks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;X-Frame-Options: DENY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DENY&lt;/td&gt;
&lt;td&gt;Never allow framing (most secure)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAMEORIGIN&lt;/td&gt;
&lt;td&gt;Allow framing only from same origin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 CSP's frame-ancestors directive is the modern replacement for X-Frame-Options, offering more granular control. Deploy both for backward compatibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  X-Content-Type-Options
&lt;/h2&gt;

&lt;p&gt;Prevents browsers from MIME-sniffing a response away from the declared &lt;code&gt;Content-Type&lt;/code&gt;.&lt;br&gt;
  Blocks attacks that disguise executable content as harmless file types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;X-Content-Type-Options: nosniff
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Referrer-Policy
&lt;/h2&gt;

&lt;p&gt;Controls how much referrer information is sent when navigating away from your site.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Referrer-Policy: strict-origin-when-cross-origin
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Same-Origin&lt;/th&gt;
&lt;th&gt;Cross-Origin (HTTPS→HTTPS)&lt;/th&gt;
&lt;th&gt;Downgrade (HTTPS→HTTP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;no-referrer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strict-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full URL&lt;/td&gt;
&lt;td&gt;Origin only&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full URL&lt;/td&gt;
&lt;td&gt;Origin only&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;no-referrer-when-downgrade&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full URL&lt;/td&gt;
&lt;td&gt;Full URL&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Permissions-Policy
&lt;/h2&gt;

&lt;p&gt;Controls which browser features (camera, microphone, geolocation, etc.) your site and embedded iframes can use.&lt;br&gt;
  Formerly known as &lt;code&gt;Feature-Policy&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(self), usb=()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Set unused features to () (empty allowlist) to explicitly disable them. This prevents embedded third-party scripts from silently accessing sensitive APIs like the camera or microphone.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Additional Useful Headers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cross-Origin-Opener-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;same-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Isolates browsing context, enables SharedArrayBuffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cross-Origin-Embedder-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;require-corp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ensures all embedded resources opt-in to being loaded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cross-Origin-Resource-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;same-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents other origins from loading your resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-DNS-Prefetch-Control&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents speculative DNS lookups (privacy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Nginx &amp;amp; Apache Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/nginx/snippets/security-headers.conf&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt; &lt;span class="s"&gt;"default-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;script-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;style-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;img-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt; &lt;span class="s"&gt;data:&lt;/span&gt; &lt;span class="s"&gt;https:&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;frame-ancestors&lt;/span&gt; &lt;span class="s"&gt;'none'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;base-uri&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;form-action&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;"max-age=63072000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;includeSubDomains&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;preload"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;"DENY"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;"nosniff"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;"strict-origin-when-cross-origin"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Permissions-Policy&lt;/span&gt; &lt;span class="s"&gt;"camera=(),&lt;/span&gt; &lt;span class="s"&gt;microphone=(),&lt;/span&gt; &lt;span class="s"&gt;geolocation=()"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cross-Origin-Opener-Policy&lt;/span&gt; &lt;span class="s"&gt;"same-origin"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cross-Origin-Embedder-Policy&lt;/span&gt; &lt;span class="s"&gt;"require-corp"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Include in server block:&lt;/span&gt;
&lt;span class="c1"&gt;# include snippets/security-headers.conf;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# .htaccess or httpd.conf&lt;/span&gt;
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Content-Security-Policy "default-src 'self'; script-src 'self'; frame-ancestors 'none';"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-Frame-Options "DENY"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-Content-Type-Options "nosniff"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Referrer-Policy "strict-origin-when-cross-origin"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Permissions-Policy "camera=(), microphone=(), geolocation=()"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;Deploy CSP in &lt;strong&gt;report-only mode&lt;/strong&gt; first, analyze violations, then enforce.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;nonce-based&lt;/strong&gt; CSP (&lt;code&gt;'nonce-{random}'&lt;/code&gt;) instead of &lt;code&gt;'unsafe-inline'&lt;/code&gt; for inline scripts.&lt;/p&gt;

&lt;p&gt;Add the &lt;code&gt;always&lt;/code&gt; keyword in Nginx to send headers on &lt;strong&gt;all&lt;/strong&gt; response codes (including 4xx/5xx).&lt;/p&gt;

&lt;p&gt;Test headers in &lt;strong&gt;staging&lt;/strong&gt; before production — overly strict CSP can break legitimate functionality.&lt;/p&gt;

&lt;p&gt;Audit headers regularly with automated scanners as your site's dependencies evolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Using &lt;code&gt;'unsafe-inline'&lt;/code&gt; + &lt;code&gt;'unsafe-eval'&lt;/code&gt; in CSP&lt;/td&gt;
&lt;td&gt;Nullifies XSS protection&lt;/td&gt;
&lt;td&gt;Use nonces or hashes instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing &lt;code&gt;always&lt;/code&gt; keyword in Nginx&lt;/td&gt;
&lt;td&gt;Headers absent on error pages&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;always&lt;/code&gt; to every &lt;code&gt;add_header&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HSTS without full HTTPS coverage&lt;/td&gt;
&lt;td&gt;Subdomains become unreachable&lt;/td&gt;
&lt;td&gt;Ensure all subdomains have valid TLS certs first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting &lt;code&gt;frame-ancestors&lt;/code&gt; in CSP&lt;/td&gt;
&lt;td&gt;Clickjacking still possible&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;frame-ancestors 'none'&lt;/code&gt; to CSP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setting &lt;code&gt;Referrer-Policy: unsafe-url&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Full URL leaked to third parties&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;Scan your website's security headers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 Security Header Scanner — Analyze all security headers and get an actionable report with grades.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 MDN — Content Security Policy (CSP)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 MDN — Strict-Transport-Security&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 MDN — Permissions-Policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 OWASP Secure Headers Project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 OWASP HTTP Headers Cheat Sheet&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 MDN — Referrer-Policy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; Security headers are free, high-impact defenses. At minimum, deploy CSP, HSTS, X-Frame-Options,&lt;br&gt;
    X-Content-Type-Options, Referrer-Policy, and Permissions-Policy. Start CSP in report-only mode,&lt;br&gt;
    iterate based on real violation reports, then enforce. Combine with a regular scanning cadence&lt;br&gt;
    to catch regressions as third-party dependencies change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/website-security-headers-guide" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>DNS Propagation: How Long Does It Really Take? (With Technical Explanation)</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:23:43 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/dns-propagation-how-long-does-it-really-take-with-technical-explanation-2po8</link>
      <guid>https://dev.to/toolbox_starnomina/dns-propagation-how-long-does-it-really-take-with-technical-explanation-2po8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
DNS propagation — the time it takes for DNS changes to reach every resolver worldwide — is one of the most&lt;br&gt;
    misunderstood concepts in web operations. While changes can appear instant for some users, others may wait&lt;br&gt;
    up to 72 hours due to aggressive caching. Understanding the resolution flow, TTL mechanics, caching&lt;br&gt;
    layers, and pre-change strategies lets you execute DNS migrations with near-zero downtime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What Is DNS Propagation?&lt;/li&gt;
&lt;li&gt;The DNS Resolution Flow&lt;/li&gt;
&lt;li&gt;TTL Mechanics &amp;amp; Caching&lt;/li&gt;
&lt;li&gt;Caching Layers&lt;/li&gt;
&lt;li&gt;Pre-Change Strategy&lt;/li&gt;
&lt;li&gt;Anycast DNS&lt;/li&gt;
&lt;li&gt;Real-World Propagation Timing&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is DNS Propagation?
&lt;/h2&gt;

&lt;p&gt;When you update a DNS record at your registrar or DNS provider, the change is immediately live on your&lt;br&gt;
  &lt;strong&gt;authoritative nameservers&lt;/strong&gt;. However, recursive resolvers around the world have &lt;strong&gt;cached&lt;/strong&gt;&lt;br&gt;
  the old record and will continue serving it until the cached entry's TTL expires. The gradual process of&lt;br&gt;
  every resolver picking up the new record is called &lt;strong&gt;DNS propagation&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — DNS propagation is not a push mechanism — there is no broadcast. Each recursive resolver independently expires its cache based on the TTL from the last response it received from the authoritative server.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The DNS Resolution Flow
&lt;/h2&gt;

&lt;p&gt;Understanding the full resolution path explains why propagation takes time and where caching occurs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stub Resolver&lt;/strong&gt; — Your device's OS-level resolver sends a query to the configured recursive resolver (e.g., your ISP, or 1.1.1.1 / 8.8.8.8).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recursive Resolver&lt;/strong&gt; — Checks its cache. If found and TTL hasn't expired, returns the cached answer immediately. If not, begins iterative resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Servers&lt;/strong&gt; — The recursive resolver queries one of the 13 root server clusters, which responds with the TLD nameserver (e.g., .com NS).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLD Nameserver&lt;/strong&gt; — Returns the authoritative NS records for the specific domain (e.g., ns1.provider.com).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authoritative Nameserver&lt;/strong&gt; — Returns the actual record (A, CNAME, MX, etc.) with its TTL. The recursive resolver caches this response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response to Client&lt;/strong&gt; — The recursive resolver returns the answer to your device, which may also cache it locally.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Each step in the chain can cache results. Root and TLD NS records are cached for long periods (often 48 hours), but your domain's records are cached according to their own TTL.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  TTL Mechanics &amp;amp; Caching
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TTL (Time To Live)&lt;/strong&gt;, defined in RFC 1035, is a 32-bit integer representing seconds. When a resolver&lt;br&gt;
  caches a record, it decrements the TTL over time. At zero, the entry is evicted and must be re-fetched.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Example: A record with 1-hour TTL
example.com.    3600    IN    A    93.184.216.34

; After 2000 seconds, a resolver's cached copy has:
;   Remaining TTL = 3600 - 2000 = 1600 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TTL (seconds)&lt;/th&gt;
&lt;th&gt;Human Readable&lt;/th&gt;
&lt;th&gt;Propagation Window&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;1 minute&lt;/td&gt;
&lt;td&gt;~1–5 minutes globally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;td&gt;~5–15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3600&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;~1–2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;td&gt;24 hours&lt;/td&gt;
&lt;td&gt;~24–48 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Some resolvers do not honor low TTLs. Certain ISP resolvers enforce a minimum TTL floor (commonly 300 seconds). RFC 2308 allows negative caching of NXDOMAIN responses for up to the SOA minimum TTL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Caching Layers
&lt;/h2&gt;

&lt;p&gt;DNS responses are cached at multiple levels, each with different eviction behavior:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Cache Duration&lt;/th&gt;
&lt;th&gt;Flushable?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser&lt;/td&gt;
&lt;td&gt;Chrome, Firefox, etc.&lt;/td&gt;
&lt;td&gt;Up to 60 seconds (Chrome)&lt;/td&gt;
&lt;td&gt;Yes — &lt;code&gt;chrome://net-internals/#dns&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows/macOS/Linux stub resolver&lt;/td&gt;
&lt;td&gt;Varies (often honors TTL)&lt;/td&gt;
&lt;td&gt;Yes — &lt;code&gt;ipconfig /flushdns&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Router/LAN&lt;/td&gt;
&lt;td&gt;Home/office router, local DNS&lt;/td&gt;
&lt;td&gt;Varies widely&lt;/td&gt;
&lt;td&gt;Reboot router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ISP Resolver&lt;/td&gt;
&lt;td&gt;ISP's recursive nameserver&lt;/td&gt;
&lt;td&gt;Honors TTL (usually)&lt;/td&gt;
&lt;td&gt;No — must wait for expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public Resolver&lt;/td&gt;
&lt;td&gt;1.1.1.1, 8.8.8.8, 9.9.9.9&lt;/td&gt;
&lt;td&gt;Strictly honors TTL&lt;/td&gt;
&lt;td&gt;Cloudflare: purge cache tool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; During a migration, test from multiple resolvers. Use dig @1.1.1.1, dig @8.8.8.8, and dig @9.9.9.9 to see whether major public resolvers have picked up the change. Your ISP's resolver may lag behind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Pre-Change Strategy
&lt;/h2&gt;

&lt;p&gt;The single most important technique for fast, smooth DNS changes is &lt;strong&gt;TTL pre-lowering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;48 hours before&lt;/strong&gt; — Lower the TTL on the record you plan to change to &lt;strong&gt;60–300 seconds&lt;/strong&gt;. Wait for the old high TTL to expire from all caches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make the change&lt;/strong&gt; — Update the DNS record to its new value. Because the TTL is now low, caches expire quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify propagation&lt;/strong&gt; — Use a global DNS checker to confirm the new value is seen from multiple locations worldwide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After confirmation&lt;/strong&gt; — Raise the TTL back to its normal production value (e.g., 3600 or 86400).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Step 1: Lower TTL (48h before migration)
example.com.    60    IN    A    93.184.216.34    ; was 86400

# Step 2: Change record (migration day)
example.com.    60    IN    A    104.21.45.67     ; new server

# Step 3: After propagation confirmed, restore TTL
example.com.    3600  IN    A    104.21.45.67
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🚫 Never skip the TTL pre-lowering step. If your record has a 24-hour TTL and you change it without lowering first, some users will be stuck on the old IP for up to 48 hours.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Anycast DNS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Anycast&lt;/strong&gt; is a routing technique where the same IP address is announced from multiple geographic&lt;br&gt;
  locations. DNS providers like Cloudflare, Route 53, and Google Cloud DNS use anycast to route queries to&lt;br&gt;
  the nearest server, reducing latency and improving redundancy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Anycast means two users in different countries querying the same resolver IP (e.g., 1.1.1.1) may hit different physical servers with different cache states. This is why propagation appears inconsistent across regions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Real-World Propagation Timing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Change Type&lt;/th&gt;
&lt;th&gt;Typical Duration&lt;/th&gt;
&lt;th&gt;Worst Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A/AAAA record (low TTL pre-set)&lt;/td&gt;
&lt;td&gt;1–10 minutes&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A/AAAA record (high TTL, no prep)&lt;/td&gt;
&lt;td&gt;4–24 hours&lt;/td&gt;
&lt;td&gt;72 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NS record change (registrar)&lt;/td&gt;
&lt;td&gt;12–24 hours&lt;/td&gt;
&lt;td&gt;48 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New domain (fresh registration)&lt;/td&gt;
&lt;td&gt;Minutes–2 hours&lt;/td&gt;
&lt;td&gt;24 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MX record change&lt;/td&gt;
&lt;td&gt;Follows TTL&lt;/td&gt;
&lt;td&gt;TTL + resolver floor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 For zero-downtime migrations, keep the old server running until propagation completes. Both old and new servers should serve valid responses during the transition window.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;Always &lt;strong&gt;pre-lower TTL&lt;/strong&gt; 48 hours before any DNS change.&lt;/p&gt;

&lt;p&gt;Keep old infrastructure &lt;strong&gt;running in parallel&lt;/strong&gt; during the propagation window.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;public resolvers&lt;/strong&gt; (1.1.1.1, 8.8.8.8) for testing — they strictly honor TTLs.&lt;/p&gt;

&lt;p&gt;Monitor propagation from &lt;strong&gt;multiple geographic locations&lt;/strong&gt;, not just your local machine.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;anycast DNS providers&lt;/strong&gt; for lower query latency and faster cache refresh across regions.&lt;/p&gt;

&lt;p&gt;Document your &lt;strong&gt;rollback plan&lt;/strong&gt; before changing DNS — know the old values and how to revert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not lowering TTL before migration&lt;/td&gt;
&lt;td&gt;Hours of stale DNS for some users&lt;/td&gt;
&lt;td&gt;Pre-lower to 60s, wait 48h, then change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shutting down old server immediately&lt;/td&gt;
&lt;td&gt;Downtime for users still resolving old IP&lt;/td&gt;
&lt;td&gt;Keep old server live for 2× the old TTL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing only from local machine&lt;/td&gt;
&lt;td&gt;Local cache gives false positive&lt;/td&gt;
&lt;td&gt;Flush local cache + test from multiple resolvers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting to restore TTL after change&lt;/td&gt;
&lt;td&gt;Excessive queries to authoritative server, slower resolution&lt;/td&gt;
&lt;td&gt;Raise TTL back to 3600+ after propagation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring negative caching (RFC 2308)&lt;/td&gt;
&lt;td&gt;Deleted records linger as NXDOMAIN in caches&lt;/td&gt;
&lt;td&gt;Pre-create records before pointing traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;Monitor and verify your DNS propagation in real time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🔧 DNS Lookup — Query any record type against specific resolvers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔧 Global DNS Checker — Verify propagation status from 20+ worldwide locations simultaneously.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 1035 — Domain Names: Implementation and Specification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 2308 — Negative Caching of DNS Queries (DNS NCACHE)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Cloudflare — DNS Record Types&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Cloudflare — What Is DNS Propagation?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Cloudflare — Purge 1.1.1.1 Cache&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; DNS propagation is not magic — it's cache expiration. The single most effective technique is&lt;br&gt;
    TTL pre-lowering: drop the TTL to 60 seconds 48 hours before your change, make the update,&lt;br&gt;
    verify globally, then restore the TTL. Keep old infrastructure running during the transition window&lt;br&gt;
    and always test from multiple geographic vantage points, not just your local machine.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/dns-propagation-how-long-does-it-take" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dns</category>
      <category>networking</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>IP Geolocation: How It Works and Its Accuracy Limits</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:23:30 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/ip-geolocation-how-it-works-and-its-accuracy-limits-29be</link>
      <guid>https://dev.to/toolbox_starnomina/ip-geolocation-how-it-works-and-its-accuracy-limits-29be</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;privacy regulations, and never treat IP coordinates as precise physical locations.  and postal code levels. Always layer multiple data sources, keep databases updated, respect&lt;br&gt;&lt;br&gt;
IP geolocation delivers reliable country-level accuracy (~99%) but degrades rapidly at city&lt;br&gt;
🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; 📄 GDPR Article 6 — Lawfulness of Processing  📄 IP2Location — Data Accuracy  📄 IPinfo — Accuracy &amp;amp; Methodology  📄 ARIN — Whois-RWS Service  📄 RIPE NCC — RIPE Database  📄 MaxMind — GeoIP2 Databases &amp;amp; GeoLite2References&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🌍 [Geo Checker](https://toolbox.starnomina.tn/tools/geo-checker) — Verify geographic location data for IP addresses in bulk.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;🔍 &lt;a href="https://toolbox.starnomina.tn/tools/ip-address-lookup" rel="noopener noreferrer"&gt;IP Address Lookup&lt;/a&gt; — Resolve any IP to its geolocation, ISP, and ASN.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Using geolocation for fraud detection alone:&lt;/strong&gt; Combine with device fingerprinting and behavioral signals.  &lt;strong&gt;Stale databases:&lt;/strong&gt; IP reallocations happen constantly; outdated data degrades fast.  &lt;strong&gt;Ignoring IPv6:&lt;/strong&gt; Many databases have weaker IPv6 coverage — test both protocols.  &lt;strong&gt;Blocking users by country without appeal:&lt;/strong&gt; CGNAT and VPNs cause false positives in geo-blocking.  &lt;strong&gt;Trusting coordinates as exact:&lt;/strong&gt; The lat/lng is typically a city centroid, not a street address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;p&gt;Implement fallback logic for unresolvable IPs (private ranges, CGNAT).  Update your local database at least biweekly to keep accuracy current.  Use the &lt;strong&gt;GeoLite2&lt;/strong&gt; free database locally before paying for API calls.  Combine IP geolocation with user-selected locale for content personalization.  Always validate country-level data before trusting city-level results.&lt;br&gt;
  (weekly at most). This reduces API costs and latency.&lt;br&gt;&lt;br&gt;
Cache geolocation results aggressively — IP-to-location mappings change infrequently&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Best Practices  Right to object: Allow users to opt out of location-based personalization.  Transparency: Disclose IP-based geolocation in your privacy policy.  Retention limits: Delete raw IP logs within a defined retention period.  Data minimization: Store only country/region if city-level precision isn't required.  Legal basis: Use legitimate interest (Art. 6(1)(f)) or consent for geolocation processing.  Key compliance points:  Under GDPR, an IP address is considered personal data when it can be linked to an individual.Privacy &amp;amp; GDPR Considerations&lt;br&gt;
  in client-side JavaScript.&lt;br&gt;
  💡 Always keep API tokens in environment variables or a secrets manager — never hardcode them&lt;br&gt;
geolocate('8.8.8.8').then(console.log);// Usage}  };    org: data.org,        // ASN + ISP name    loc: data.loc,        // "lat,lng"    country: data.country,    region: data.region,    city: data.city,  return {  const data = await res.json();  if (!res.ok) throw new Error(\&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/ip-geolocation-how-it-works" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tools</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Domain Security Audit: The Complete Checklist for 2026</title>
      <dc:creator>toolbox-poster</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:23:21 +0000</pubDate>
      <link>https://dev.to/toolbox_starnomina/domain-security-audit-the-complete-checklist-for-2026-1ap0</link>
      <guid>https://dev.to/toolbox_starnomina/domain-security-audit-the-complete-checklist-for-2026-1ap0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
A domain security audit reviews DNS configuration, email authentication, SSL/TLS certificates,&lt;br&gt;
    and HTTP security headers to identify vulnerabilities before attackers do. This 2026 checklist&lt;br&gt;
    provides structured tables, a quarterly schedule, and a scoring system so you can track&lt;br&gt;
    your domain's security posture over time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Why Domain Audits Matter in 2026&lt;/li&gt;
&lt;li&gt;DNS Configuration Checklist&lt;/li&gt;
&lt;li&gt;Email Authentication Checklist&lt;/li&gt;
&lt;li&gt;SSL/TLS Certificate Checklist&lt;/li&gt;
&lt;li&gt;Security Headers Checklist&lt;/li&gt;
&lt;li&gt;Scoring System&lt;/li&gt;
&lt;li&gt;Quarterly Audit Schedule&lt;/li&gt;
&lt;li&gt;Best Practices&lt;/li&gt;
&lt;li&gt;Common Mistakes&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Domain Audits Matter in 2026
&lt;/h2&gt;

&lt;p&gt;Google and Yahoo enforce strict sender requirements as of 2024, browsers flag mixed content and&lt;br&gt;
  missing headers, and attackers increasingly exploit DNS misconfigurations for subdomain takeover.&lt;br&gt;
  A quarterly audit catches drift before it becomes a breach.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Organizations with regular domain audits detect misconfigurations 4× faster than those&lt;br&gt;
  relying on incident-driven reviews (Verizon DBIR 2025).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  DNS Configuration Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Expected State&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Risk if Missing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A / AAAA records resolve&lt;/td&gt;
&lt;td&gt;Valid IPs, no dangling CNAMEs&lt;/td&gt;
&lt;td&gt;DNS Lookup&lt;/td&gt;
&lt;td&gt;Subdomain takeover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNAME records valid&lt;/td&gt;
&lt;td&gt;All targets resolve&lt;/td&gt;
&lt;td&gt;CNAME Lookup&lt;/td&gt;
&lt;td&gt;Subdomain takeover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TXT records clean&lt;/td&gt;
&lt;td&gt;No stale verification tokens&lt;/td&gt;
&lt;td&gt;TXT Lookup&lt;/td&gt;
&lt;td&gt;Information leakage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNSSEC enabled&lt;/td&gt;
&lt;td&gt;DS record in parent, signatures valid&lt;/td&gt;
&lt;td&gt;DNS Checker&lt;/td&gt;
&lt;td&gt;DNS spoofing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAA record set&lt;/td&gt;
&lt;td&gt;Restrict CAs to authorized issuers&lt;/td&gt;
&lt;td&gt;DNS Lookup&lt;/td&gt;
&lt;td&gt;Rogue certificates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NS records consistent&lt;/td&gt;
&lt;td&gt;All NS respond identically&lt;/td&gt;
&lt;td&gt;DNS Checker&lt;/td&gt;
&lt;td&gt;Resolution failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low TTL audit&lt;/td&gt;
&lt;td&gt;No production records below 300s without reason&lt;/td&gt;
&lt;td&gt;DNS Lookup&lt;/td&gt;
&lt;td&gt;Performance impact&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Email Authentication Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Expected State&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Risk if Missing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SPF record exists&lt;/td&gt;
&lt;td&gt;Single &lt;code&gt;v=spf1&lt;/code&gt; record, ≤10 DNS lookups&lt;/td&gt;
&lt;td&gt;SPF Checker&lt;/td&gt;
&lt;td&gt;Spoofing / delivery failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKIM selector valid&lt;/td&gt;
&lt;td&gt;RSA ≥ 2048-bit or Ed25519, rotated annually&lt;/td&gt;
&lt;td&gt;DKIM Checker&lt;/td&gt;
&lt;td&gt;Message tampering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC policy&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;p=reject&lt;/code&gt; or &lt;code&gt;p=quarantine&lt;/code&gt;; &lt;code&gt;rua&lt;/code&gt; tag set&lt;/td&gt;
&lt;td&gt;DMARC Checker&lt;/td&gt;
&lt;td&gt;Domain impersonation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIMI record&lt;/td&gt;
&lt;td&gt;Valid SVG logo, VMC certificate (optional)&lt;/td&gt;
&lt;td&gt;BIMI Checker&lt;/td&gt;
&lt;td&gt;Missed brand visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTA-STS policy&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mode: enforce&lt;/code&gt; with valid &lt;code&gt;mta-sts.txt&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;TXT Lookup&lt;/td&gt;
&lt;td&gt;Downgrade attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS-RPT record&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v=TLSRPTv1; rua=mailto:...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TXT Lookup&lt;/td&gt;
&lt;td&gt;No TLS failure visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SSL/TLS Certificate Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Expected State&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Risk if Missing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Certificate valid&lt;/td&gt;
&lt;td&gt;Not expired, covers all subdomains&lt;/td&gt;
&lt;td&gt;SSL Checker&lt;/td&gt;
&lt;td&gt;Browser warnings / MITM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS version&lt;/td&gt;
&lt;td&gt;TLS 1.2+ only; TLS 1.0/1.1 disabled&lt;/td&gt;
&lt;td&gt;SSL Checker&lt;/td&gt;
&lt;td&gt;Protocol downgrade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate chain&lt;/td&gt;
&lt;td&gt;Complete chain served, no missing intermediates&lt;/td&gt;
&lt;td&gt;SSL Checker&lt;/td&gt;
&lt;td&gt;Mobile trust failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HSTS header&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max-age ≥ 31536000; includeSubDomains; preload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Security Scanner&lt;/td&gt;
&lt;td&gt;SSL stripping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OCSP stapling&lt;/td&gt;
&lt;td&gt;Enabled on server&lt;/td&gt;
&lt;td&gt;SSL Checker&lt;/td&gt;
&lt;td&gt;Revocation check delays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CT logs&lt;/td&gt;
&lt;td&gt;Certificate in public transparency logs&lt;/td&gt;
&lt;td&gt;SSL Checker&lt;/td&gt;
&lt;td&gt;Rogue cert detection gap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Security Headers Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Recommended Value&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Security-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restrictive &lt;code&gt;default-src 'self'&lt;/code&gt; with explicit exceptions&lt;/td&gt;
&lt;td&gt;Security Scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-Content-Type-Options&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nosniff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Security Scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-Frame-Options&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DENY&lt;/code&gt; or &lt;code&gt;SAMEORIGIN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Security Scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referrer-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Security Scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Permissions-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restrict camera, microphone, geolocation&lt;/td&gt;
&lt;td&gt;Security Scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cross-Origin-Opener-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;same-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Security Scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Scoring System
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 Definition — Each checklist item earns points. Total your score and compare&lt;br&gt;
  against the rating thresholds to gauge your domain's security health.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Max Points&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNS Configuration&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Authentication&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL/TLS&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Headers&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rating thresholds:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;90–100 — Excellent: production-ready&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;70–89 — Good: minor improvements needed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;50–69 — Fair: significant gaps exist&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0–49 — Critical: immediate remediation required&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quarterly Audit Schedule
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1 — January&lt;/strong&gt;&lt;br&gt;
Full audit of all four categories. Renew expiring certificates.&lt;br&gt;
    Review DKIM key rotation. Update DMARC policy toward &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2 — April&lt;/strong&gt;&lt;br&gt;
DNS hygiene sweep: remove stale records, check for dangling&lt;br&gt;
    CNAMEs, verify DNSSEC signatures. Review CAA records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3 — July&lt;/strong&gt;&lt;br&gt;
Email deliverability review: analyze DMARC aggregate reports,&lt;br&gt;
    check SPF lookup count, verify BIMI rendering. Test MTA-STS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4 — October&lt;/strong&gt;&lt;br&gt;
Security header hardening: test CSP in report-only mode,&lt;br&gt;
    add new headers, review Permissions-Policy. Pre-renewal SSL check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ &lt;strong&gt;Pro Tip:&lt;/strong&gt; Automate your audits with CI/CD checks. Run DNS and header validations on every deployment&lt;br&gt;
  to catch regressions before they reach production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Document your baseline score and track improvement quarter over quarter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;code&gt;p=none&lt;/code&gt; DMARC only during initial monitoring — escalate to &lt;code&gt;quarantine&lt;/code&gt; then &lt;code&gt;reject&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set calendar reminders 30 days before certificate expiry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintain an inventory of all subdomains including third-party services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test security headers with report-only mode before enforcing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Dangling CNAME records: Decommissioned services with active DNS entries invite subdomain takeover.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple SPF records: Only one &lt;code&gt;v=spf1&lt;/code&gt; TXT record is allowed per domain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wildcard certificates without monitoring: A compromised wildcard key exposes all subdomains.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HSTS without testing: A misconfigured HSTS header with &lt;code&gt;preload&lt;/code&gt; is extremely difficult to undo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ignoring DMARC reports: Publishing &lt;code&gt;rua&lt;/code&gt; without reading reports defeats the purpose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forgetting non-sending domains: Domains that don't send email still need &lt;code&gt;v=spf1 -all&lt;/code&gt; and &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;🔍 &lt;a href="https://toolbox.starnomina.tn/tools/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup&lt;/a&gt; — Query A, AAAA, MX, NS, TXT, and other DNS record types.&lt;/p&gt;

&lt;p&gt;✉️ &lt;a href="https://toolbox.starnomina.tn/tools/spf-checker" rel="noopener noreferrer"&gt;SPF Checker&lt;/a&gt; — Validate SPF records and count DNS lookups.&lt;/p&gt;

&lt;p&gt;🔑 &lt;a href="https://toolbox.starnomina.tn/tools/dkim-checker" rel="noopener noreferrer"&gt;DKIM Checker&lt;/a&gt; — Verify DKIM selectors and key strength.&lt;/p&gt;

&lt;p&gt;🛡️ &lt;a href="https://toolbox.starnomina.tn/tools/dmarc-checker" rel="noopener noreferrer"&gt;DMARC Checker&lt;/a&gt; — Analyze DMARC policy and reporting tags.&lt;/p&gt;

&lt;p&gt;🏷️ &lt;a href="https://toolbox.starnomina.tn/tools/bimi-checker" rel="noopener noreferrer"&gt;BIMI Checker&lt;/a&gt; — Validate BIMI records and logo format.&lt;/p&gt;

&lt;p&gt;🔒 &lt;a href="https://toolbox.starnomina.tn/tools/ssl-checker" rel="noopener noreferrer"&gt;SSL Checker&lt;/a&gt; — Inspect certificate chain, expiry, and TLS config.&lt;/p&gt;

&lt;p&gt;🛡️ &lt;a href="https://toolbox.starnomina.tn/tools/security-scanner" rel="noopener noreferrer"&gt;Security Scanner&lt;/a&gt; — Audit HTTP security headers.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://toolbox.starnomina.tn/tools/cname-lookup" rel="noopener noreferrer"&gt;CNAME Lookup&lt;/a&gt; — Resolve CNAME chains to detect dangling records.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://toolbox.starnomina.tn/tools/txt-lookup" rel="noopener noreferrer"&gt;TXT Lookup&lt;/a&gt; — Retrieve all TXT records for a domain.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://toolbox.starnomina.tn/tools/dns-checker" rel="noopener noreferrer"&gt;DNS Checker&lt;/a&gt; — Global DNS propagation and DNSSEC validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📄 Google — Email sender guidelines (2024)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Yahoo — Sender Requirements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Qualys SSL Labs — SSL Server Test&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Security Headers — Analysis Tool&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 8461 — MTA-STS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 RFC 8460 — TLS Reporting (TLSRPT)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; A domain security audit is not a one-time event — it's a recurring discipline. Use the&lt;br&gt;
  quarterly schedule and scoring system above to track progress. Prioritize email authentication&lt;br&gt;
  and SSL/TLS first, as these have the highest impact on both security and deliverability.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://toolbox.starnomina.tn/blog/domain-security-audit-checklist" rel="noopener noreferrer"&gt;StarNomina ToolBox&lt;/a&gt;. Try our &lt;a href="https://toolbox.starnomina.tn/tools" rel="noopener noreferrer"&gt;free online tools&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
