<?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: Bug Circuit</title>
    <description>The latest articles on DEV Community by Bug Circuit (@bugcircuit).</description>
    <link>https://dev.to/bugcircuit</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4055584%2Ff7936355-aba9-4105-93b4-28afbc45ea63.png</url>
      <title>DEV Community: Bug Circuit</title>
      <link>https://dev.to/bugcircuit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bugcircuit"/>
    <language>en</language>
    <item>
      <title>Squarespace Hacked or Redirecting to Spam? Fix It</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Mon, 28 Sep 2026 15:38:46 +0000</pubDate>
      <link>https://dev.to/bugcircuit/squarespace-hacked-or-redirecting-to-spam-fix-it-35ep</link>
      <guid>https://dev.to/bugcircuit/squarespace-hacked-or-redirecting-to-spam-fix-it-35ep</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/squarespace-hacked-or-redirecting-to-spam-fix-it" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your Squarespace site is redirecting to spam or showing a "deceptive site" warning, the fix depends on whether the problem is in your domain's DNS settings or inside your Squarespace account itself — and you can usually tell which one it is in under five minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is for Squarespace site owners who opened their site (or had a customer tell them) and found it redirecting somewhere else, showing spam content, or triggering a Google Chrome "Deceptive site ahead" warning. Unlike WordPress, you can't SSH in and inspect server files — everything you can fix lives in two dashboards: your Squarespace account and your domain registrar. This guide walks through both, in order, so you stop the bleeding first and clean up second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain problem or account problem? Run this check first
&lt;/h2&gt;

&lt;p&gt;Squarespace gives every site a free built-in preview address that looks like &lt;code&gt;yourname.squarespace.com&lt;/code&gt;. You can find it under &lt;strong&gt;Settings &amp;gt; Domains&lt;/strong&gt; in your dashboard. This one link tells you almost everything:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;yourname.squarespace.com&lt;/code&gt; loads your real site fine, but your custom domain (&lt;code&gt;yoursite.com&lt;/code&gt;) redirects to spam&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Domain/DNS-level issue.&lt;/strong&gt; Your Squarespace content is untouched — traffic is being hijacked before it ever reaches Squarespace's servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both the &lt;code&gt;.squarespace.com&lt;/code&gt; link AND your custom domain show spam, blank pages, or unfamiliar content&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Account-level compromise.&lt;/strong&gt; Someone got into your Squarespace login and changed something inside your site.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome/Safari shows a "Deceptive site ahead" warning but everything looks normal when you're logged in&lt;/td&gt;
&lt;td&gt;Often &lt;strong&gt;cloaking&lt;/strong&gt; — injected code that shows spam only to search engine crawlers or first-time visitors, not to logged-in admins. Still an account-level compromise.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A WHOIS lookup (whois.com) shows a registrar, expiry date, or owner you don't recognize&lt;/td&gt;
&lt;td&gt;Your &lt;strong&gt;domain itself may have expired and been re-registered by someone else&lt;/strong&gt;, or your registrar account was compromised — this isn't a Squarespace hack at all.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep this table open while you work through the steps below — it decides which section applies to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it's domain-level: your DNS or registrar was hijacked
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;domain hijack&lt;/strong&gt; happens when someone gets into the account that controls your domain's DNS records — the settings that say "send visitors of this domain to this server." If they change those records, your domain points to a spam or phishing server while your actual Squarespace site sits completely untouched.&lt;/p&gt;

&lt;p&gt;This is common when your domain is registered with a third party (GoDaddy, Namecheap, Google Domains/Squarespace Domains, etc.) rather than through Squarespace directly, because it's a separate login with its own password and security settings that people forget about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do this now:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Log in to your domain registrar directly&lt;/strong&gt; (not Squarespace) and check your DNS records. If your domain points to Squarespace, the A records and CNAME should match what Squarespace's own DNS instructions specify — anything else was added by someone else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your nameservers (NS records).&lt;/strong&gt; A more serious hijack replaces your nameservers entirely, moving DNS management to an attacker-controlled service. If your nameservers aren't the ones you originally set, that's the root cause.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change your registrar password immediately&lt;/strong&gt; and enable two-factor authentication (2FA) on the registrar account — this is separate from your Squarespace account password and is very often the weaker link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable a registrar/transfer lock&lt;/strong&gt; on the domain to stop it from being moved to another registrar without your approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If your domain is a "Squarespace Domain"&lt;/strong&gt; (bought through Squarespace itself), there's no separate registrar — everything lives under &lt;strong&gt;Settings &amp;gt; Domains&lt;/strong&gt; in your Squarespace account, so go straight to the account-level steps below and contact Squarespace support.&lt;/li&gt;
&lt;li&gt;If you don't recognize the registrar account at all, or can't log in, &lt;strong&gt;contact that registrar's support&lt;/strong&gt; immediately and explain the account may be compromised — most have a dedicated recovery process for exactly this.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  If it's account-level: someone logged into your Squarespace account
&lt;/h2&gt;

&lt;p&gt;Squarespace is a fully hosted platform, so there's no theme file or plugin for an attacker to plant malware in like on WordPress. Instead, a compromised account gets abused through Squarespace's own legitimate features — which is why it can be easy to miss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work through this checklist in order:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Change your Squarespace password&lt;/strong&gt; right away, using a unique password you don't reuse anywhere else, and turn on &lt;strong&gt;two-factor authentication&lt;/strong&gt; under Account Settings &amp;gt; Security.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Check Settings &amp;gt; Permissions &amp;amp; Ownership&lt;/strong&gt; for any contributor or admin you don't recognize — remove them immediately.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Check Settings &amp;gt; Advanced &amp;gt; Code Injection.&lt;/strong&gt; This is the most common injection point: attackers paste malicious JavaScript into the Header or Footer fields, which then redirects visitors or loads spam content on every page. Copy out anything you didn't add (for later review), then delete it.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Check Settings &amp;gt; Advanced &amp;gt; URL Mappings.&lt;/strong&gt; This feature is meant for legitimate redirects (e.g., old page to new page), but attackers can add a rule that 301-redirects your entire domain to a spam or phishing site.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Scan your Pages panel&lt;/strong&gt; for pages you didn't create — spam campaigns often add "doorway pages" stuffed with keywords and links, built purely to manipulate search rankings.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Check Settings &amp;gt; Advanced &amp;gt; External Services / Connected Accounts&lt;/strong&gt; for any integration or API connection you don't recognize, and revoke it.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Contact Squarespace Support&lt;/strong&gt; through your dashboard's Help panel and flag it explicitly as a security/account compromise. Their team can check account access logs, confirm whether the login came from an unfamiliar location, and help you verify the account is fully clean — something you can't fully do from the front end alone.&lt;/li&gt;
&lt;li&gt;[ ] For a single hijacked page, &lt;strong&gt;Squarespace's version history&lt;/strong&gt; (available in the page editor on most 7.1 sites) lets you roll back that page's content to an earlier version — useful for undoing a specific vandalized page rather than the whole site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a broader walkthrough of the mindset and order of operations when any site gets compromised, see our general guide on &lt;a href="https://bugcircuit.com/website-hacked" rel="noopener noreferrer"&gt;what to do when your website is hacked&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clearing a Google security warning after you've fixed it
&lt;/h2&gt;

&lt;p&gt;If visitors are seeing a &lt;strong&gt;"Deceptive site ahead"&lt;/strong&gt; or &lt;strong&gt;"This site may be hacked"&lt;/strong&gt; warning, that's coming from &lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Google Safe Browsing&lt;/a&gt;, not Squarespace. You can check your domain's current status there directly.&lt;/p&gt;

&lt;p&gt;Once you've removed the malicious code or fixed the DNS records:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Re-check the Safe Browsing Transparency Report for your exact domain.&lt;/li&gt;
&lt;li&gt;If your domain is verified in Google Search Console, go to &lt;strong&gt;Security Issues&lt;/strong&gt; in the sidebar and click &lt;strong&gt;Request a Review&lt;/strong&gt; after confirming the issue is resolved.&lt;/li&gt;
&lt;li&gt;Warnings typically clear within a few days once Google's crawler re-visits and confirms the site is clean — there's no fixed guarantee on timing, so don't repeat the review request more than necessary.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Preventing this from happening again
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Turn on &lt;strong&gt;2FA on both your Squarespace account and your domain registrar account&lt;/strong&gt; — two separate logins, two separate weak points.&lt;/li&gt;
&lt;li&gt;Use a password manager so you're not reusing a password that leaked in an unrelated breach; credential reuse is one of the most common ways accounts get taken over (&lt;a href="https://owasp.org/www-community/attacks/Credential_stuffing" rel="noopener noreferrer"&gt;OWASP: Credential Stuffing&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Set a calendar reminder for your &lt;strong&gt;domain renewal date&lt;/strong&gt; — a surprising number of "hijacked domain" reports turn out to be an expired domain re-registered by a squatter, not an actual break-in.&lt;/li&gt;
&lt;li&gt;Periodically glance at &lt;strong&gt;Code Injection&lt;/strong&gt; and &lt;strong&gt;URL Mappings&lt;/strong&gt; even when nothing looks wrong — they're the two places a compromise would most likely hide on a Squarespace site.&lt;/li&gt;
&lt;li&gt;Be alert for phishing emails pretending to be from Squarespace or your registrar asking you to "verify your account" — this is the most common way these logins actually get stolen in the first place (&lt;a href="https://www.cisa.gov/news-events/news/avoiding-social-engineering-and-phishing-attacks" rel="noopener noreferrer"&gt;CISA: Avoiding Social Engineering and Phishing Attacks&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;If you're not sure whether your setup has other soft spots — old integrations, exposed forms, weak account permissions — a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive security check&lt;/a&gt; will give you a quick yes/no on anything critical, no login required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My Squarespace site is hacked — what do I do first?&lt;/strong&gt;&lt;br&gt;
First confirm whether it's account-level or domain-level using the &lt;code&gt;yourname.squarespace.com&lt;/code&gt; preview link test above — that determines whether you're fixing things inside Squarespace or inside your domain registrar. Then immediately change your Squarespace password, enable 2FA, and check Code Injection and URL Mappings for anything you didn't add.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my Squarespace site redirecting to another website?&lt;/strong&gt;&lt;br&gt;
The two most common causes are malicious JavaScript pasted into Code Injection, or an unauthorized rule added under URL Mappings — both require someone to have your account login. If your &lt;code&gt;.squarespace.com&lt;/code&gt; preview link still loads correctly while your custom domain redirects, the cause is DNS, not your Squarespace account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a Squarespace domain actually be hijacked?&lt;/strong&gt;&lt;br&gt;
Yes — if your domain's DNS or registrar account is compromised, attackers can point your domain to a completely different server without ever touching your Squarespace account. This is especially common when the domain is registered with a third party you log into separately and rarely check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will Squarespace restore my site if it's hacked?&lt;/strong&gt;&lt;br&gt;
Squarespace support can review account access logs, help you confirm the login history, and guide you through securing the account, and page-level version history can roll back individual pages. There isn't a one-click "restore the whole site" button, which is why removing the malicious Code Injection or URL Mapping entries yourself is usually the fastest fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I get rid of a Google "deceptive site" warning on Squarespace?&lt;/strong&gt;&lt;br&gt;
Fix the underlying cause first (bad code injection, rogue redirect, or hijacked DNS), confirm the site is clean, then request a review in Google Search Console under Security Issues if your domain is verified there. Clearance isn't instant, but it follows Google re-crawling a genuinely fixed site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;yourname.squarespace.com&lt;/code&gt; preview link as your fastest triage tool: if it's clean but your custom domain redirects, the problem is DNS, not your Squarespace account.&lt;/li&gt;
&lt;li&gt;Account-level compromises almost always show up in &lt;strong&gt;Settings &amp;gt; Advanced &amp;gt; Code Injection&lt;/strong&gt; or &lt;strong&gt;URL Mappings&lt;/strong&gt; — check both first.&lt;/li&gt;
&lt;li&gt;Domain-level hijacks are fixed at your registrar, not inside Squarespace — log in there separately and lock the domain once you're back in.&lt;/li&gt;
&lt;li&gt;Enable 2FA on both your Squarespace account and your registrar account; they're two separate weak points attackers rely on.&lt;/li&gt;
&lt;li&gt;Once you're clean, use the Safe Browsing Transparency Report and Search Console's Request a Review to clear any Google security warning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've locked things down but want a second set of eyes confirming there's nothing else exposed — an old integration, a leftover admin, a form that shouldn't be public — a real engineer manually checking your whole site for $49 through &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Bug Circuit's Circuit audit&lt;/a&gt; is a fast, honest way to be sure before you call it done.&lt;/p&gt;

</description>
      <category>squarespace</category>
      <category>websitehacked</category>
      <category>domainhijacking</category>
      <category>maliciousredirect</category>
    </item>
    <item>
      <title>Fix NET::ERR_CERT_AUTHORITY_INVALID: Owner's Guide</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:52:43 +0000</pubDate>
      <link>https://dev.to/bugcircuit/fix-neterrcertauthorityinvalid-owners-guide-5ae0</link>
      <guid>https://dev.to/bugcircuit/fix-neterrcertauthorityinvalid-owners-guide-5ae0</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/fix-net-err-cert-authority-invalid-owners-guide" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your own website shows NET::ERR_CERT_AUTHORITY_INVALID, the cause is on your server, not your visitor's browser — and it's almost always one of three things: a missing intermediate certificate, a Let's Encrypt renewal that silently failed, or the wrong certificate installed for that domain.&lt;/strong&gt; All three are fixable in under 30 minutes without special tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This is written for the person who &lt;em&gt;owns&lt;/em&gt; the site — not a visitor wondering whether it's safe to click "Advanced" and proceed. If that's you, skip the reassurance and go straight to the diagnosis below. You'll come away knowing exactly which of the three causes you have and the commands or settings to fix it, whether you're running WordPress on shared hosting, a Shopify custom domain, or your own Nginx/Apache server.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this error actually means
&lt;/h2&gt;

&lt;p&gt;Every SSL/TLS certificate is issued by a Certificate Authority (CA) — a company like Let's Encrypt, DigiCert, or Sectigo that browsers agree to trust. NET::ERR_CERT_AUTHORITY_INVALID means Chrome couldn't verify that chain of trust: either it can't find the CA that supposedly issued your certificate, or the certificate is self-signed (issued by your own server, not a real CA). Google's own explanation of Chrome connection errors covers this family of warnings and why the browser blocks the page instead of just showing a note (&lt;a href="https://support.google.com/chrome/answer/6098869" rel="noopener noreferrer"&gt;Chrome Help: Fix connection errors&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This is different from a hostname mismatch, which throws NET::ERR_CERT_COMMON_NAME_INVALID instead — more on that below, since owners often mix the two up after a migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 1: Missing intermediate certificate
&lt;/h2&gt;

&lt;p&gt;This is the most common cause by far. Your certificate isn't signed directly by a root CA that's built into every browser — it's signed by an &lt;em&gt;intermediate&lt;/em&gt; certificate, which is in turn signed by the root. If your server only serves your certificate and skips the intermediate, browsers and command-line tools can't complete the chain, even though the certificate itself is perfectly valid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; yourdomain.com:443 &lt;span class="nt"&gt;-servername&lt;/span&gt; yourdomain.com &amp;lt; /dev/null 2&amp;gt;/dev/null | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-issuer&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this hangs, errors, or a fuller &lt;code&gt;openssl s_client&lt;/code&gt; run reports &lt;code&gt;Verify return code: 21 (unable to verify the first certificate)&lt;/code&gt;, your chain is incomplete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nginx&lt;/strong&gt; — your config must point to the &lt;em&gt;fullchain&lt;/em&gt; file, not the bare certificate: &lt;code&gt;ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;&lt;/code&gt; (not &lt;code&gt;cert.pem&lt;/code&gt;). Reload with &lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache&lt;/strong&gt; — make sure &lt;code&gt;SSLCertificateChainFile&lt;/code&gt; (older Apache) or a combined &lt;code&gt;SSLCertificateFile&lt;/code&gt; that includes the intermediate is set, then run &lt;code&gt;sudo apachectl configtest &amp;amp;&amp;amp; sudo systemctl reload apache2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cPanel / shared hosting&lt;/strong&gt; — go to WHM → SSL/TLS → Install an SSL Certificate and paste the full bundle your CA gave you (certificate + intermediate), or simply re-run AutoSSL under WHM → Manage AutoSSL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed WordPress hosts&lt;/strong&gt; (SiteGround, Kinsta, WP Engine, Bluehost) — toggle SSL off and back on in the hosting dashboard. These hosts manage the chain for you, and forcing a re-issue usually clears it within minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cause 2: Your Let's Encrypt certificate didn't renew
&lt;/h2&gt;

&lt;p&gt;Let's Encrypt certificates are only valid for 90 days by design, specifically so renewal gets automated instead of forgotten (&lt;a href="https://letsencrypt.org/2015/11/09/why-90-days.html" rel="noopener noreferrer"&gt;Let's Encrypt: why ninety-day lifetimes&lt;/a&gt;). If the renewal cron job or systemd timer silently broke — a common cause is a firewall change, a moved webroot, or a full disk — the old certificate simply expires and the browser correctly refuses it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt;&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="nb"&gt;sudo &lt;/span&gt;certbot certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lists every certificate Certbot manages and its expiry date. If it's expired or marked "INVALID," that's your answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run a dry run first so you don't hit issuance rate limits: &lt;code&gt;sudo certbot renew --dry-run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If that succeeds, renew for real: &lt;code&gt;sudo certbot renew&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Reload your web server: &lt;code&gt;sudo systemctl reload nginx&lt;/code&gt; (or &lt;code&gt;apache2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Confirm the renewal timer is actually active: &lt;code&gt;systemctl list-timers | grep certbot&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On shared hosting you likely don't run Certbot yourself — the host does. Contact support or re-trigger the SSL section of your control panel; a stuck AutoSSL job is the shared-hosting equivalent of a broken cron job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 3: Wrong certificate for the domain (a related, easily confused error)
&lt;/h2&gt;

&lt;p&gt;If you recently migrated hosts, added &lt;code&gt;www&lt;/code&gt;, or moved to a new server, and the installed certificate doesn't actually list your current domain, Chrome shows &lt;strong&gt;NET::ERR_CERT_COMMON_NAME_INVALID&lt;/strong&gt; — a sibling error, not the same one, but people search for them interchangeably. This is exactly the "connection not private after renewing hosting" scenario: the new host issued a certificate before DNS had fully pointed at it, or issued one for the wrong subdomain, and visitors end up seeing a certificate meant for a different server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; open your site in Chrome, click the "Not secure" warning, then "Certificate is not valid," and compare the domain names listed on the certificate to the domain in your address bar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirm DNS is fully propagated to the new host before re-issuing (&lt;code&gt;dig yourdomain.com&lt;/code&gt; should return the new host's IP everywhere you check).&lt;/li&gt;
&lt;li&gt;Re-issue the certificate explicitly for every hostname you serve, including both &lt;code&gt;yourdomain.com&lt;/code&gt; and &lt;code&gt;www.yourdomain.com&lt;/code&gt; if visitors reach both.&lt;/li&gt;
&lt;li&gt;Check for a CAA DNS record blocking issuance — if one exists, it must explicitly allow your CA, e.g. &lt;code&gt;yourdomain.com. CAA 0 issue "letsencrypt.org"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cause 4: A leftover self-signed or staging certificate
&lt;/h2&gt;

&lt;p&gt;If a developer, migration script, or a default Nginx/Apache install left a self-signed certificate active — or you tested with Let's Encrypt's staging environment and forgot to switch to production — the certificate is technically valid but issued by something no browser trusts. Re-issue a real production certificate and remove the placeholder; there's no configuration fix for a self-signed cert other than replacing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick diagnostic checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Run the &lt;code&gt;openssl s_client&lt;/code&gt; command above — does the chain complete without errors?&lt;/li&gt;
&lt;li&gt;[ ] Run &lt;code&gt;sudo certbot certificates&lt;/code&gt; (or check your host's SSL panel) — is the certificate expired?&lt;/li&gt;
&lt;li&gt;[ ] Open the certificate details in Chrome — does the "Issued to" domain match your actual domain?&lt;/li&gt;
&lt;li&gt;[ ] Check the "Issued by" field — is it a real CA (Let's Encrypt, DigiCert, Sectigo) or does it show your own server name?&lt;/li&gt;
&lt;li&gt;[ ] Check DNS with &lt;code&gt;dig&lt;/code&gt; — does your domain currently point at the server you believe issued the certificate?&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;Fastest fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Verify return code: 21&lt;/code&gt; in openssl&lt;/td&gt;
&lt;td&gt;Missing intermediate cert&lt;/td&gt;
&lt;td&gt;Serve &lt;code&gt;fullchain.pem&lt;/code&gt;, not &lt;code&gt;cert.pem&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate expired today or recently&lt;/td&gt;
&lt;td&gt;Failed Let's Encrypt renewal&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;certbot renew&lt;/code&gt;, check the systemd timer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate lists a different domain&lt;/td&gt;
&lt;td&gt;Wrong cert for new host/domain&lt;/td&gt;
&lt;td&gt;Re-issue after DNS fully propagates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issuer shows your own server name&lt;/td&gt;
&lt;td&gt;Self-signed/staging leftover&lt;/td&gt;
&lt;td&gt;Replace with a real production cert&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  After you fix it: confirm it actually worked
&lt;/h2&gt;

&lt;p&gt;Don't just trust that your own browser stopped complaining — it may have cached the old certificate. Test from a clean environment with the &lt;a href="https://www.ssllabs.com/ssltest/" rel="noopener noreferrer"&gt;Qualys SSL Labs test&lt;/a&gt;, which shows the full chain, expiry, and any remaining issues a browser would catch. It's free and doesn't require an account.&lt;/p&gt;

&lt;p&gt;While you're checking your site's security setup, it's worth a broader pass — a missing intermediate certificate is exactly the kind of small, easy-to-miss configuration gap that tends to show up alongside other issues, like missing security headers. Our &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;free website security headers checker&lt;/a&gt; flags those in about ten seconds, and our &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;guide to spotting hackable configuration issues&lt;/a&gt; covers the other common gaps we see on small business sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NET::ERR_CERT_AUTHORITY_INVALID means the browser can't verify who issued your certificate — check the chain, the expiry date, and the domain it was issued for, in that order.&lt;/li&gt;
&lt;li&gt;A missing intermediate certificate is the single most common cause; make sure your server serves &lt;code&gt;fullchain.pem&lt;/code&gt; (or the equivalent combined bundle), not the bare certificate.&lt;/li&gt;
&lt;li&gt;Let's Encrypt certificates expire every 90 days on purpose — confirm &lt;code&gt;certbot renew --dry-run&lt;/code&gt; actually succeeds and the renewal timer is running, rather than assuming it is.&lt;/li&gt;
&lt;li&gt;After a host migration, re-issue the certificate only once DNS has fully propagated, and cover every hostname (&lt;code&gt;www&lt;/code&gt; and non-&lt;code&gt;www&lt;/code&gt;) your visitors actually use.&lt;/li&gt;
&lt;li&gt;Verify the fix with an independent tool like SSL Labs, since your own browser may still be showing you a cached, broken certificate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd rather have a human double-check the whole setup — not just the certificate, but the configuration issues that tend to travel with it — a &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit audit&lt;/a&gt; is a one-time $49 manual review of your entire site with a full written report, or run a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive check&lt;/a&gt; first if you just want a quick yes/no on anything critical.&lt;/p&gt;

</description>
      <category>sslcertificate</category>
      <category>letsencrypt</category>
      <category>wordpress</category>
      <category>https</category>
    </item>
    <item>
      <title>SOC 2 vs ISO 27001: Which Needs a Pentest?</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Thu, 24 Sep 2026 13:40:15 +0000</pubDate>
      <link>https://dev.to/bugcircuit/soc-2-vs-iso-27001-which-needs-a-pentest-1nhg</link>
      <guid>https://dev.to/bugcircuit/soc-2-vs-iso-27001-which-needs-a-pentest-1nhg</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/soc-2-vs-iso-27001-which-needs-a-pentest" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neither SOC 2 nor ISO 27001 says the words "you must run a penetration test" anywhere in their official text — but in practice, almost every company that gets certified pays for one anyway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is for founders who've been told by a customer, investor, or sales prospect "we need your SOC 2" or "we need your ISO 27001 certificate" and are now trying to figure out whether a pentest is actually a line item on that checklist, and when to budget for it. You'll get a plain breakdown of what each framework's actual text requires, what auditors realistically expect anyway, and a timeline for when to book the test so it doesn't delay your audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Does the written standard require a pentest?&lt;/th&gt;
&lt;th&gt;Will your auditor expect one anyway?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SOC 2&lt;/strong&gt; (AICPA Trust Services Criteria)&lt;/td&gt;
&lt;td&gt;No — it requires ongoing vulnerability monitoring and detection, not a named "penetration test"&lt;/td&gt;
&lt;td&gt;Almost always yes, especially for Type II reports and any company handling customer data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISO 27001:2022&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No explicit mandate, but Annex A control 8.29 ("Security testing in development and acceptance") is hard to satisfy without one&lt;/td&gt;
&lt;td&gt;Yes — certification bodies routinely ask for evidence of security testing, and pentesting is the standard way to show it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both frameworks are &lt;strong&gt;risk-based and outcome-based&lt;/strong&gt;, not checklists of specific tools. That's the root of the confusion: they describe an outcome ("know your vulnerabilities," "test your security controls") and leave the &lt;em&gt;how&lt;/em&gt; up to you. A penetration test just happens to be the most common, most credible way to produce that evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SOC 2 actually requires
&lt;/h2&gt;

&lt;p&gt;SOC 2 is built on the AICPA's &lt;a href="https://www.aicpa-cima.com/resources/download/2017-trust-services-criteria-with-revised-points-of-focus-2022" rel="noopener noreferrer"&gt;Trust Services Criteria&lt;/a&gt;, organized around five categories: security, availability, processing integrity, confidentiality, and privacy. Every SOC 2 report covers the Security category at minimum.&lt;/p&gt;

&lt;p&gt;Two criteria within the Common Criteria ("CC") series are the ones that pull pentesting into scope indirectly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CC4.1 (Monitoring Activities)&lt;/strong&gt; — the organization must evaluate whether its controls are actually operating as designed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CC7.1 (System Operations)&lt;/strong&gt; — the organization must identify vulnerabilities in its systems on an ongoing basis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither criterion names a penetration test. You could, in theory, satisfy them with automated vulnerability scanning, code review, and bug bounty findings alone. But in practice, most SOC 2 auditors will flag the absence of an independent, human-led penetration test as a gap — particularly for a Type II report, which covers your controls operating over a 3–12 month window rather than a single point in time. If your customers send security questionnaires (most B2B SaaS buyers do), "do you conduct annual penetration testing?" is one of the first questions, and a SOC 2 report without one raises eyebrows during due diligence even if it technically passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ISO 27001 actually requires
&lt;/h2&gt;

&lt;p&gt;ISO 27001 works differently: it's a certifiable management-system standard, not an audit of specific criteria. You build an Information Security Management System (ISMS), run a risk assessment, and then justify which of the 93 Annex A controls apply to you in a document called the Statement of Applicability (SoA).&lt;/p&gt;

&lt;p&gt;The control most directly relevant to pentesting is &lt;strong&gt;Annex A 8.29, "Security testing in development and acceptance"&lt;/strong&gt; — introduced in the 2022 revision. It requires you to define and implement a security testing process for new and changed systems. Alongside it, &lt;strong&gt;Annex A 8.8, "Management of technical vulnerabilities,"&lt;/strong&gt; requires you to obtain timely information about technical vulnerabilities in the systems you use and respond appropriately.&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; mark a control "not applicable" in your SoA if you have a documented, risk-based justification. But if you run a website, a customer-facing app, or any internet-exposed infrastructure, excluding 8.29 is very difficult to defend to a certification body auditor — they'll ask what alternative evidence proves your software is tested for exploitable flaws before it ships. For almost every SaaS company, a penetration test (or at minimum a structured vulnerability assessment) becomes the practical answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;SOC 2&lt;/th&gt;
&lt;th&gt;ISO 27001:2022&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Explicit pentest requirement in the text?&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Closest control(s)&lt;/td&gt;
&lt;td&gt;CC4.1, CC7.1&lt;/td&gt;
&lt;td&gt;Annex A 8.8, 8.29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can you avoid it entirely?&lt;/td&gt;
&lt;td&gt;Rarely — auditors treat it as standard evidence&lt;/td&gt;
&lt;td&gt;Only with a strong, documented risk-based exclusion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical expected frequency&lt;/td&gt;
&lt;td&gt;Annually (aligned to Type II audit period)&lt;/td&gt;
&lt;td&gt;Annually, or after significant system changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who checks the evidence&lt;/td&gt;
&lt;td&gt;Your SOC 2 auditor (CPA firm)&lt;/td&gt;
&lt;td&gt;Your ISO 27001 certification body auditor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report becomes audit evidence?&lt;/td&gt;
&lt;td&gt;Yes — attach or reference the pentest report and remediation&lt;/td&gt;
&lt;td&gt;Yes — cited as evidence for the relevant Annex A controls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When to actually book the test
&lt;/h2&gt;

&lt;p&gt;Don't wait until your auditor asks. Pentest reports take time to schedule, execute, and remediate findings from — and a fresh critical vulnerability sitting unfixed in your report looks worse than not having tested at all.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;8–12 weeks before your audit kickoff&lt;/strong&gt; — book the test. Manual testers (not just automated scanners) often have multi-week queues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4–6 weeks before kickoff&lt;/strong&gt; — receive the report, triage findings by severity, and fix anything high or critical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 weeks before kickoff&lt;/strong&gt; — have your remediation evidence (tickets closed, patches deployed, retest confirmation) ready to hand your auditor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ongoing&lt;/strong&gt; — re-test annually, and again after any major architecture change, new product launch, or when a customer contractually requires it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're unsure whether your current setup even has obvious holes before you spend money on a formal audit-grade pentest, a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive security check&lt;/a&gt; is a reasonable first pass — it won't replace what your auditor needs, but it'll tell you if there's something urgent to fix first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What auditors actually accept as "a pentest"
&lt;/h2&gt;

&lt;p&gt;Not every scan qualifies. Auditors for both frameworks generally want to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;human-led&lt;/strong&gt; test, not purely automated (see our breakdown of &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual vs. automated penetration testing&lt;/a&gt; for why the distinction matters to auditors)&lt;/li&gt;
&lt;li&gt;A dated, written report with findings, severity ratings, evidence, and remediation guidance&lt;/li&gt;
&lt;li&gt;Proof that high/critical findings were remediated or formally risk-accepted&lt;/li&gt;
&lt;li&gt;Testing scoped to production or production-equivalent systems, not just a staging sandbox&lt;/li&gt;
&lt;li&gt;A tester independent from the team that built the system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Methodology matters too. Testers commonly reference the &lt;a href="https://owasp.org/www-project-web-security-testing-guide/" rel="noopener noreferrer"&gt;OWASP Web Security Testing Guide&lt;/a&gt; and &lt;a href="https://csrc.nist.gov/pubs/sp/800/115/final" rel="noopener noreferrer"&gt;NIST SP 800-115&lt;/a&gt; as recognized frameworks for how a test should be structured — citing one of these in your report adds credibility during audit review.&lt;/p&gt;

&lt;p&gt;If you're budgeting for the first time, our guide on &lt;a href="https://bugcircuit.com/guides/how-much-does-a-penetration-test-cost" rel="noopener noreferrer"&gt;how much a penetration test costs&lt;/a&gt; breaks down typical pricing so you're not caught off guard by enterprise pentest firm quotes that assume a much larger scope than a single web app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Neither SOC 2 nor ISO 27001 explicitly mandates a "penetration test" by name — both are risk-based standards that require evidence of vulnerability testing and monitoring.&lt;/li&gt;
&lt;li&gt;SOC 2's CC4.1 and CC7.1, and ISO 27001's Annex A 8.8 and 8.29, are the controls that make a pentest the practical, expected answer for almost every company.&lt;/li&gt;
&lt;li&gt;Book your pentest 8–12 weeks before your audit so you have time to fix findings before the auditor sees them.&lt;/li&gt;
&lt;li&gt;Auditors want a human-led test with a written report and proof of remediation — automated scans alone usually aren't enough.&lt;/li&gt;
&lt;li&gt;Retest annually and after major changes; a stale pentest report is nearly as bad as none.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're not sure where your site actually stands before you commit to a full compliance push, Bug Circuit's &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;$49 Circuit audit&lt;/a&gt; gets a real person manually testing your site with a full written report of what's wrong and how to fix it — a solid, honest starting point before you book a formal compliance-grade pentest.&lt;/p&gt;

</description>
      <category>soc2</category>
      <category>iso27001</category>
      <category>penetrationtesting</category>
      <category>compliance</category>
    </item>
    <item>
      <title>DIY Scanner vs Manual Security Audit: What You Get</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Wed, 23 Sep 2026 07:40:27 +0000</pubDate>
      <link>https://dev.to/bugcircuit/diy-scanner-vs-manual-security-audit-what-you-get-3dfi</link>
      <guid>https://dev.to/bugcircuit/diy-scanner-vs-manual-security-audit-what-you-get-3dfi</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/diy-scanner-vs-manual-security-audit-what-you-get" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A free scanner is a great first move but it only reliably catches known, signature-based issues — missing security headers, outdated software versions, weak TLS config, exposed files — while a professional manual audit is built to catch what scanners structurally can't: broken authentication logic, access-control flaws, and chained vulnerabilities specific to how your site actually works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Who this is for: you run a small business website — WordPress, Shopify, or a custom app — and you're trying to decide whether a free scan is "good enough" or whether you should pay for a human to look at it. What you'll get: an honest breakdown of exactly what each approach finds and misses, a comparison table, and a step-by-step way to run a solid free scan yourself before deciding if you need more.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a DIY scanner actually works
&lt;/h2&gt;

&lt;p&gt;Automated scanners work by sending your site a large list of known test cases and pattern-matching the response. A scanner like &lt;a href="https://www.zaproxy.org/" rel="noopener noreferrer"&gt;OWASP ZAP&lt;/a&gt; or a hosted tool checks things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which HTTP response headers are present (e.g., &lt;code&gt;Content-Security-Policy&lt;/code&gt;, &lt;code&gt;Strict-Transport-Security&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Whether your TLS/SSL certificate is valid and uses modern protocols&lt;/li&gt;
&lt;li&gt;Whether your software (WordPress core, plugins, themes, server software) matches a known-vulnerable version listed in a public database like &lt;a href="https://nvd.nist.gov/" rel="noopener noreferrer"&gt;NVD&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Whether common files are exposed (&lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;wp-config.php.bak&lt;/code&gt;, &lt;code&gt;.git/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Basic injection patterns — appending things like &lt;code&gt;'&lt;/code&gt; or &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; to input fields and watching how the response changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is genuinely useful work. It's fast, free or cheap, and it catches the low-effort issues that make a site an easy opportunistic target. Run one before you do anything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it yourself right now
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Check your response headers: &lt;code&gt;curl -I https://yoursite.com&lt;/code&gt;, or use our &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;security headers checker&lt;/a&gt; to see what's missing at a glance.&lt;/li&gt;
&lt;li&gt;Check your TLS setup with &lt;a href="https://www.ssllabs.com/ssltest/" rel="noopener noreferrer"&gt;Qualys SSL Labs&lt;/a&gt; — aim for grade A.&lt;/li&gt;
&lt;li&gt;Check whether your email domain can be spoofed with our &lt;a href="https://bugcircuit.com/tools/email-spoofing" rel="noopener noreferrer"&gt;email spoofing checker&lt;/a&gt;. You want a valid SPF record like &lt;code&gt;v=spf1 include:_spf.google.com ~all&lt;/code&gt; and a DMARC record such as &lt;code&gt;v=DMARC1; p=quarantine; rua=mailto:you@yoursite.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Comfortable with a terminal? Run a baseline OWASP ZAP scan: &lt;code&gt;docker run -t zaproxy/zap-stable zap-baseline.py -t https://yoursite.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For a free, no-cost recurring scan, CISA runs a scanning service for organizations — details at &lt;a href="https://www.cisa.gov/cyber-hygiene-services" rel="noopener noreferrer"&gt;CISA Cyber Hygiene Services&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What scanners structurally can't see
&lt;/h2&gt;

&lt;p&gt;This is the part that matters most when you're asking whether a free scanner is enough. Scanners test patterns, not intent — they have no idea what your site is &lt;em&gt;supposed&lt;/em&gt; to do, so they can't tell when it's doing something it shouldn't. OWASP's own testing guidance is explicit that this category, business logic flaws, generally can't be found by automated tools because each one is specific to how a particular application works (see the &lt;a href="https://owasp.org/www-project-web-security-testing-guide/" rel="noopener noreferrer"&gt;OWASP Web Security Testing Guide&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Concretely, an automated scanner will almost never catch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Broken access control&lt;/strong&gt; — e.g., changing &lt;code&gt;/account?id=1042&lt;/code&gt; to &lt;code&gt;/account?id=1043&lt;/code&gt; in the URL and viewing someone else's order or invoice. This is the #1 category in the &lt;a href="https://owasp.org/Top10/A01_2021-Broken_Access_Control/" rel="noopener noreferrer"&gt;OWASP Top 10&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication logic flaws&lt;/strong&gt; — a password reset token that never expires, or that leaks in a &lt;code&gt;Referer&lt;/code&gt; header to a third-party script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privilege escalation through legitimate features&lt;/strong&gt; — a "team member" role that can, through some multi-step form, quietly grant itself admin access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chained vulnerabilities&lt;/strong&gt; — three individually low-severity issues that combine into a full account takeover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context-specific data exposure&lt;/strong&gt; — an API endpoint that returns more fields than the page displays, including ones a scraper or competitor would want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment or discount logic abuse&lt;/strong&gt; — applying a coupon code twice, or editing a price field in the browser before checkout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these trip a signature. They require a person who understands your specific site to think like an attacker and actually try to break the logic, not just scan the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side: what each approach actually delivers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Free/DIY scanner&lt;/th&gt;
&lt;th&gt;Manual audit (e.g., Circuit, $49)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Missing security headers&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outdated software / known CVEs&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weak TLS/SSL configuration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exposed config or backup files&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broken access control (viewing others' data)&lt;/td&gt;
&lt;td&gt;Rarely&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication/session logic flaws&lt;/td&gt;
&lt;td&gt;Rarely&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business logic abuse (pricing, coupons, roles)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chained, multi-step exploit paths&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False positives to sort through yourself&lt;/td&gt;
&lt;td&gt;Often, several&lt;/td&gt;
&lt;td&gt;Verified by a human first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix instructions&lt;/td&gt;
&lt;td&gt;Often generic&lt;/td&gt;
&lt;td&gt;Specific to your site, with evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to results&lt;/td&gt;
&lt;td&gt;15–60 minutes, self-serve&lt;/td&gt;
&lt;td&gt;You wait for the write-up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical cost&lt;/td&gt;
&lt;td&gt;Free to ~$50/month for tools&lt;/td&gt;
&lt;td&gt;$49 one-time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Is a free vulnerability scanner enough?
&lt;/h2&gt;

&lt;p&gt;For a lot of very small, low-stakes sites — a brochure site with no login, no payments, no stored customer data — a good free scan plus fixing what it finds is genuinely enough. It'll catch the missing headers, the outdated plugin, and the weak TLS setting, which covers most of the realistic risk for that kind of site.&lt;/p&gt;

&lt;p&gt;It stops being enough the moment your site has a login, stores customer data, takes payments, or has more than one user role — customer vs. admin, free vs. paid tier, and so on. That's exactly the point where the vulnerabilities that matter most — the ones that lead to an actual data breach rather than a cosmetic defacement — are the logic flaws a scanner structurally can't see. Our guide on &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual vs. automated penetration testing&lt;/a&gt; goes deeper into where that line sits for different types of sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  A realistic workflow, not a competition
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run a free scan first — headers, TLS, known CVEs, exposed files — and fix everything it flags. This is cheap, fast, and removes the low-hanging fruit an opportunistic attacker is scanning the whole internet for.&lt;/li&gt;
&lt;li&gt;If your site only serves static content with no accounts, you're probably done for now. Re-scan every few months or after major changes.&lt;/li&gt;
&lt;li&gt;If your site has logins, payments, customer data, or multiple user roles, get a human to look at the logic — that's the gap scanners can't close. A &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive check&lt;/a&gt; will also give you a quick yes/no read on whether anything critical is visible before you decide to pay for anything.&lt;/li&gt;
&lt;li&gt;Not sure which category you're in? Our guide &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;is my website hackable?&lt;/a&gt; walks through the questions to ask.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What a $49 manual audit actually includes
&lt;/h2&gt;

&lt;p&gt;Scope matters for trust here. A $49 productized audit like Circuit is a real person manually reviewing your site's attack surface, authentication flows, and common business-logic paths, then handing you a written report — each finding with severity, evidence, and the exact fix. It is not a multi-week enterprise penetration test, and it is not a compliance certification (SOC 2, PCI-DSS, and ISO 27001 audits are separate, much longer engagements). For a small WordPress site, Shopify store, or indie SaaS, it's scoped to catch what actually threatens a business your size: account takeover, data leakage, and the issues a free scanner already surfaced but couldn't confirm were real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run a free scanner first — it cheaply catches missing headers, outdated software, weak TLS, and exposed files.&lt;/li&gt;
&lt;li&gt;Scanners test known patterns; they can't evaluate whether your site's specific logic — access control, auth, pricing, roles — can be abused.&lt;/li&gt;
&lt;li&gt;If your site has no login, no payments, and no customer data, a good free scan is likely enough on its own.&lt;/li&gt;
&lt;li&gt;The moment accounts, payments, or user roles exist, get a human to test the logic, since that's where real breaches happen.&lt;/li&gt;
&lt;li&gt;Treat scanning and auditing as sequential, not competing: scan first, fix what it finds, then get a manual review for anything that handles real user data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run the free tools above yourself today — they cost nothing. If your site has logins or customer data and you want someone to actually try to break in the way an attacker would, &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit&lt;/a&gt; is a $49 one-time manual audit from a real person, with a full written report — no card required to start with the free passive check first.&lt;/p&gt;

</description>
      <category>securityscanner</category>
      <category>manualaudit</category>
      <category>vulnerabilityscanning</category>
      <category>penetrationtesting</category>
    </item>
    <item>
      <title>Internal vs External Pentest: Which You Need</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Mon, 21 Sep 2026 14:28:04 +0000</pubDate>
      <link>https://dev.to/bugcircuit/internal-vs-external-pentest-which-you-need-41i</link>
      <guid>https://dev.to/bugcircuit/internal-vs-external-pentest-which-you-need-41i</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/internal-vs-external-pentest-which-you-need" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you run a public-facing website with no private employee network to protect, you need an external penetration test — not an internal one.&lt;/strong&gt; Internal pentesting is a different product for a different problem: it tests what happens if someone already has a foot inside your office network. Most small businesses selling online, running a SaaS app, or taking bookings through a website don't have that problem to solve, or don't have it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who this is for:&lt;/strong&gt; owners of a website, online store, or small SaaS app who got a quote (or saw a menu) listing "internal" and "external" pentesting as separate line items and aren't sure which applies to them. &lt;strong&gt;What you'll get:&lt;/strong&gt; a plain-English breakdown of the difference, a way to tell which one a vendor is actually selling you, and a clear answer for whether your website needs internal testing at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal vs External Penetration Testing: The Core Difference
&lt;/h2&gt;

&lt;p&gt;The words "internal" and "external" describe the attacker's starting point, not the size or seriousness of the test.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;External penetration testing&lt;/strong&gt; simulates an attacker on the public internet who has no special access — no login, no VPN, no badge. They can only reach what's exposed to the world: your website, your login pages, your DNS records, your mail server, your open ports. This is what NIST's &lt;a href="https://csrc.nist.gov/pubs/sp/800/115/final" rel="noopener noreferrer"&gt;Technical Guide to Information Security Testing and Assessment (SP 800-115)&lt;/a&gt; calls testing from an "external" perspective — outside the organization's network perimeter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal penetration testing&lt;/strong&gt; simulates an attacker who is already inside — a malicious employee, a contractor with VPN access, or someone who successfully phished a staff laptop. The test starts on your internal network and asks: once someone is in, how far can they get? Can they reach the file server, the domain controller, the finance database?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the distinction in one table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;External Pentest&lt;/th&gt;
&lt;th&gt;Internal Pentest&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Attacker's starting point&lt;/td&gt;
&lt;td&gt;Public internet, zero access&lt;/td&gt;
&lt;td&gt;Already on your internal network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What it tests&lt;/td&gt;
&lt;td&gt;Website, login forms, APIs, DNS, exposed ports, email spoofing&lt;/td&gt;
&lt;td&gt;Employee workstations, internal servers, file shares, Active Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who typically needs it&lt;/td&gt;
&lt;td&gt;Anyone with a public website or web app&lt;/td&gt;
&lt;td&gt;Companies with an office network, internal servers, or many employee devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Common trigger&lt;/td&gt;
&lt;td&gt;"Is my website hackable?"&lt;/td&gt;
&lt;td&gt;A vendor security questionnaire, cyber insurance renewal, or compliance audit (SOC 2, ISO 27001)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does a small business site need it?&lt;/td&gt;
&lt;td&gt;Yes — this is the relevant test&lt;/td&gt;
&lt;td&gt;Only if there's an internal network worth attacking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  If You Just Have a Website, You Need External Testing
&lt;/h2&gt;

&lt;p&gt;If your business is a WordPress site, a Shopify store, or a small SaaS app, the entire attack surface a stranger can reach is external by definition. There's no internal network for a random attacker to "already be inside" — the front door &lt;em&gt;is&lt;/em&gt; the website.&lt;/p&gt;

&lt;p&gt;An external test covers the things that actually get small sites hacked:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authentication and login flows&lt;/strong&gt; — weak password policies, missing rate limiting, exposed admin panels (&lt;code&gt;/wp-admin&lt;/code&gt;, &lt;code&gt;/wp-login.php&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input handling&lt;/strong&gt; — SQL injection, cross-site scripting (XSS), and other flaws in forms, search bars, and URL parameters. &lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;OWASP's Top 10&lt;/a&gt; tracks these as the most common web app risks year after year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outdated software and plugins&lt;/strong&gt; — old CMS versions, abandoned plugins with known CVEs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server and DNS exposure&lt;/strong&gt; — open ports, misconfigured TLS, missing security headers (you can check yours for free with a &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;security headers scanner&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email spoofing risk&lt;/strong&gt; — missing or weak SPF, DKIM, and DMARC records that let attackers send phishing email that looks like it's from your domain (check with an &lt;a href="https://bugcircuit.com/tools/email-spoofing" rel="noopener noreferrer"&gt;email spoofing checker&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business logic flaws&lt;/strong&gt; — things automated scanners miss, like a checkout that lets you apply the same discount code twice, or an account page that leaks another customer's data by changing a number in the URL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last category is exactly why a manual, human-led external test finds things a scanner-only "pentest" doesn't. See our breakdown of &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual vs. automated penetration testing&lt;/a&gt; if you want the full comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Internal Pentesting Actually Applies
&lt;/h2&gt;

&lt;p&gt;Internal testing earns its keep when there's real internal infrastructure to attack — not just a website. You likely need it if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You run an office network with shared file servers, an internal wiki, or a domain controller (Active Directory).&lt;/li&gt;
&lt;li&gt;Staff use VPN access to reach internal systems from home.&lt;/li&gt;
&lt;li&gt;A customer's security questionnaire or vendor risk assessment specifically asks for internal testing evidence.&lt;/li&gt;
&lt;li&gt;You're pursuing SOC 2, ISO 27001, or a similar compliance framework that scopes both internal and external testing.&lt;/li&gt;
&lt;li&gt;You've had — or are worried about — an insider threat or a compromised employee device spreading further than it should.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CISA's guidance on &lt;a href="https://www.cisa.gov/resources-tools/resources/rules-of-engagement" rel="noopener noreferrer"&gt;choosing a penetration testing vendor&lt;/a&gt; is written for organizations sophisticated enough to be scoping both internal and external engagements together — that's usually a mid-size or larger company with IT infrastructure beyond a website, not a five-person shop running a Shopify store.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Way to Tell Which One You're Being Sold
&lt;/h2&gt;

&lt;p&gt;Before you buy anything labeled "penetration test," ask the vendor these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Where does testing start?&lt;/strong&gt; From the public internet with no credentials (external) or from inside your network / VPN (internal)?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;What's in scope?&lt;/strong&gt; Just the website and domain, or also office Wi-Fi, employee laptops, and internal servers?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Is it manual or automated?&lt;/strong&gt; A scan report alone isn't a pentest — a real pentest involves a person actively trying to break in and confirming what's exploitable.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Do you get a fix, or just a list?&lt;/strong&gt; Some services stop at the report; others help you patch what's found.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Does the scope match what you actually have?&lt;/strong&gt; If you don't have an internal network beyond a home Wi-Fi router and a laptop, paying for internal testing is paying to test nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a vendor can't answer the "where does testing start" question clearly, that's a sign the quote is generic and not scoped to your actual setup. For a broader gut-check on whether you even need testing right now, our guide on &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;figuring out if your website is hackable&lt;/a&gt; walks through the warning signs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Costs, and What "Manual" Actually Means
&lt;/h2&gt;

&lt;p&gt;Pricing for external website testing varies a lot depending on whether it's automated-only or genuinely human-led — we cover the range in &lt;a href="https://bugcircuit.com/guides/how-much-does-a-penetration-test-cost" rel="noopener noreferrer"&gt;how much a penetration test costs&lt;/a&gt;. As a rough anchor: a productized manual audit of a small site runs well under what a scoped enterprise-style engagement (internal + external, multi-week) costs, because the attack surface is smaller and the engagement is standardized rather than custom-scoped.&lt;/p&gt;

&lt;p&gt;At Bug Circuit, &lt;strong&gt;Circuit&lt;/strong&gt; ($49, one-time) is exactly this: a human security engineer manually audits your public-facing site — external testing — and hands you a written report with severity ratings, evidence, and exact fixes for each issue. &lt;strong&gt;Signal&lt;/strong&gt; ($299 / 3 months) adds the same audit plus we fix the high and critical issues ourselves, with three months of continued coverage. Neither product tests internal office networks — because for a website-only business, that's not the attack surface that matters.&lt;/p&gt;

&lt;p&gt;If you're not sure where you stand, you can start with a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive website security check&lt;/a&gt; — no card, no login required — which gives you a yes/no on whether anything critical is visible from the outside before you decide on a paid audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;External pentesting&lt;/strong&gt; simulates an outside attacker with no access, testing your website, login pages, DNS, and email configuration — this is what almost every small business with a public site actually needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal pentesting&lt;/strong&gt; simulates an attacker already inside your network, and only matters if you have real internal infrastructure — office servers, VPN access, Active Directory — beyond the website itself.&lt;/li&gt;
&lt;li&gt;If a quote bundles both without asking what internal infrastructure you actually run, you may be paying for a test of something that doesn't exist.&lt;/li&gt;
&lt;li&gt;A manual (human-led) external audit catches business-logic and access-control flaws that automated scanners routinely miss.&lt;/li&gt;
&lt;li&gt;Start with a free passive check to see where you stand, then get a full manual audit if anything looks off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've read this far because you're weighing whether to spend money on this at all: a &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;$49 manual audit&lt;/a&gt; of your public-facing site is a low-risk way to find out exactly what's exposed, in writing, from a real person — no guessing, no upsell required.&lt;/p&gt;

</description>
      <category>penetrationtesting</category>
      <category>websitesecurity</category>
      <category>smallbusinesssecurity</category>
      <category>vulnerabilityassessment</category>
    </item>
    <item>
      <title>Is My WordPress Site Hacked? Diagnostic Checklist</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Wed, 16 Sep 2026 02:29:44 +0000</pubDate>
      <link>https://dev.to/bugcircuit/is-my-wordpress-site-hacked-diagnostic-checklist-835</link>
      <guid>https://dev.to/bugcircuit/is-my-wordpress-site-hacked-diagnostic-checklist-835</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/is-my-wordpress-site-hacked-diagnostic-checklist" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your site is throwing sudden errors, redirecting visitors, flagged by Google, or has a login you don't recognize, treat it as hacked until you rule each sign out below&lt;/strong&gt; — this checklist tells you exactly where to look and which symptoms are near-certain versus just a false alarm.&lt;/p&gt;

&lt;p&gt;This is for WordPress owners — store owners, bloggers, agencies managing client sites — who noticed something &lt;em&gt;off&lt;/em&gt; and want a fast, concrete way to check for compromise, not a 40-page guide. You'll get a scannable checklist, the exact place to check each symptom, and what to do the moment you confirm one. If you'd rather have a person look instead of second-guessing your own site, the &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; gives you a straight yes/no on critical bugs with no card and no login.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 60-second checklist
&lt;/h2&gt;

&lt;p&gt;Run down this table first. "Critical" means stop and act now; "worth checking" means it's a common false-alarm trigger too, so verify before you panic.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;What it usually means&lt;/th&gt;
&lt;th&gt;Urgency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chrome/Google shows "Deceptive site ahead" or "This site may harm your computer"&lt;/td&gt;
&lt;td&gt;Google Safe Browsing flagged live malware or phishing code on your pages&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random pages ranking in Google you never wrote (e.g. pharmacy or replica-goods spam)&lt;/td&gt;
&lt;td&gt;SEO spam injected into a compromised plugin, theme, or database table&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visitors get redirected to a casino, pharmacy, or ad domain&lt;/td&gt;
&lt;td&gt;Malicious redirect in &lt;code&gt;.htaccess&lt;/code&gt;, &lt;code&gt;functions.php&lt;/code&gt;, or a rogue plugin&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sudden HTTP 500, 502, or 503 errors with no code changes on your end&lt;/td&gt;
&lt;td&gt;Corrupted core files, a runaway cron script, or database injection&lt;/td&gt;
&lt;td&gt;Worth checking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An Administrator account in Users you didn't create&lt;/td&gt;
&lt;td&gt;Attacker planted a persistent backdoor login&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Login redirects elsewhere, or &lt;code&gt;wp-login.php&lt;/code&gt; behaves strangely&lt;/td&gt;
&lt;td&gt;Core files or &lt;code&gt;.htaccess&lt;/code&gt; tampered with&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customers report spam email that looks like it's from your domain&lt;/td&gt;
&lt;td&gt;Site is being used as a spam relay via &lt;code&gt;wp_mail()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Worth checking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU/bandwidth spikes with no matching rise in real visitors&lt;/td&gt;
&lt;td&gt;Site running cryptomining, a botnet node, or a spam/DDoS script&lt;/td&gt;
&lt;td&gt;Worth checking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unfamiliar &lt;code&gt;.php&lt;/code&gt; files inside &lt;code&gt;wp-content/uploads&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;An uploaded web shell — a script giving remote file/command access&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your host emails you about "malware detected" or suspends the account&lt;/td&gt;
&lt;td&gt;Their scanner matched a known malicious signature&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Sudden 500/502/503 errors — don't assume the worst yet
&lt;/h2&gt;

&lt;p&gt;A wave of server errors is the symptom most likely to have an innocent cause: an auto-update conflict, a PHP memory limit, or an expired SSL cert can all produce a 500. Before treating it as a hack, check &lt;code&gt;wp-content/debug.log&lt;/code&gt; or your host's error log (cPanel → &lt;strong&gt;Metrics → Errors&lt;/strong&gt;, or your hosting dashboard's log viewer).&lt;/p&gt;

&lt;p&gt;What separates a bug from a break-in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plugin/config error&lt;/strong&gt; — the log names a real file inside a known plugin folder, e.g. "Allowed memory size exhausted in .../woocommerce/includes/...". Ordinary bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compromise&lt;/strong&gt; — the log references a file you don't recognize, especially inside &lt;code&gt;wp-content/uploads/&lt;/code&gt; (which should never contain executable PHP) or a random string like &lt;code&gt;wp-content/plugins/wp-tmp-cache/x942.php&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have WP-CLI access, compare your files against official checksums:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp core verify-checksums
wp plugin verify-checksums &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any "file doesn't match" result on a file you didn't edit is a strong signal — that's exactly the check a manual audit runs by hand, cross-referenced against what the plugin &lt;em&gt;should&lt;/em&gt; contain rather than just a checksum mismatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Safe Browsing and search warnings
&lt;/h2&gt;

&lt;p&gt;Google, Chrome, Firefox, and Safari all share data from &lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Google Safe Browsing&lt;/a&gt;, which scans public sites for malware and phishing code and warns visitors before they land on a flagged page. If your own browser (in incognito, with no cached override) shows a red warning screen, or a customer reports seeing one, your site is very likely serving malicious code right now — not just a possibility.&lt;/p&gt;

&lt;p&gt;To check without waiting for a customer complaint:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Safe Browsing site status page&lt;/a&gt; and enter your domain.&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;Google Search Console&lt;/strong&gt; → &lt;strong&gt;Security Issues&lt;/strong&gt; — Google lists exactly which pages it flagged and why (e.g. "hacked with spam content" vs "malware").&lt;/li&gt;
&lt;li&gt;Search &lt;code&gt;site:yourdomain.com&lt;/code&gt; in Google and look for page titles you never wrote (Japanese/Russian spam-keyword titles are a classic signature of a hacked WordPress site).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Unauthorized admin accounts and logins
&lt;/h2&gt;

&lt;p&gt;This is the single clearest sign on this list — WordPress doesn't create Administrator accounts on its own, ever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;Users → All Users&lt;/strong&gt;, sort by role and check every Administrator by name, email, and registration date.&lt;/li&gt;
&lt;li&gt;Via WP-CLI: &lt;code&gt;wp user list --role=administrator --fields=ID,user_login,user_email,user_registered&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If you're locked out or don't trust the dashboard, check the &lt;code&gt;wp_users&lt;/code&gt; table directly in phpMyAdmin — look for accounts with a &lt;code&gt;user_registered&lt;/code&gt; date you don't recognize.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A single account you didn't create is enough to confirm compromise on its own, since it means someone already has standing access to your site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unfamiliar or duplicated cron jobs
&lt;/h2&gt;

&lt;p&gt;WordPress runs its own pseudo-cron (&lt;code&gt;wp-cron.php&lt;/code&gt;) separately from any real server crontab, and attackers use both to keep a backdoor alive after you think you've cleaned up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List WordPress's own scheduled events: &lt;code&gt;wp cron event list --fields=hook,next_run,schedule&lt;/code&gt;. A hook name that isn't tied to any plugin you installed (random class-style names, not &lt;code&gt;woocommerce_cleanup_sessions&lt;/code&gt;-style ones) is worth investigating.&lt;/li&gt;
&lt;li&gt;Check the real server crontab via SSH (&lt;code&gt;crontab -l&lt;/code&gt;) or your host's &lt;strong&gt;Cron Jobs&lt;/strong&gt; panel. Anything that pipes to &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt;, or &lt;code&gt;php -r&lt;/code&gt; with a base64-looking string as the argument is a red flag, not a maintenance task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Unexpected outbound traffic
&lt;/h2&gt;

&lt;p&gt;A hacked site often "phones home" — sending spam email, connecting to a command-and-control server, or joining a botnet — which shows up as outbound traffic you didn't generate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compare your hosting bandwidth graph against your actual visitor count in analytics; a spike in outbound data with flat visitor traffic is the tell, not a spike in both.&lt;/li&gt;
&lt;li&gt;On a VPS with shell access, &lt;code&gt;ss -tnp&lt;/code&gt; or &lt;code&gt;netstat -tnp&lt;/code&gt; lists active outbound connections; match the process ID back to a PHP worker connecting to an IP address that has nothing to do with your site's normal services (payment gateway, CDN, email provider).&lt;/li&gt;
&lt;li&gt;If your host's abuse team emails you about outbound spam volume or a blocked IP, that's third-party confirmation, not a guess.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to do the moment you confirm a sign
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Change every password&lt;/strong&gt; — WordPress admin, hosting account, FTP/SFTP, and the database user — from a device you trust, before doing anything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the site in maintenance mode&lt;/strong&gt; or take it offline temporarily if it's actively redirecting visitors or serving malware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't just delete the suspicious file and call it fixed.&lt;/strong&gt; A single backdoor is rarely the only one; &lt;a href="https://www.cisa.gov/resources-tools/resources/detect-and-prevent-web-shell-malware" rel="noopener noreferrer"&gt;CISA's guidance on web shell malware&lt;/a&gt; notes that attackers commonly leave multiple redundant footholds once they've gained access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restore from a backup that predates the first symptom&lt;/strong&gt;, if you have one, then patch whatever let the attacker in before putting it back online.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get a second set of eyes.&lt;/strong&gt; Automated scanners are good at catching known signatures but miss custom-coded backdoors and logic-based abuse; that gap is exactly why &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual review finds things automated scans don't&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're still not sure after running through this list, our &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;guide to telling whether a website is hackable in the first place&lt;/a&gt; covers the underlying weaknesses (outdated plugins, weak passwords, missing headers) worth checking regardless of whether you've been breached yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Google Safe Browsing warning or an admin account you didn't create is confirmation on its own — act immediately, don't wait for a second sign.&lt;/li&gt;
&lt;li&gt;Sudden 500/502/503 errors are the most commonly misread symptom; check the error log for unfamiliar filenames before assuming a hack.&lt;/li&gt;
&lt;li&gt;Check both WordPress's own cron (&lt;code&gt;wp cron event list&lt;/code&gt;) and the real server crontab (&lt;code&gt;crontab -l&lt;/code&gt;) — attackers use both to persist.&lt;/li&gt;
&lt;li&gt;Outbound traffic spikes without matching visitor spikes are a stronger signal than raw bandwidth numbers alone.&lt;/li&gt;
&lt;li&gt;Deleting one suspicious file isn't a fix — confirm the full extent before declaring the site clean.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ticked even one "Critical" box above, the honest next step is a human looking at the actual code, not another automated scan. &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit&lt;/a&gt; is a $49 one-time manual audit — a real person reviews your site and hands you a written report of every issue found, with severity and the exact fix, so you know precisely what an attacker did and what to close. There's no pressure to buy anything if the free check comes back clean.&lt;/p&gt;

</description>
      <category>wordpresssecurity</category>
      <category>hackedwebsite</category>
      <category>malware</category>
      <category>incidentresponse</category>
    </item>
    <item>
      <title>Wix Security Checklist for Small Business Owners</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Sun, 13 Sep 2026 20:28:46 +0000</pubDate>
      <link>https://dev.to/bugcircuit/wix-security-checklist-for-small-business-owners-4ap3</link>
      <guid>https://dev.to/bugcircuit/wix-security-checklist-for-small-business-owners-4ap3</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/wix-security-checklist-for-small-business-owners" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wix's platform is genuinely secure on the back end — but "Wix is secure" and "my Wix site is secure" are two different claims, and the gap between them is entirely your responsibility.&lt;/strong&gt; Wix patches servers, issues free SSL certificates, and runs a PCI-compliant payment system. It does not stop someone from guessing your password, does not vet every app you install from the App Market, and does not decide how much customer data your contact form quietly collects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who this is for:&lt;/strong&gt; you run a small business, agency, or side project on Wix and you've never done a real security pass on it. &lt;strong&gt;What you'll get:&lt;/strong&gt; a plain checklist of exactly what Wix already covers, what's on you, and the settings to check today — no code required.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Wix Handles vs. What You Handle
&lt;/h2&gt;

&lt;p&gt;Wix is a fully hosted (SaaS) platform, which means you never touch a server — Wix's own team owns patching, uptime, and infrastructure defense. That's a real advantage over self-hosted WordPress, where the site owner is on the hook for every plugin update. But "hosted" only covers the plumbing, not what you build on top of it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Security area&lt;/th&gt;
&lt;th&gt;Handled by Wix&lt;/th&gt;
&lt;th&gt;Handled by you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Server patching &amp;amp; OS security&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL/TLS certificate (HTTPS)&lt;/td&gt;
&lt;td&gt;✅ Auto-issued and renewed&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DDoS protection &amp;amp; network infrastructure&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment processing (if using Wix Payments)&lt;/td&gt;
&lt;td&gt;✅ PCI-compliant&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account password strength&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two-factor authentication (2FA)&lt;/td&gt;
&lt;td&gt;Available, opt-in&lt;/td&gt;
&lt;td&gt;✅ You must turn it on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who has editor/admin access&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party apps you install&lt;/td&gt;
&lt;td&gt;Wix reviews apps at listing, not their ongoing behavior&lt;/td&gt;
&lt;td&gt;✅ You choose and audit them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What your forms collect and where it goes&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedded scripts (chat widgets, trackers, ads)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom domain email security (SPF/DKIM/DMARC)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Wix documents its platform-level commitments in its &lt;a href="https://www.wix.com/trust-center/security" rel="noopener noreferrer"&gt;Trust Center&lt;/a&gt; — worth a five-minute read if you want the vendor's own claims, not just this checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wix Security Checklist
&lt;/h2&gt;

&lt;p&gt;Work down this list once, then revisit it every few months or whenever staff changes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Turn on two-step verification.&lt;/strong&gt; On wix.com, go to your account profile (top-right icon) → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Security&lt;/strong&gt;, and enable two-step verification. This is the single highest-impact change you can make — &lt;a href="https://www.cisa.gov/MFA" rel="noopener noreferrer"&gt;CISA recommends multi-factor authentication&lt;/a&gt; as one of the most effective defenses against account takeover, because it stops a stolen or guessed password from being enough on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a unique password, not a memorized one.&lt;/strong&gt; Reused passwords are the number one reason small-business accounts get taken over — one breach at an unrelated site hands over your Wix login too. Use a password manager to generate and store a unique one. &lt;a href="https://pages.nist.gov/800-63-3/sp800-63b.html" rel="noopener noreferrer"&gt;NIST's password guidance&lt;/a&gt; actually recommends long, unique passphrases over the old "8 characters, one symbol, one number" rule — length and uniqueness beat complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit who has access.&lt;/strong&gt; Go to &lt;strong&gt;Dashboard → Settings → Roles &amp;amp; Permissions&lt;/strong&gt; and review every collaborator. Remove former employees, freelancers, and agencies you no longer work with. Each person with editor access is a password that can be phished.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review every installed app.&lt;/strong&gt; Go to &lt;strong&gt;Dashboard → Apps → Manage Apps&lt;/strong&gt;. For each one, ask: do we still use this, and what data does it request access to (site content, contacts, orders)? Delete anything unused — an abandoned app is still a live door into your site's data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your forms for data you don't need.&lt;/strong&gt; Open &lt;strong&gt;Dashboard → Contacts&lt;/strong&gt; and each &lt;strong&gt;Forms&lt;/strong&gt; submission setting. If you're collecting phone numbers, addresses, or IDs you don't actually use, remove those fields. Less collected data means less to leak if anything ever does go wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know where form submissions actually go.&lt;/strong&gt; Wix Forms can email submissions, store them in Contacts, or both. Make sure whoever's inbox receives them isn't a shared/legacy account nobody checks or secures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up account recovery correctly.&lt;/strong&gt; Confirm the recovery email and phone number on your Wix account are current — if you're ever locked out or need to prove account ownership after a compromise, this is how you get back in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know how to use Site History.&lt;/strong&gt; In the Wix Editor, the History icon lets you roll back to a previous saved version. If a page ever gets defaced or an app makes an unwanted change, this is your undo button — know where it is before you need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you use a custom domain for email, check your DNS records.&lt;/strong&gt; SPF, DKIM, and DMARC records stop attackers from sending phishing emails that look like they're from your domain. Run your domain through &lt;a href="https://bugcircuit.com/tools/email-spoofing" rel="noopener noreferrer"&gt;Bug Circuit's free email spoofing checker&lt;/a&gt; to see if these are set up correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review embedded third-party scripts.&lt;/strong&gt; Chat widgets, ad pixels, and analytics tools you've pasted into your site's custom code (Dashboard → Settings → Custom Code) can read page data and, in some cases, form input. Remove any you no longer actively use — this mirrors the general risk &lt;a href="https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/" rel="noopener noreferrer"&gt;OWASP flags around vulnerable and outdated third-party components&lt;/a&gt;: code you didn't write is still code you're responsible for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn on notifications for account changes.&lt;/strong&gt; Wix can alert you by email when your password or account details change — make sure that email actually reaches someone who'll notice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check what your site sends to browsers.&lt;/strong&gt; Even on a hosted platform, you can inspect your live site's response headers with a tool like &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;Bug Circuit's security headers checker&lt;/a&gt; to understand your baseline — useful context if you ever add custom code or a headless setup on top of Wix.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Overlooked Risk: Third-Party Apps
&lt;/h2&gt;

&lt;p&gt;Most Wix compromises small business owners run into don't come from Wix's core platform being broken — they come from what's installed on top of it. The Wix App Market reviews apps before listing them, but an app's &lt;em&gt;behavior&lt;/em&gt; after installation (what it does with the data it can access, whether its own backend gets breached later) isn't something Wix continuously polices for you.&lt;/p&gt;

&lt;p&gt;Treat every app install like handing someone a key: ask what it needs access to, whether you still use it, and whether the developer is still actively maintaining it. If an app hasn't been updated in over a year and you don't remember installing it, remove it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is Wix Secure Enough for My Business?
&lt;/h2&gt;

&lt;p&gt;For most small businesses — a services site, a local shop, a simple online store — yes, Wix's infrastructure is a reasonable, well-maintained foundation. You're not managing a server, and you're not the one responsible for patching a zero-day in the platform's core code.&lt;/p&gt;

&lt;p&gt;Where it gets more nuanced is scale and sensitivity: if you're collecting health information, processing large volumes of payment data outside Wix Payments, or need to answer a client's security questionnaire with specifics, "we use Wix" isn't a complete answer — you'll also need to show &lt;em&gt;your&lt;/em&gt; side of the checklist above is handled. Our guide on &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual vs. automated penetration testing&lt;/a&gt; explains the difference if a client or partner is asking for proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signs Your Wix Site May Already Be Compromised
&lt;/h2&gt;

&lt;p&gt;Wix's own protections mean full server compromise is rare, but account-level compromise still happens. Watch for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pages, products, or blog posts you didn't create&lt;/li&gt;
&lt;li&gt;Apps installed that no one on your team recognizes&lt;/li&gt;
&lt;li&gt;Customers reporting spam or phishing emails that look like they're from your domain&lt;/li&gt;
&lt;li&gt;Unexpected redirects when visitors land on your site&lt;/li&gt;
&lt;li&gt;A password reset email you didn't request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you see any of these, change your password immediately, turn on 2FA if it isn't already on, and check our guide on &lt;a href="https://bugcircuit.com/website-hacked" rel="noopener noreferrer"&gt;what to do if your website's been hacked&lt;/a&gt;. If you're unsure whether something you're seeing is actually a problem, our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; gives you a fast yes/no on critical issues, no card required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Wix secures the infrastructure (servers, SSL, DDoS, payments); you're still responsible for passwords, access, apps, forms, and embedded scripts.&lt;/li&gt;
&lt;li&gt;Turning on two-step verification is the single highest-impact five-minute fix available to you.&lt;/li&gt;
&lt;li&gt;Audit installed apps and collaborator access at least twice a year — remove what you don't actively use.&lt;/li&gt;
&lt;li&gt;Minimize what your forms collect, and confirm where submissions actually go.&lt;/li&gt;
&lt;li&gt;"Wix is secure" isn't the same claim as "my Wix site is configured securely" — this checklist closes that gap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running this checklist yourself covers the basics well. If you want a second set of eyes — someone who actually clicks through your app list, tests your forms, and checks your public-facing configuration the way an attacker would — that's exactly what a &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;$49 manual audit&lt;/a&gt; from Bug Circuit does: a real person reviews your site and hands you a written report with fixes, not just a scan.&lt;/p&gt;

</description>
      <category>wix</category>
      <category>websitesecurity</category>
      <category>checklist</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Scanner Found a Vulnerable Plugin? Do This Next</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 11 Sep 2026 23:13:16 +0000</pubDate>
      <link>https://dev.to/bugcircuit/scanner-found-a-vulnerable-plugin-do-this-next-3f76</link>
      <guid>https://dev.to/bugcircuit/scanner-found-a-vulnerable-plugin-do-this-next-3f76</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/scanner-found-a-vulnerable-plugin-do-this-next" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If a scanner like WPScan or Wordfence just flagged a plugin, don't panic and don't touch anything yet — first confirm the version and CVE actually match your site, check whether that specific flaw is being exploited in the wild, then patch or deactivate based on severity, in that order.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is for site owners who ran (or received) an automated scan that named a specific vulnerable plugin and now have three questions at once: is this real, is someone already inside, and what do I fix first? You'll get a step-by-step triage process, a priority table, and a way to tell a genuine emergency from scanner noise — no jargon, no scare tactics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the alert actually means
&lt;/h2&gt;

&lt;p&gt;WPScan and Wordfence both work the same basic way: they read your site's visible plugin list and version numbers, then check that against a database of known, publicly disclosed vulnerabilities — things like the &lt;a href="https://wpscan.com/vulnerabilities/" rel="noopener noreferrer"&gt;WPScan Vulnerability Database&lt;/a&gt; or the CVE records in the &lt;a href="https://nvd.nist.gov/" rel="noopener noreferrer"&gt;NVD (National Vulnerability Database)&lt;/a&gt;. If your plugin's version matches a version range with a known flaw, you get a red flag.&lt;/p&gt;

&lt;p&gt;That's it. The scanner hasn't checked whether anyone has actually tried to exploit it on your site, whether the vulnerable code path is even reachable in your configuration, or whether you already patched it manually without bumping the version number. It's a match against a list — a strong signal worth acting on, but not proof of compromise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Confirm the version is actually current
&lt;/h2&gt;

&lt;p&gt;Before anything else, verify the scanner is looking at your real, live version.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In WordPress, go to &lt;strong&gt;Plugins &amp;gt; Installed Plugins&lt;/strong&gt; and note the exact version number next to the flagged plugin.&lt;/li&gt;
&lt;li&gt;Open the plugin's page on WordPress.org (or the vendor's site) and check the &lt;strong&gt;Changelog&lt;/strong&gt; tab for the version where the fix landed.&lt;/li&gt;
&lt;li&gt;Compare: if your installed version is &lt;em&gt;equal to or newer than&lt;/em&gt; the fixed version, this is likely a &lt;strong&gt;false positive&lt;/strong&gt; — the scanner's database may be a day or two behind, or it misread a cached/staging copy.&lt;/li&gt;
&lt;li&gt;If your version is older than the fix, the flag is real and you're genuinely running vulnerable code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you use a staging site or a caching layer that serves an old copy of &lt;code&gt;readme.txt&lt;/code&gt;, scanners sometimes read stale version strings from there too — check the live production files, not a cache.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Check if this specific bug is being actively exploited
&lt;/h2&gt;

&lt;p&gt;This is the step most people skip, and it's the one that actually tells you how urgent this is.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Look up the CVE ID&lt;/strong&gt; the scanner gave you (something like &lt;code&gt;CVE-2024-XXXXX&lt;/code&gt;) on the &lt;a href="https://nvd.nist.gov/" rel="noopener noreferrer"&gt;NVD&lt;/a&gt; and read the vulnerability type: SQL injection and remote code execution are far more dangerous than a low-severity information disclosure or a bug that requires admin-level access to trigger.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check CISA's Known Exploited Vulnerabilities (KEV) catalog&lt;/strong&gt; — &lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog" rel="noopener noreferrer"&gt;cisa.gov/known-exploited-vulnerabilities-catalog&lt;/a&gt;. If your CVE is listed there, it means it's confirmed being used in real attacks right now, not just theoretically exploitable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search the plugin name + "exploit" or "in the wild"&lt;/strong&gt; on a security news source like Wordfence's own threat intelligence blog or Sucuri's blog — they publish write-ups when a WordPress plugin flaw is actively being mass-scanned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your own access logs&lt;/strong&gt; for requests hitting the plugin's file paths (e.g. &lt;code&gt;/wp-content/plugins/plugin-name/&lt;/code&gt;) with unusual parameters, especially &lt;code&gt;POST&lt;/code&gt; requests you didn't make. Your host's control panel usually has a raw access log viewer, or ask support for the last 7 days of logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the CVE requires "authenticated admin access" to exploit and you're the only admin with a strong, unique password, your real-world risk right now is much lower than a CVE that any anonymous visitor can trigger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Decide what to do, in order
&lt;/h2&gt;

&lt;p&gt;Once you know the severity and exploit status, act in this order — don't skip straight to deleting things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;If a patched version exists:&lt;/strong&gt; update the plugin immediately. This fixes the overwhelming majority of these alerts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If no patch exists yet and the flaw is severe (RCE, SQLi, auth bypass):&lt;/strong&gt; deactivate the plugin until a fix ships. A deactivated plugin's vulnerable code doesn't run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If the plugin is abandoned&lt;/strong&gt; (no update in 2+ years, removed from the WordPress.org directory): replace it with an actively maintained alternative that covers the same feature — don't wait for a patch that isn't coming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it's low severity and unexploited&lt;/strong&gt; (e.g., a minor XSS needing a rare, non-default setting): schedule the update in your normal maintenance window rather than treating it as a fire drill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Either way, check for signs of prior compromise&lt;/strong&gt; before you consider the matter closed — a patch fixes the door, not anything that already walked through it. Look for unfamiliar admin users, new files in &lt;code&gt;wp-content/uploads&lt;/code&gt; with &lt;code&gt;.php&lt;/code&gt; extensions, and unexpected scheduled tasks (WP-Cron entries) you didn't create.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Triage priority: what to fix first
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Patch available, no signs of exploitation&lt;/td&gt;
&lt;td&gt;High, but routine&lt;/td&gt;
&lt;td&gt;Update now, monitor for 48 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No patch yet, listed in CISA KEV or "actively exploited"&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;Deactivate plugin immediately, update the moment a fix ships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No patch yet, low severity, requires admin access&lt;/td&gt;
&lt;td&gt;Low-medium&lt;/td&gt;
&lt;td&gt;Restrict admin accounts, update on next release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin abandoned / removed from directory&lt;/td&gt;
&lt;td&gt;High (long-term risk)&lt;/td&gt;
&lt;td&gt;Replace plugin now, don't wait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You see unfamiliar admin users or unknown PHP files already&lt;/td&gt;
&lt;td&gt;Emergency&lt;/td&gt;
&lt;td&gt;Stop triage — this is likely a live incident&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row matters: if you find evidence the site is already compromised, this stops being a "which vulnerability do I patch first" question and becomes incident response. Our guide on &lt;a href="https://bugcircuit.com/website-hacked" rel="noopener noreferrer"&gt;what to do when your website's been hacked&lt;/a&gt; walks through containment and cleanup in that scenario.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is this a false positive? A quick gut-check
&lt;/h2&gt;

&lt;p&gt;Run through this checklist before assuming the worst:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Installed plugin version is older than the changelog's "fixed in" version&lt;/li&gt;
&lt;li&gt;[ ] The vulnerability type actually applies to how you use the plugin (e.g., a flaw in a contact-form add-on you never enabled doesn't apply to you)&lt;/li&gt;
&lt;li&gt;[ ] The scanner ran against your live site, not a stale cache or staging copy&lt;/li&gt;
&lt;li&gt;[ ] You've cross-checked the CVE on the &lt;a href="https://nvd.nist.gov/" rel="noopener noreferrer"&gt;NVD&lt;/a&gt; and it matches your plugin name and version range exactly (some scanners mismatch similarly-named plugins)&lt;/li&gt;
&lt;li&gt;[ ] The exploit requires a role or setting you don't have (e.g., "requires contributor-level access" on a site where only you and one trusted editor have accounts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If several of these are true, it's reasonable to treat this as low urgency rather than an emergency — but still fix it during normal maintenance rather than ignoring it indefinitely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why automated scanners can't give you the full picture
&lt;/h2&gt;

&lt;p&gt;Automated tools are genuinely useful for exactly what they do: catching known, published CVEs by matching version numbers. What they can't do is confirm whether the vulnerable code path is actually reachable on your specific setup, whether your site has already been probed or compromised through it, or whether a &lt;em&gt;different&lt;/em&gt;, undisclosed issue exists that no database has caught yet. The &lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;OWASP Top 10&lt;/a&gt; explicitly separates "known vulnerable components" from the broader picture of exploitable weaknesses — a scanner covers one slice of that list.&lt;/p&gt;

&lt;p&gt;That's the real difference between an automated scan and a manual review: a person can look at your actual site, confirm exploitability instead of guessing from a version string, and check the rest of the site the scanner didn't touch. Our breakdown of &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual vs. automated penetration testing&lt;/a&gt; covers where each approach falls short. If you want a free starting point before paying for anything, our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; and &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;security headers checker&lt;/a&gt; will tell you where else you're exposed at no cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A scanner flag is a version match, not proof you've been hacked — confirm your installed version against the plugin's changelog before reacting.&lt;/li&gt;
&lt;li&gt;Check the CVE on the &lt;a href="https://nvd.nist.gov/" rel="noopener noreferrer"&gt;NVD&lt;/a&gt; and cross-reference &lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog" rel="noopener noreferrer"&gt;CISA's KEV catalog&lt;/a&gt; to see if it's actively exploited, not just theoretically possible.&lt;/li&gt;
&lt;li&gt;Update first if a patch exists; deactivate immediately only for severe, unpatched, actively-exploited flaws.&lt;/li&gt;
&lt;li&gt;Always check for signs of prior compromise (new admin users, unfamiliar PHP files, odd cron jobs) — patching doesn't undo an existing breach.&lt;/li&gt;
&lt;li&gt;If you're unsure whether you're reading the report correctly, or the site handles customer data or logins, a second set of human eyes is worth it before you decide "false positive" on your own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want that second set of eyes, &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit&lt;/a&gt; is a $49 one-time manual audit — a real person confirms whether this specific finding (and anything the scanner missed) is actually exploitable on your site, with exact fixes. No subscription, no upsell pressure — just a straight answer on whether you need to act today or can relax.&lt;/p&gt;

</description>
      <category>wordpresssecurity</category>
      <category>wpscan</category>
      <category>wordfence</category>
      <category>vulnerabilitytriage</category>
    </item>
    <item>
      <title>WordPress Backup Strategy Before Disaster Strikes</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Thu, 10 Sep 2026 17:13:48 +0000</pubDate>
      <link>https://dev.to/bugcircuit/wordpress-backup-strategy-before-disaster-strikes-47d6</link>
      <guid>https://dev.to/bugcircuit/wordpress-backup-strategy-before-disaster-strikes-47d6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/wordpress-backup-strategy-before-disaster-strikes" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Back up your WordPress site automatically at least once a day (hourly or real-time if you take orders or leads), store copies offsite in at least two separate places, and actually test a restore every few months — a backup you've never restored isn't a backup, it's a guess.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is for small business owners and site admins running WordPress — a shop, a blog, a local service site, an agency's client sites — who don't have an IT department and want a backup routine that will genuinely save them the day something goes wrong. You'll get a realistic cadence by site type, the "3-2-1" rule explained in plain terms, a short plugin comparison, and the exact steps for a disaster-recovery test you can run this month.&lt;/p&gt;

&lt;h2&gt;
  
  
  How often should you back up your WordPress site?
&lt;/h2&gt;

&lt;p&gt;The honest answer is "it depends on how much you'd lose if today's backup were the last one you ever had." Work backward from that.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site type&lt;/th&gt;
&lt;th&gt;Backup frequency&lt;/th&gt;
&lt;th&gt;Keep how long&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Static/brochure site, rarely edited&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;4 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog or content site, posting regularly&lt;/td&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce store, bookings, or lead-gen forms&lt;/td&gt;
&lt;td&gt;Real-time or hourly&lt;/td&gt;
&lt;td&gt;30–90 days, plus a few monthly archives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Site under active development&lt;/td&gt;
&lt;td&gt;Before every deploy, plus daily&lt;/td&gt;
&lt;td&gt;Keep at least the last 5 releases&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you can't answer "what changed on my site since the last backup?" without checking, you're backing up too rarely. For a store taking orders all day, losing 24 hours of data means losing 24 hours of orders and customer records — that's the real cost, not an abstraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I need offsite backups?
&lt;/h2&gt;

&lt;p&gt;Yes — a backup stored only on the same server as your live site isn't a real backup. If your host has an outage, your hosting account gets suspended, or an attacker gets into your WordPress admin, a local backup sitting in the same environment can be deleted, encrypted, or corrupted right along with everything else.&lt;/p&gt;

&lt;p&gt;The U.S. Cybersecurity and Infrastructure Security Agency (CISA) makes this explicit in its ransomware guidance: organizations should "maintain offline, encrypted backups of data and regularly test your backups," specifically because attackers who get administrative access will look for and destroy backups they can reach (&lt;a href="https://www.cisa.gov/stopransomware/ransomware-guide" rel="noopener noreferrer"&gt;CISA #StopRansomware Guide&lt;/a&gt;). WordPress.org's own backup documentation makes the same point for site owners specifically — backups should live somewhere separate from the hosting account they protect (&lt;a href="https://wordpress.org/support/article/wordpress-backups/" rel="noopener noreferrer"&gt;WordPress.org: WordPress Backups&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;"Offsite" in practice means cloud storage that isn't tied to your hosting login — Dropbox, Google Drive, Amazon S3, or a backup service's own storage. Most backup plugins can push there automatically, so this isn't a manual chore once it's set up correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3-2-1 rule, adapted for WordPress
&lt;/h2&gt;

&lt;p&gt;CISA's data backup guidance popularized the 3-2-1 rule, and it maps cleanly onto a WordPress site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3 copies&lt;/strong&gt; of your data — the live site, plus at least two backups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 different storage types or locations&lt;/strong&gt; — e.g., your host's built-in backup &lt;em&gt;and&lt;/em&gt; a separate cloud storage account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 copy offsite&lt;/strong&gt; — physically and logically separate from your hosting account, so a compromised host or hosting login can't take it out too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most small WordPress sites, a workable version looks like: your host's daily snapshot (convenient, fast to restore, but tied to your hosting account) + a backup plugin pushing a second copy to Dropbox or S3 on its own schedule, using its own login credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a disaster recovery plan for a small WordPress business
&lt;/h2&gt;

&lt;p&gt;A "disaster recovery plan" sounds like something only enterprises need, but for a small site it can be one page. NIST's contingency planning guidance frames it as answering four questions before you need the answers under pressure (&lt;a href="https://csrc.nist.gov/pubs/sp/800/34/r1/final" rel="noopener noreferrer"&gt;NIST SP 800-34: Contingency Planning Guide&lt;/a&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What are we protecting?&lt;/strong&gt; List the site's database, uploads/media folder, theme, plugins, and any files outside the CMS (invoices, exported leads, custom scripts).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where do backups live, and who can reach them?&lt;/strong&gt; Write down the storage location and who has the login — not just "the plugin handles it."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who restores it, and how?&lt;/strong&gt; Name a person (even if it's just you) and write the restore steps, including your host's support phone number or chat link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How long can the site be down, and how much data can you afford to lose?&lt;/strong&gt; These are two different numbers — recovery time and recovery point — and they should drive your backup frequency from the table above.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Put this on a single page in a shared doc. If you ever get hacked, you will not want to be researching your own backup setup while the site is down — check out this walkthrough on &lt;a href="https://bugcircuit.com/website-hacked" rel="noopener noreferrer"&gt;what actually happens (and what it costs) when a website gets hacked&lt;/a&gt; for a sense of how fast that clock runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a real disaster-recovery test looks like
&lt;/h2&gt;

&lt;p&gt;A backup file sitting in cloud storage tells you it exists — it doesn't tell you it works. Untested backups fail silently: a missing database table, an expired storage API key, a backup that only captured files and not the database (or vice versa). Test the restore, not just the backup job.&lt;/p&gt;

&lt;p&gt;Here's a test you can run in under an hour, ideally every quarter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spin up a throwaway environment.&lt;/strong&gt; Use a local tool like LocalWP, a free subdomain, or your host's built-in staging feature — never test a restore on your live site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull your most recent offsite backup&lt;/strong&gt;, not a fresh one — you want to know the backup you'd actually reach for in a real incident is good.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restore both pieces&lt;/strong&gt;: the database (via your plugin's restore button, or &lt;code&gt;wp db import backup.sql&lt;/code&gt; with WP-CLI) and the files (theme, plugins, uploads).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log in and check the details&lt;/strong&gt;: does the homepage load without errors? Can you log into wp-admin? Are the last few orders, posts, or form submissions actually there?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time it.&lt;/strong&gt; Write down how long the whole restore took — that's your real recovery time, not the number on the plugin's marketing page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix what broke&lt;/strong&gt;, then repeat the test next quarter. A DR plan that's never been rehearsed is a guess wearing a plan's clothing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Backup plugin options compared
&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;Offsite storage&lt;/th&gt;
&lt;th&gt;Automatic schedule&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UpdraftPlus&lt;/td&gt;
&lt;td&gt;Yes (free tier: Dropbox, Google Drive, S3, etc.)&lt;/td&gt;
&lt;td&gt;Yes, on a schedule you set&lt;/td&gt;
&lt;td&gt;Budget-friendly sites wanting real offsite storage without a subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jetpack VaultPress Backup&lt;/td&gt;
&lt;td&gt;Yes, built-in (paid)&lt;/td&gt;
&lt;td&gt;Real-time, as changes happen&lt;/td&gt;
&lt;td&gt;WooCommerce stores where losing even an hour of orders matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BlogVault&lt;/td&gt;
&lt;td&gt;Yes, built-in (paid)&lt;/td&gt;
&lt;td&gt;Real-time or daily&lt;/td&gt;
&lt;td&gt;Agencies managing several client sites from one dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicator&lt;/td&gt;
&lt;td&gt;Manual export to your own storage&lt;/td&gt;
&lt;td&gt;Manual on the free version; scheduled on Pro&lt;/td&gt;
&lt;td&gt;One-off migrations and snapshots before a big change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-level backups (managed WordPress hosts)&lt;/td&gt;
&lt;td&gt;Usually tied to the host's own storage&lt;/td&gt;
&lt;td&gt;Yes, daily&lt;/td&gt;
&lt;td&gt;A second layer — pair with a plugin backup for true offsite redundancy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these is "set and forget forever." Whichever you choose, put the quarterly restore test in a calendar reminder — that's the step people skip, and it's the one that actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Match backup frequency to how much data you'd lose: weekly for a static site, daily for a blog, real-time or hourly for a store or lead-gen site.&lt;/li&gt;
&lt;li&gt;A backup stored only on your hosting account isn't offsite — use the 3-2-1 rule: 3 copies, 2 storage types, 1 copy offsite.&lt;/li&gt;
&lt;li&gt;Write your disaster recovery plan down as one page: what's backed up, where it lives, who restores it, and your acceptable downtime.&lt;/li&gt;
&lt;li&gt;Test a full restore in a staging environment at least quarterly — an untested backup can fail exactly when you need it.&lt;/li&gt;
&lt;li&gt;Backups protect your data after an incident; they don't stop the incident. Pair a solid backup routine with a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive security check&lt;/a&gt; or a &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;manual audit&lt;/a&gt; to catch the vulnerability before it's used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backups are your insurance policy — they won't tell you &lt;em&gt;how&lt;/em&gt; someone could get in. If you want that answer, Bug Circuit's &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit audit&lt;/a&gt; is a real person manually reviewing your WordPress site for $49, with a written report of every issue found, severity, and the exact fix. It's not a substitute for backups, and it's not a compliance certification — it's the honest next step once your safety net is actually in place.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>backups</category>
      <category>disasterrecovery</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Best Free WordPress 2FA Plugin &amp; Setup Guide</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Tue, 08 Sep 2026 23:13:08 +0000</pubDate>
      <link>https://dev.to/bugcircuit/best-free-wordpress-2fa-plugin-setup-guide-3naa</link>
      <guid>https://dev.to/bugcircuit/best-free-wordpress-2fa-plugin-setup-guide-3naa</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/best-free-wordpress-2fa-plugin-setup-guide" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best way to add 2FA to WordPress is a free, purpose-built plugin — the community-maintained "Two-Factor" plugin or Melapress's "WP 2FA" — set up to offer both an authenticator app &lt;em&gt;and&lt;/em&gt; a no-app fallback like email codes or printed backup codes, so every staff member can actually use it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is for you if someone (a client, a security audit, or your own gut) told you to "just turn on 2FA" and you're not sure which plugin to trust, whether you need a fancy authenticator app, or how to set it up without locking your bookkeeper or shop manager out of the site. By the end you'll have a plugin picked, a login protected in under 10 minutes, and a backup option for people who don't want to install anything on their phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 2FA actually does (in plain English)
&lt;/h2&gt;

&lt;p&gt;Two-factor authentication (2FA) means logging in needs two things: something you know (your password) and something you have (a code from your phone, an email, or a physical key). If a hacker steals or guesses your password — which happens constantly through phishing emails and reused passwords from other data breaches — 2FA stops them cold because they don't have the second piece.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cisa.gov/secure-our-world/turn-on-multifactor-authentication" rel="noopener noreferrer"&gt;CISA&lt;/a&gt;, the U.S. government's cybersecurity agency, and &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Multifactor_Authentication_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP&lt;/a&gt;, the nonprofit that writes the standard reference guides for web security, both list multi-factor authentication as one of the highest-value, lowest-cost defenses any website can add. Neither claims it makes a site "unhackable" — it doesn't stop a vulnerable plugin from being exploited or a server from being misconfigured — but it closes off the single most common way WordPress admin accounts get taken over: a stolen or guessed password.&lt;/p&gt;

&lt;h2&gt;
  
  
  The best free WordPress 2FA plugins
&lt;/h2&gt;

&lt;p&gt;You don't need a paid tool to do this properly. Here's how the three most-installed free options compare:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Authenticator app (TOTP)&lt;/th&gt;
&lt;th&gt;No-app option&lt;/th&gt;
&lt;th&gt;Enforce for other users&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Two-Factor&lt;/strong&gt; (WordPress core contributor team)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes — email code, printed backup codes&lt;/td&gt;
&lt;td&gt;Basic, per-user opt-in&lt;/td&gt;
&lt;td&gt;Simplest setup, zero upsells, built by the people who maintain WordPress core&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;WP 2FA&lt;/strong&gt; (Melapress)&lt;/td&gt;
&lt;td&gt;Free (Pro adds SMS/Duo/policy reporting)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Backup codes&lt;/td&gt;
&lt;td&gt;Yes — can force specific roles (e.g., all Editors and Admins) to set it up within a grace period&lt;/td&gt;
&lt;td&gt;Agencies and site owners managing several staff logins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wordfence Login Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Backup codes&lt;/td&gt;
&lt;td&gt;Yes — can require it per role&lt;/td&gt;
&lt;td&gt;Sites already running the Wordfence firewall plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three are actively maintained, have no ads, and are available directly from the official WordPress plugin directory — always install from there or your dashboard's Plugins → Add New search, never from a random download link.&lt;/p&gt;

&lt;p&gt;If you're picking one thing: install &lt;strong&gt;Two-Factor&lt;/strong&gt; for a single-admin site, or &lt;strong&gt;WP 2FA&lt;/strong&gt; if you have several staff accounts and want to force everyone to set it up rather than hoping they will.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to add two-factor authentication to WordPress (step by step)
&lt;/h2&gt;

&lt;p&gt;Using the &lt;strong&gt;Two-Factor&lt;/strong&gt; plugin as the example — the steps are nearly identical in WP 2FA and Wordfence Login Security:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your WordPress dashboard, go to &lt;strong&gt;Plugins → Add New Plugin&lt;/strong&gt;, search "Two-Factor," and click &lt;strong&gt;Install Now&lt;/strong&gt;, then &lt;strong&gt;Activate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Users → Profile&lt;/strong&gt; (or &lt;strong&gt;Users → All Users&lt;/strong&gt; and edit a specific person's account).&lt;/li&gt;
&lt;li&gt;Scroll to the &lt;strong&gt;Two-Factor Options&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Pick a primary method:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authenticator App (TOTP)&lt;/strong&gt; — scan the QR code with Google Authenticator, Authy, or Apple's built-in Passwords app, then enter the 6-digit code it shows to confirm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt; — codes are sent to the account's email address at login; no app needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup Verification Codes&lt;/strong&gt; — a set of one-time codes you print or save somewhere safe, for when you're offline or your phone is dead.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Update Profile&lt;/strong&gt; to save.&lt;/li&gt;
&lt;li&gt;Log out and log back in to confirm the second step actually appears — don't skip this test.&lt;/li&gt;
&lt;li&gt;Repeat for every account with Administrator or Editor access. A site is only as protected as its least-secured login.&lt;/li&gt;
&lt;li&gt;If you're using WP 2FA instead, go to &lt;strong&gt;WP 2FA → Settings → 2FA Policy&lt;/strong&gt; and set which roles must enable it and how many days they have (7 is reasonable) — the plugin will nag them with an on-screen notice until they comply.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Want to check your login page's other defenses at the same time? Run it through our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; — it flags exposed login pages, missing security headers, and other quick wins alongside 2FA.&lt;/p&gt;

&lt;h2&gt;
  
  
  2FA without an authenticator app: real options for non-technical staff
&lt;/h2&gt;

&lt;p&gt;Not everyone wants to install Google Authenticator, and that's fine — it isn't the only valid form of 2FA:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email one-time codes.&lt;/strong&gt; The plugin emails a 6-digit code at login. Nothing to install; works on any device that can check email. Slightly weaker than an app (if someone's email is also compromised, this layer is bypassed too), but far better than a password alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup/recovery codes.&lt;/strong&gt; A printed list of one-time-use codes, generated once and kept in a drawer or password manager. Good as a fallback for anyone, not just a primary method.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passkeys or security keys (WebAuthn).&lt;/strong&gt; Newer and app-free — the person taps a fingerprint reader, Face ID, or a physical USB key (like a YubiKey) instead of typing a code. The Two-Factor plugin supports FIDO U2F/WebAuthn keys if you want to go this route later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMS text codes.&lt;/strong&gt; Some paid add-ons offer this. It works without an app, but SMS can be intercepted via SIM-swapping, so OWASP specifically recommends against relying on it as your only method — treat it as a last resort, not a first choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a small team where one person genuinely won't use an app, email-based 2FA on the Two-Factor plugin is the pragmatic answer: it takes zero setup on their end beyond clicking "yes, that's my code."&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist: is your 2FA setup actually protecting you?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] 2FA is enabled on &lt;strong&gt;every&lt;/strong&gt; Administrator and Editor account, not just the main owner login&lt;/li&gt;
&lt;li&gt;[ ] At least one backup method (backup codes or email) is set up per person, so nobody gets permanently locked out&lt;/li&gt;
&lt;li&gt;[ ] You tested logging out and back in to confirm the code prompt actually shows up&lt;/li&gt;
&lt;li&gt;[ ] Your WordPress admin username isn't literally "admin" (a leftover default that pairs badly with any login weakness)&lt;/li&gt;
&lt;li&gt;[ ] You're still using unique, strong passwords — 2FA is a second layer, not a replacement for &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;good password hygiene&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Security headers and other basic hardening are in place — check with our &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;security headers tool&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What 2FA won't fix
&lt;/h2&gt;

&lt;p&gt;2FA protects the login form. It does nothing for a vulnerable plugin, an outdated theme, a leaked database, or a misconfigured file permission — the kinds of issues that show up in most real WordPress compromises. If an audit or a client security questionnaire told you to "add 2FA," treat it as one item on a longer list, not the whole job. A proper site review looks at plugins, user roles, backups, and server configuration too — the difference between that kind of manual check and an automated scanner is explained in our guide to &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual vs. automated penetration testing&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install a free, official plugin — &lt;strong&gt;Two-Factor&lt;/strong&gt; for simplicity, &lt;strong&gt;WP 2FA&lt;/strong&gt; if you need to enforce it across staff — directly from the WordPress plugin directory.&lt;/li&gt;
&lt;li&gt;You don't need an authenticator app: email codes and printed backup codes are legitimate no-app 2FA options for less technical team members.&lt;/li&gt;
&lt;li&gt;Turn it on for every Admin and Editor account, not just yours, and always set up a backup method so no one gets locked out.&lt;/li&gt;
&lt;li&gt;2FA stops stolen or guessed passwords from being enough to break in, but it doesn't patch vulnerable plugins or fix server misconfigurations — it's one layer, not the whole defense.&lt;/li&gt;
&lt;li&gt;Avoid SMS-only 2FA as your primary method if you have a choice; it's better than nothing but weaker than an app, email, or security key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2FA is a genuinely good half-hour of work, and now you can do it yourself for free. If you want to know what else on your site actually needs fixing — plugins, headers, exposed files, the stuff a checklist alone won't catch — a real person can manually audit your whole site for $49 and hand you a plain-English report with exact fixes. See what's included on our &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, no pressure either way.&lt;/p&gt;

</description>
      <category>wordpresssecurity</category>
      <category>2fa</category>
      <category>twofactorauthentication</category>
      <category>wordpressplugins</category>
    </item>
    <item>
      <title>Stop WordPress Login Brute-Force Attacks</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Sun, 06 Sep 2026 17:13:55 +0000</pubDate>
      <link>https://dev.to/bugcircuit/stop-wordpress-login-brute-force-attacks-56ei</link>
      <guid>https://dev.to/bugcircuit/stop-wordpress-login-brute-force-attacks-56ei</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/stop-wordpress-login-brute-force-attacks" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fastest fix is to install a login-limiting plugin (like Limit Login Attempts Reloaded) set to lock out an IP after 3-5 failed tries, then add a firewall or &lt;code&gt;.htaccess&lt;/code&gt; rule to block the worst offending IPs outright.&lt;/strong&gt; That stops the automated password-guessing script without you touching a single line of PHP.&lt;/p&gt;

&lt;p&gt;This guide is for WordPress site owners who are getting a stream of "failed login" emails, noticed &lt;code&gt;wp-login.php&lt;/code&gt; in their server logs getting hammered, or just want to lock the front door before it becomes a problem. By the end you'll know exactly which setting to change, which plugin to install, and how to tell WordPress to stop even answering the door for bots.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to tell it's actually a brute-force attack
&lt;/h2&gt;

&lt;p&gt;A brute-force attack is simply a script trying username/password combinations over and over, fast, hoping one works. You'll usually spot it through one or more of these signs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeated "failed login attempt" emails, often several a minute, sometimes for usernames like &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;administrator&lt;/code&gt;, or your site name.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/wp-login.php&lt;/code&gt; or &lt;code&gt;/xmlrpc.php&lt;/code&gt; showing up dozens or hundreds of times in your server's access log within a short window, often from different IPs.&lt;/li&gt;
&lt;li&gt;The admin login page feels slow to load, or your host's CPU/resource usage graph spikes for no reason you can explain.&lt;/li&gt;
&lt;li&gt;A hosting or security-plugin alert naming "brute force" or "credential stuffing" (the same technique, but using stolen username/password pairs instead of random guesses — &lt;a href="https://owasp.org/www-community/attacks/Brute_force_attack" rel="noopener noreferrer"&gt;OWASP explains the distinction&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're not sure whether what you're seeing is normal background noise or a real attack, our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; will scan for exposed login endpoints and obvious weaknesses at no cost — no card, no login required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WordPress logins get targeted so often
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;wp-login.php&lt;/code&gt; is at a predictable URL on every default WordPress install, and &lt;code&gt;xmlrpc.php&lt;/code&gt; (WordPress's legacy remote-publishing API) can be abused to test hundreds of password guesses in a single HTTP request. Automated bots crawl the web for exactly these two paths and throw lists of common passwords at them — this is listed by OWASP as one of the &lt;a href="https://owasp.org/www-project-automated-threats-to-web-applications/" rel="noopener noreferrer"&gt;Automated Threats to Web Applications&lt;/a&gt; (Credential Cracking, OAT-007). It's not personal, and it doesn't mean your site was specifically chosen — it's the same script hitting millions of sites, yours included, because the door is in the same place on every WordPress install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Limit login attempts (do this first)
&lt;/h2&gt;

&lt;p&gt;This is the single highest-value fix, and it takes about ten minutes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your WordPress dashboard, go to &lt;strong&gt;Plugins → Add New&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for and install &lt;strong&gt;Limit Login Attempts Reloaded&lt;/strong&gt; (a free, actively maintained plugin — see its &lt;a href="https://wordpress.org/plugins/limit-login-attempts-reloaded/" rel="noopener noreferrer"&gt;wordpress.org listing&lt;/a&gt;). WP Cerber and Wordfence's brute-force protection also work well if you want a plugin that bundles other security features.&lt;/li&gt;
&lt;li&gt;Activate it, then go to &lt;strong&gt;Settings → Limit Login Attempts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Allowed retries:&lt;/strong&gt; 3-4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lockout time:&lt;/strong&gt; 20-60 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Increase lockout after repeated lockouts:&lt;/strong&gt; on (this turns short bans into long ones for persistent attackers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Turn on email notifications so you get one summary alert per lockout period, not one per attempt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This alone won't stop determined attackers, but it kills the noise from unsophisticated bots almost immediately and buys you time to add the stronger layers below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Turn on two-factor authentication
&lt;/h2&gt;

&lt;p&gt;Even a perfectly guessed password is useless to an attacker if they also need a rotating six-digit code from your phone. The &lt;a href="https://www.cisa.gov/MFA" rel="noopener noreferrer"&gt;Cybersecurity and Infrastructure Security Agency (CISA) recommends multi-factor authentication&lt;/a&gt; as one of the highest-impact, lowest-cost defenses against account takeover, and it fully neutralizes brute-force attacks on your admin account specifically.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install &lt;strong&gt;Wordfence&lt;/strong&gt; or &lt;strong&gt;WP 2FA&lt;/strong&gt; (both free).&lt;/li&gt;
&lt;li&gt;Require it for every account with an Administrator or Editor role — attackers don't need your account, just any account with publishing or plugin access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Block the attackers, not just the attempts
&lt;/h2&gt;

&lt;p&gt;Limiting attempts slows a script down; blocking its IP address stops it cold. You have three realistic options, in order of effort:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Blocks attacker before WordPress loads?&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Plugin lockout list (from Step 1)&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;No — WordPress still processes each request&lt;/td&gt;
&lt;td&gt;Small sites, low attack volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.htaccess&lt;/code&gt; deny rule for repeat-offender IPs&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Sites on Apache with a fixed list of bad IPs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Application Firewall (Cloudflare, Sucuri, host-level WAF)&lt;/td&gt;
&lt;td&gt;Low-Medium&lt;/td&gt;
&lt;td&gt;Yes, at the network edge&lt;/td&gt;
&lt;td&gt;Any site getting sustained or shifting-IP attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;To block a specific IP via &lt;code&gt;.htaccess&lt;/code&gt;&lt;/strong&gt; (place near the top of the file in your site root):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;RequireAll&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; granted
    &lt;span class="nc"&gt;Require&lt;/span&gt; not ip 203.0.113.45
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;RequireAll&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;203.0.113.45&lt;/code&gt; with the offending IP from your logs. Repeat the &lt;code&gt;Require not ip&lt;/code&gt; line for each address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a firewall-level fix&lt;/strong&gt; (recommended if attacks are ongoing rather than a one-off), turn on a WAF like Cloudflare's free tier or your host's built-in firewall, and add a rate-limiting rule for &lt;code&gt;/wp-login.php&lt;/code&gt; and &lt;code&gt;/xmlrpc.php&lt;/code&gt; — e.g., "block for 1 hour if more than 5 requests to these paths in 1 minute from the same IP." This stops the request before it ever reaches your server, which also saves you hosting resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Reduce what attackers can even reach
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disable XML-RPC&lt;/strong&gt; if you don't use the WordPress mobile app or Jetpack (which rely on it). Most security plugins have a one-click toggle; otherwise your host or a plugin like Disable XML-RPC can block the endpoint entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change the login URL&lt;/strong&gt; away from the default &lt;code&gt;/wp-login.php&lt;/code&gt; using a plugin like WPS Hide Login. This isn't real security on its own (it's "security through obscurity"), but it removes your site from the pool of URLs that generic bots scan automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restrict wp-admin by IP&lt;/strong&gt; if you or your team always log in from the same office or VPN IP — add an IP allowlist at the server or firewall level.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What not to rely on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A "strong password" alone.&lt;/strong&gt; It helps, but a brute-force script doesn't get tired — pair it with 2FA and a lockout policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renaming the login URL as your only defense.&lt;/strong&gt; It reduces noise, not risk, if XML-RPC and REST API user-enumeration endpoints are still open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A CAPTCHA with no rate limiting behind it.&lt;/strong&gt; Some bots solve CAPTCHAs via cheap human-solving services; it should be one layer, not the whole strategy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Login-limiting plugin installed, set to lock after 3-4 tries&lt;/li&gt;
&lt;li&gt;[ ] Two-factor authentication required for all Admin/Editor accounts&lt;/li&gt;
&lt;li&gt;[ ] Repeat-offender IPs blocked at &lt;code&gt;.htaccess&lt;/code&gt; or firewall level&lt;/li&gt;
&lt;li&gt;[ ] XML-RPC disabled (unless actively used)&lt;/li&gt;
&lt;li&gt;[ ] WAF or host-level rate limiting on &lt;code&gt;/wp-login.php&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Default &lt;code&gt;admin&lt;/code&gt; username removed or renamed if still in use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're not sure your fixes actually closed the gap — or you want someone to check the rest of the site while they're in there — a &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual security audit&lt;/a&gt; catches things automated scanners and default plugin settings miss, like leftover admin accounts or a misconfigured REST API still leaking usernames.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repeated failed-login emails and &lt;code&gt;wp-login.php&lt;/code&gt; spikes in your logs mean an automated brute-force script has found your login page — this is extremely common and not a sign you've been personally targeted.&lt;/li&gt;
&lt;li&gt;Install a login-limiting plugin (Limit Login Attempts Reloaded, WP Cerber, or Wordfence) and cap failed attempts at 3-4 before a lockout.&lt;/li&gt;
&lt;li&gt;Two-factor authentication neutralizes brute-force attacks on your account even if a password is guessed correctly.&lt;/li&gt;
&lt;li&gt;Block repeat-offender IPs at the &lt;code&gt;.htaccess&lt;/code&gt; or firewall level, and rate-limit &lt;code&gt;/wp-login.php&lt;/code&gt; and &lt;code&gt;/xmlrpc.php&lt;/code&gt; for lasting protection.&lt;/li&gt;
&lt;li&gt;Disabling XML-RPC and hiding the default login URL cut down the noise but should back up the layers above, not replace them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is complicated once it's set up, but it's easy to miss one open door — an old plugin, a forgotten admin account, an XML-RPC endpoint nobody remembered was on. If you want a second set of eyes, &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit&lt;/a&gt; is a $49 one-time manual audit where a real security engineer checks your whole site, not just the login page, and hands you a plain-English report of anything else worth fixing.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>bruteforce</category>
      <category>loginsecurity</category>
      <category>wploginphp</category>
    </item>
    <item>
      <title>GDPR for Small Websites: No-Legalese Checklist</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 04 Sep 2026 05:13:30 +0000</pubDate>
      <link>https://dev.to/bugcircuit/gdpr-for-small-websites-no-legalese-checklist-223b</link>
      <guid>https://dev.to/bugcircuit/gdpr-for-small-websites-no-legalese-checklist-223b</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/gdpr-for-small-websites-no-legalese-checklist" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your website has visitors, a contact form, or even just Google Analytics, and any of them could be in the EU or UK, GDPR applies to you — no matter how small your business is or where you're based.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Who this is for: small business owners, indie SaaS founders, and agencies running a marketing site, online store, or app with a contact form, newsletter signup, or login. What you'll get: a plain-English rundown of the four things that actually matter — cookies, your privacy policy, how you handle form data, and the security duty (Article 32) almost nobody reads — plus a one-page checklist you can work through in an afternoon.&lt;/p&gt;

&lt;p&gt;This isn't legal advice — enforcement depends on your specific data flows, and a lawyer should sign off on anything customer-facing. But most small sites get compliance wrong in the same handful of predictable ways, and those are fixable without a law degree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does GDPR actually apply to your website?
&lt;/h2&gt;

&lt;p&gt;GDPR (General Data Protection Regulation) is EU law, but it reaches well outside the EU. It applies to you if either is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're based in the EU/UK, regardless of who visits your site, or&lt;/li&gt;
&lt;li&gt;You're based anywhere else, but you offer goods or services to people in the EU/UK, or you monitor their behavior (analytics, ad tracking, cookies) — even if you never make a sale there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice: if your contact form, newsletter, or checkout could realistically be used by someone in Europe, GDPR applies. "We don't think we have EU visitors" stops being a defense the moment you check your analytics and find you do.&lt;/p&gt;

&lt;p&gt;The UK runs a near-identical "UK GDPR" post-Brexit, enforced by the ICO — everything below applies to both. Source: &lt;a href="https://ico.org.uk/for-organisations/advice-for-small-organisations/" rel="noopener noreferrer"&gt;ICO guidance for small organisations&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cookie banner: what you actually need
&lt;/h2&gt;

&lt;p&gt;The banner requirement technically comes from the ePrivacy Directive (the "cookie law"), not GDPR itself — but GDPR defines what counts as valid consent, so regulators enforce them together. The rule is simple once you split cookies into two buckets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cookie type&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Consent needed?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strictly necessary&lt;/td&gt;
&lt;td&gt;Session ID, shopping cart, login token, load balancer, CSRF/security token&lt;/td&gt;
&lt;td&gt;No — but disclose them anyway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everything else&lt;/td&gt;
&lt;td&gt;Google Analytics, Meta Pixel, ad retargeting, A/B testing tools, embedded YouTube/social widgets&lt;/td&gt;
&lt;td&gt;Yes — prior opt-in consent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Valid consent means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Opt-in, not opt-out.&lt;/strong&gt; No pre-ticked boxes for analytics or marketing cookies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific and easy to refuse.&lt;/strong&gt; "Accept all" as the only button isn't compliant without an equally easy "reject" or "manage preferences" option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before the cookie fires&lt;/strong&gt;, not after. If Analytics loads on page load before anyone clicks anything, that's tracking without consent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As easy to withdraw as to give&lt;/strong&gt; — a "manage cookies" link in the footer, not a support ticket.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your site only uses strictly-necessary cookies, you don't need a consent banner at all — just disclose them in your privacy policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy policy checklist
&lt;/h2&gt;

&lt;p&gt;A privacy policy isn't a formality — it's the document that proves you thought about what you collect. Under GDPR Article 13, it needs to disclose, in plain language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who you are and how to contact you (business name, email, physical address if you have one)&lt;/li&gt;
&lt;li&gt;What personal data you collect (form fields, cookies, server logs, payment details)&lt;/li&gt;
&lt;li&gt;Why you collect it and your legal basis (consent, contract, legitimate interest)&lt;/li&gt;
&lt;li&gt;How long you keep it — a real retention period, not "as long as necessary"&lt;/li&gt;
&lt;li&gt;Who you share it with — email provider, payment processor, host, analytics tools&lt;/li&gt;
&lt;li&gt;Whether data leaves the EU/UK and how that transfer is protected&lt;/li&gt;
&lt;li&gt;The visitor's rights: access, correction, deletion, restriction, objection, portability&lt;/li&gt;
&lt;li&gt;Where to complain if they're unhappy — their local data protection authority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A policy copy-pasted from another site and never updated when you add a new tool (a chatbot, a new email platform) is one of the most common gaps we find during audits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contact and signup forms: collect less, store safer
&lt;/h2&gt;

&lt;p&gt;GDPR's data minimization principle (Article 5(1)(c)) says you may only collect what you actually need for the stated purpose. Source: &lt;a href="https://gdpr-info.eu/art-5-gdpr/" rel="noopener noreferrer"&gt;official GDPR text, Article 5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Practical fixes for most small-site forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop fields you don't use. A contact form asking for phone number, company size, and job title when you only ever email people back is over-collecting.&lt;/li&gt;
&lt;li&gt;Separate marketing consent from the form submission itself — an unticked "send me updates" checkbox, not a bundled agreement.&lt;/li&gt;
&lt;li&gt;Never email form submissions containing sensitive data (ID numbers, health info) in plain text — route them to an encrypted CRM or ticketing system instead.&lt;/li&gt;
&lt;li&gt;Set a real deletion schedule for old leads and abandoned carts — most email and CRM tools let you auto-purge inactive contacts.&lt;/li&gt;
&lt;li&gt;Serve every form over HTTPS. A form on an unencrypted &lt;code&gt;http://&lt;/code&gt; page is both a GDPR problem and a basic security hole.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The clause almost every small business misses: Article 32
&lt;/h2&gt;

&lt;p&gt;Most owners think GDPR is a paperwork exercise — write a policy, add a banner, done. But Article 32 ("Security of processing") is a legal obligation to actually secure the data you collect, and it's the part regulators focus on hardest after a breach. Source: &lt;a href="https://gdpr-info.eu/art-32-gdpr/" rel="noopener noreferrer"&gt;GDPR Article 32, official text&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The regulation doesn't hand you a fixed checklist — it says measures must be "appropriate" to the risk. For a small business website, that translates to a concrete list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encrypt data in transit.&lt;/strong&gt; Every page over HTTPS/TLS, not just checkout — an expired or missing certificate anywhere is a gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep software patched.&lt;/strong&gt; Outdated CMS core, plugins, or themes are the most common way small sites get breached — see &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;is my website hackable&lt;/a&gt; for how attackers actually find these.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use strong authentication on admin accounts.&lt;/strong&gt; Unique passwords plus two-factor authentication (2FA) for anyone with CMS, hosting, or database access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit who has access.&lt;/strong&gt; Not every staff member needs admin — use editor/contributor roles for people who don't manage plugins or settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back up regularly, and actually test the restore.&lt;/strong&gt; Article 32 explicitly calls out "the ability to restore availability... in a timely manner" after an incident — a backup you've never restored isn't one you can rely on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set basic security headers.&lt;/strong&gt; &lt;code&gt;Content-Security-Policy&lt;/code&gt;, &lt;code&gt;Strict-Transport-Security&lt;/code&gt;, and &lt;code&gt;X-Content-Type-Options&lt;/code&gt; cut down common attack surface — check yours free with our &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;security headers tool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test it periodically.&lt;/strong&gt; Article 32 requires "a process for regularly testing, assessing and evaluating the effectiveness" of these measures — the part a scanner alone can't fully judge, since it can't weigh context the way a person reviewing your actual site can.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what separates "we have a privacy policy" from actually meeting your GDPR security obligation — and it's the part a manual audit is built for, not a checkbox tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you have a breach: the 72-hour clock
&lt;/h2&gt;

&lt;p&gt;If personal data is exposed — a hacked database, a misconfigured form emailing submissions to the wrong place, a leaked backup — GDPR Article 33 gives you 72 hours from becoming aware of it to notify your supervisory authority, unless the breach is unlikely to risk people's rights and freedoms. If it's high-risk (passwords or financial data exposed), you may also need to tell the affected individuals directly.&lt;/p&gt;

&lt;p&gt;Fines scale with severity: up to €10 million or 2% of global annual turnover for lesser infringements, and up to €20 million or 4% for the most serious ones — whichever is higher. Source: &lt;a href="https://gdpr-info.eu/art-83-gdpr/" rel="noopener noreferrer"&gt;GDPR Article 83&lt;/a&gt;. For most small businesses, real enforcement is rare and usually follows a complaint or a breach, not a random audit — but "rare" isn't "never," and prevention is almost always cheaper than the incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  One-page GDPR checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Cookie banner blocks non-necessary cookies until opt-in consent&lt;/li&gt;
&lt;li&gt;[ ] "Reject" is as easy to click as "Accept"&lt;/li&gt;
&lt;li&gt;[ ] Privacy policy lists what you collect, why, how long, and who it's shared with&lt;/li&gt;
&lt;li&gt;[ ] Privacy policy names all third-party tools (analytics, email platform, payment processor)&lt;/li&gt;
&lt;li&gt;[ ] Contact/signup forms only ask for fields you actually use&lt;/li&gt;
&lt;li&gt;[ ] Marketing consent is a separate, unticked checkbox&lt;/li&gt;
&lt;li&gt;[ ] All forms and pages served over HTTPS&lt;/li&gt;
&lt;li&gt;[ ] CMS, plugins, and themes are up to date&lt;/li&gt;
&lt;li&gt;[ ] Admin accounts use unique passwords + 2FA&lt;/li&gt;
&lt;li&gt;[ ] Backups exist and have been test-restored in the last 6 months&lt;/li&gt;
&lt;li&gt;[ ] You know who to notify within 72 hours if data is exposed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GDPR applies based on your visitors' location, not your business's — check your analytics before assuming it doesn't apply to you.&lt;/li&gt;
&lt;li&gt;The cookie banner only needs to gate non-essential cookies (analytics, ads); strictly necessary ones just need disclosure.&lt;/li&gt;
&lt;li&gt;Your privacy policy should describe your actual current tools and data flows, not a copy-pasted template.&lt;/li&gt;
&lt;li&gt;Article 32's "appropriate technical measures" is a real security requirement — HTTPS, patching, 2FA, and tested backups — not just a legal sentence.&lt;/li&gt;
&lt;li&gt;A manual review catches the context-dependent gaps (over-collecting forms, unpatched plugins, missing headers) that automated scanners and legal templates both miss.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where a manual audit fits in
&lt;/h2&gt;

&lt;p&gt;None of this replaces legal advice on your specific data flows — but the security half of GDPR (Article 32) is exactly what a hands-on website review is built to check. Bug Circuit's &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit audit&lt;/a&gt; is $49: a real person manually reviews your site and hands you a written report with fixes, including the headers, patching, and access issues that feed straight into your GDPR security obligations. Start with our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive check&lt;/a&gt; if you just want a quick read on where you stand first.&lt;/p&gt;

</description>
      <category>gdpr</category>
      <category>privacypolicy</category>
      <category>cookieconsent</category>
      <category>dataprotection</category>
    </item>
  </channel>
</rss>
