<?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>Host Suspended Your Site for Malware? Do This</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 31 Jul 2026 02:35:33 +0000</pubDate>
      <link>https://dev.to/bugcircuit/host-suspended-your-site-for-malware-do-this-46j1</link>
      <guid>https://dev.to/bugcircuit/host-suspended-your-site-for-malware-do-this-46j1</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/host-suspended-your-site-for-malware-do-this" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your host suspended your site for malware, the fastest way back online is: get the exact scan report from your host, remove the malicious files (not just disable the infected plugin), rotate every password and secret key, update everything, run a clean third-party scan, and send your host proof of all of it before you ask for reinstatement.&lt;/strong&gt; Skipping the "proof" step is the single biggest reason sites get re-suspended within days.&lt;/p&gt;

&lt;p&gt;This is for site owners staring at a "suspended due to malicious content" email from GoDaddy, Bluehost, SiteGround, Hostinger, WP Engine, or a similar host, with no idea what to do next. By the end you'll have a step-by-step process to identify the infection, clean it properly, and get your host to turn the site back on — plus what to do so it doesn't happen again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "suspended for malware" actually means
&lt;/h2&gt;

&lt;p&gt;Hosts don't suspend sites to be difficult. Malware on your site can spam other customers' shared servers, get the host's whole IP range blocked by email providers, or trigger &lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Google Safe Browsing&lt;/a&gt; warnings that make the host's network look untrustworthy. Suspension is the host protecting its own infrastructure — your reinstatement path exists, but you have to do the cleanup, and you usually have to prove it.&lt;/p&gt;

&lt;p&gt;Common triggers: a hidden backdoor script uploaded through an outdated plugin, injected spam links or redirects, a cryptomining script, or your site being used to host a phishing page. All of these get caught the same way — by a scanner (the host's own, or Google's) flagging known malicious patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Get the exact reason from your host
&lt;/h2&gt;

&lt;p&gt;Don't start deleting files yet. Open a support ticket and ask specifically for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;scan report&lt;/strong&gt; or list of flagged files and paths&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;date/time&lt;/strong&gt; the infection was detected&lt;/li&gt;
&lt;li&gt;Whether they've already &lt;strong&gt;quarantined or restored&lt;/strong&gt; anything&lt;/li&gt;
&lt;li&gt;Their &lt;strong&gt;exact reinstatement requirements&lt;/strong&gt; (some hosts want a signed statement, some want a specific scanner's clean report, some will rescan themselves)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many hosts (GoDaddy, Bluehost/EIG-family brands, SiteGround) run automated malware scanners on shared hosting and will hand you a file list on request — this saves you hours of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Check how bad it looks from the outside
&lt;/h2&gt;

&lt;p&gt;Before touching code, check what the internet already knows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search &lt;code&gt;site:yourdomain.com&lt;/code&gt; in Google — spammy titles or foreign-language pages you didn't write are a strong signal of injected content.&lt;/li&gt;
&lt;li&gt;Check your domain's status at Google's &lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Safe Browsing site status tool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Log into &lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;Google Search Console&lt;/a&gt; and check the &lt;strong&gt;Security Issues&lt;/strong&gt; report if the site is verified — it often names the exact malware type (e.g., "injected content," "harmful downloads").&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're not sure whether the site is actually compromised or just misflagged, our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; can give you a quick read before you spend hours digging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Find and remove the malicious code
&lt;/h2&gt;

&lt;p&gt;This is the part people rush and get wrong. Disabling the plugin the malware came in through does &lt;strong&gt;not&lt;/strong&gt; remove a backdoor the attacker already planted elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you have a clean backup from before the infection date&lt;/strong&gt;, restoring it is usually faster and safer than manual cleanup — as long as you also patch the entry point (Step 5) before putting it back online.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you don't have a clean backup&lt;/strong&gt;, look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Obfuscated PHP: &lt;code&gt;eval(base64_decode(...))&lt;/code&gt;, &lt;code&gt;gzinflate(...)&lt;/code&gt;, &lt;code&gt;str_rot13(...)&lt;/code&gt; inside theme or plugin files that shouldn't contain them&lt;/li&gt;
&lt;li&gt;Files with recent modified dates you don't recognize, especially in &lt;code&gt;/wp-content/uploads/&lt;/code&gt; (uploads folders shouldn't contain &lt;code&gt;.php&lt;/code&gt; files at all)&lt;/li&gt;
&lt;li&gt;Extra admin accounts you didn't create (check Users in your CMS admin, or the database &lt;code&gt;wp_users&lt;/code&gt; table directly)&lt;/li&gt;
&lt;li&gt;Unfamiliar entries in &lt;code&gt;.htaccess&lt;/code&gt;, especially &lt;code&gt;RewriteCond&lt;/code&gt;/&lt;code&gt;RewriteRule&lt;/code&gt; blocks that redirect mobile visitors or search-engine bots to a different site&lt;/li&gt;
&lt;li&gt;Scheduled tasks (cron jobs) you didn't set up, in your hosting control panel or via a plugin like WP Crontrol&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare core CMS files against a fresh download of the same version — any core file that differs from the official release is suspect. Google's own &lt;a href="https://developers.google.com/search/docs/monitor-debug/security/clean-site" rel="noopener noreferrer"&gt;"Clean up your hacked site" guide&lt;/a&gt; walks through this file-by-file comparison process in more detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Lock the doors — rotate every credential
&lt;/h2&gt;

&lt;p&gt;Attackers who got in once often leave themselves a way back in. Before you reopen the site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change your &lt;strong&gt;hosting/cPanel password&lt;/strong&gt;, &lt;strong&gt;database password&lt;/strong&gt;, &lt;strong&gt;FTP/SFTP password&lt;/strong&gt;, and every &lt;strong&gt;admin account password&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Regenerate WordPress secret keys via &lt;a href="https://api.wordpress.org/secret-key/1.1/salt/" rel="noopener noreferrer"&gt;api.wordpress.org/secret-key/1.1/salt/&lt;/a&gt; and paste them into &lt;code&gt;wp-config.php&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Delete any admin user you don't recognize&lt;/li&gt;
&lt;li&gt;Revoke and reissue API keys for any connected services (payment processors, email senders, CDNs)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Update everything before you reopen
&lt;/h2&gt;

&lt;p&gt;Outdated, unpatched software is how most of these infections start — it's consistently one of the top causes tracked in the &lt;a href="https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/" rel="noopener noreferrer"&gt;OWASP Top 10&lt;/a&gt; under vulnerable and outdated components. Update your CMS core, every theme, and every plugin to their latest versions, and &lt;strong&gt;remove anything inactive&lt;/strong&gt; you're not using — an unused plugin can still be exploited even if it's switched off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Get a clean scan your host will accept
&lt;/h2&gt;

&lt;p&gt;Most hosts won't take your word for it. Run one (ideally two) of these before you file for reinstatement:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scanner&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sucuri SiteCheck (free)&lt;/td&gt;
&lt;td&gt;Quick outside-in check&lt;/td&gt;
&lt;td&gt;Scans the live site remotely, no login needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wordfence / MalCare (WordPress)&lt;/td&gt;
&lt;td&gt;Full file-system scan&lt;/td&gt;
&lt;td&gt;Checks every file against known-malware signatures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host's own scanner&lt;/td&gt;
&lt;td&gt;Reinstatement requirement&lt;/td&gt;
&lt;td&gt;Some hosts only accept their own rescan as proof&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep a screenshot or exported report of the clean result — you'll attach it to your reinstatement request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Ask for reinstatement — and prove it's clean
&lt;/h2&gt;

&lt;p&gt;Reply to your original support ticket with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What the infection was and where it was (referencing their scan report)&lt;/li&gt;
&lt;li&gt;What you removed and what you patched (be specific: "deleted &lt;code&gt;wp-content/uploads/2024/xx.php&lt;/code&gt;, updated Plugin X from 4.1 to 4.9")&lt;/li&gt;
&lt;li&gt;Your clean scan report or screenshot&lt;/li&gt;
&lt;li&gt;Confirmation that passwords and keys were rotated&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After reinstatement, if Search Console showed a Security Issues warning, submit a &lt;strong&gt;review request&lt;/strong&gt; there too — that's a separate step from your host unsuspending you, and it's what actually clears the browser warning for visitors.&lt;/p&gt;

&lt;h2&gt;
  
  
  DIY cleanup vs. professional help
&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;DIY&lt;/th&gt;
&lt;th&gt;Host's paid cleanup&lt;/th&gt;
&lt;th&gt;Manual audit ($49)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Hours to days, depends on skill&lt;/td&gt;
&lt;td&gt;Usually 24–72 hrs&lt;/td&gt;
&lt;td&gt;2–4 business days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finds the &lt;em&gt;root cause&lt;/em&gt;, not just the file&lt;/td&gt;
&lt;td&gt;Sometimes — easy to miss backdoors&lt;/td&gt;
&lt;td&gt;Varies by host&lt;/td&gt;
&lt;td&gt;Yes, plus a written report of every issue found, with fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ongoing protection&lt;/td&gt;
&lt;td&gt;You're on your own&lt;/td&gt;
&lt;td&gt;Ends after cleanup&lt;/td&gt;
&lt;td&gt;Can pair with &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Signal&lt;/a&gt; for 3 months of cover + fixes to critical issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free (your time)&lt;/td&gt;
&lt;td&gt;Often $100–$300+&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;p&gt;If you cleaned it yourself and just want a second set of eyes to confirm nothing was missed before you tell your host it's fixed, that's exactly the kind of check a manual audit is good for — it's not a substitute for the cleanup itself, but it catches what automated scanners and a rushed manual pass often miss. Compare that to a full &lt;a href="https://bugcircuit.com/guides/how-much-does-a-penetration-test-cost" rel="noopener noreferrer"&gt;penetration test cost&lt;/a&gt; if you're weighing options, and see how &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;manual review differs from automated scanning&lt;/a&gt; if you're deciding which route fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to stop this from happening again
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Turn on automatic updates for your CMS core and plugins where your host supports it&lt;/li&gt;
&lt;li&gt;Set up basic &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;security headers&lt;/a&gt; — they won't stop every attack, but they close off easy wins like clickjacking and some injection vectors&lt;/li&gt;
&lt;li&gt;Keep offsite backups on a schedule your host doesn't control, so a future infection doesn't wipe your only clean copy&lt;/li&gt;
&lt;li&gt;Run a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free security check&lt;/a&gt; periodically, and read &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;how to tell if your site is hackable&lt;/a&gt; before the next scare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For background on the general categories of attacks hosts are scanning for, CISA's &lt;a href="https://www.cisa.gov/topics/cyber-threats-and-advisories/malware-phishing-and-ransomware" rel="noopener noreferrer"&gt;malware, phishing, and ransomware overview&lt;/a&gt; is a solid plain-English primer if you want to understand the bigger picture beyond your own incident.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Get the host's exact scan report first — don't guess at what's infected&lt;/li&gt;
&lt;li&gt;A clean backup restore plus patching the entry point beats manual file-by-file removal when you have one&lt;/li&gt;
&lt;li&gt;Rotate every password and secret key, not just the CMS admin password&lt;/li&gt;
&lt;li&gt;Run a clean third-party scan and attach the report to your reinstatement request — hosts rarely reinstate on your word alone&lt;/li&gt;
&lt;li&gt;Fix the update/backup habits that let it happen, or expect a repeat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd rather have a person confirm the infection is fully gone (and check for anything else an attacker could come back through) before you go back to your host, a &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit audit&lt;/a&gt; is a $49 manual review with a written report — a second, human set of eyes on exactly this kind of situation.&lt;/p&gt;

</description>
      <category>malwareremoval</category>
      <category>websitehacked</category>
      <category>hosting</category>
      <category>incidentresponse</category>
    </item>
    <item>
      <title>Website Redirecting to Spam? How to Stop It</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 31 Jul 2026 02:29:37 +0000</pubDate>
      <link>https://dev.to/bugcircuit/website-redirecting-to-spam-how-to-stop-it-2a9l</link>
      <guid>https://dev.to/bugcircuit/website-redirecting-to-spam-how-to-stop-it-2a9l</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/website-redirecting-to-spam-how-to-stop-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 website sends visitors to a spam, scam, or gambling site, you've almost certainly been hacked — and the redirect is hiding in one of four places: your &lt;code&gt;.htaccess&lt;/code&gt; file, injected JavaScript, your WordPress database or a rogue plugin, or your DNS records.&lt;/strong&gt; The fix depends entirely on which one it is, so guessing (or just reinstalling your theme) usually doesn't work.&lt;/p&gt;

&lt;p&gt;This is for site owners — WordPress, Shopify, or a hand-built site — who've noticed weird redirects, gotten a "this site may be hacked" warning in Google, or had a customer say "your link took me somewhere sketchy." You'll get a step-by-step way to find exactly where the redirect is firing from, plus how to close it, including the sneaky version that only redirects mobile visitors or people coming from Google.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "website redirecting to another site" is almost always a hack, not a bug
&lt;/h2&gt;

&lt;p&gt;A legitimate site doesn't randomly start sending people to pill ads, fake tech-support pages, or spam text in another language. When that happens, it's almost always &lt;strong&gt;malware planted after your site, a plugin, or your hosting account got compromised&lt;/strong&gt; — commonly through a stolen FTP/hosting password, an outdated plugin with a known vulnerability, or a compromised admin account. Google's own guidance on hacked sites confirms this pattern and calls out redirect hacks specifically as a common attack type (&lt;a href="https://developers.google.com/search/docs/monitor-debug/security/hacked-overview" rel="noopener noreferrer"&gt;Google Search Central: hacked sites overview&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The attacker's goal is usually SEO spam or ad fraud: they want your site's existing traffic and search ranking to funnel visitors to their pages, without you noticing for as long as possible. That's why these redirects are almost never "always on" — they're built to hide from you, the owner, while still firing for real visitors and search engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 4 hiding spots, compared
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where it hides&lt;/th&gt;
&lt;th&gt;How it usually triggers&lt;/th&gt;
&lt;th&gt;Who notices it first&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.htaccess&lt;/code&gt; (Apache config file)&lt;/td&gt;
&lt;td&gt;Rewrite rules that check the visitor's User-Agent or Referer&lt;/td&gt;
&lt;td&gt;Google Search Console, mobile users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Injected JavaScript&lt;/td&gt;
&lt;td&gt;Obfuscated &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; in a theme file or footer that runs on page load&lt;/td&gt;
&lt;td&gt;Desktop visitors, browser warnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordPress database / rogue plugin&lt;/td&gt;
&lt;td&gt;Malicious &lt;code&gt;siteurl&lt;/code&gt;/&lt;code&gt;home&lt;/code&gt; value, or a fake plugin registering a redirect hook&lt;/td&gt;
&lt;td&gt;Everyone, all the time (often the noisiest one)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS records&lt;/td&gt;
&lt;td&gt;A/CNAME record repointed to attacker infrastructure&lt;/td&gt;
&lt;td&gt;Everyone, but looks like the "whole site is down or moved"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 1: Rule out DNS first — it's the fastest check
&lt;/h2&gt;

&lt;p&gt;Before you touch any files, confirm your domain is actually pointing at your own server. If your DNS was hijacked (usually via a compromised domain registrar or DNS provider account, not your website itself), no amount of file cleanup will fix it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;dig example.com A +short
dig example.com NS +short
whois example.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare the A record IP against the IP your host gives you in your hosting control panel. If it doesn't match, or the nameservers (NS records) aren't the ones your registrar or DNS host assigned you, your DNS has been changed — go straight to your registrar, reset that account's password, and revert the records. This is a domain-account problem, not a website problem, so cleaning WordPress won't help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Check if the redirect is conditional (mobile-only or Google-only)
&lt;/h2&gt;

&lt;p&gt;This is the step people miss. Many redirect hacks are deliberately conditional — they only fire for mobile users or for visitors arriving from a search engine, so the site owner checking it on a desktop browser sees nothing wrong. Test it the way an attacker built it to be tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Simulate a normal visit&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com

&lt;span class="c"&gt;# Simulate Googlebot&lt;/span&gt;
curl &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com

&lt;span class="c"&gt;# Simulate someone clicking through from a Google search on mobile&lt;/span&gt;
curl &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"https://www.google.com/search?q=example"&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (Linux; Android 10; Mobile)"&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at the response headers. If the Googlebot or Google-referrer request returns a &lt;code&gt;301&lt;/code&gt; or &lt;code&gt;302&lt;/code&gt; with a &lt;code&gt;Location:&lt;/code&gt; header pointing somewhere unfamiliar, but your plain request doesn't, you've confirmed a conditional redirect — and you now know it's checking User-Agent and/or Referer, which narrows the search to &lt;code&gt;.htaccess&lt;/code&gt; or JavaScript (the next two steps).&lt;/p&gt;

&lt;p&gt;Also check Google Search Console's Security Issues report (Search Console → Security &amp;amp; Manual Actions) — Google flags this exact "cloaked redirect" pattern when it crawls your site, per their &lt;a href="https://developers.google.com/search/docs/monitor-debug/security/hacked-overview" rel="noopener noreferrer"&gt;hacked-site cleanup guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Search .htaccess for User-Agent or Referer rules
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;.htaccess&lt;/code&gt; in your site's root directory (via FTP/SFTP or your host's file manager) and look for &lt;code&gt;RewriteCond&lt;/code&gt; lines referencing &lt;code&gt;HTTP_USER_AGENT&lt;/code&gt; or &lt;code&gt;HTTP_REFERER&lt;/code&gt;, especially ones mentioning "google," "bing," "yahoo," or "mobile." A legitimate rule rarely needs to check for search engine names. A malicious block often looks like this:&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="nc"&gt;RewriteCond&lt;/span&gt; %{HTTP_REFERER} google\.com [NC,OR]
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{HTTP_USER_AGENT} Mobile
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^(.*)$ http://spam-domain.example/landing.php [R=302,L]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete any block you don't recognize, save, and re-run the &lt;code&gt;curl&lt;/code&gt; tests from Step 2 to confirm it's gone. Keep a backup copy of the file before editing, in case you need to compare it later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Search for injected JavaScript
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;.htaccess&lt;/code&gt; is clean but the redirect still fires (especially only on desktop, or only after a delay), the payload is likely JavaScript stuffed into a theme file, a widget, or a compromised plugin's assets. Search your theme folder for obvious obfuscation:&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-rl&lt;/span&gt; &lt;span class="s2"&gt;"eval("&lt;/span&gt; wp-content/themes/
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rl&lt;/span&gt; &lt;span class="s2"&gt;"base64_decode&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;gzinflate&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;String.fromCharCode"&lt;/span&gt; wp-content/themes/ wp-content/plugins/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real theme code almost never uses &lt;code&gt;eval()&lt;/code&gt; combined with &lt;code&gt;base64_decode&lt;/code&gt; — that combination is a near-universal signature of injected malware, because it lets the attacker hide the real payload from casual inspection. Also check &lt;code&gt;footer.php&lt;/code&gt; and &lt;code&gt;header.php&lt;/code&gt; for &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags you didn't add. OWASP's guidance on unvalidated redirects and forwards is a good primer on why these injections work so well (&lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;OWASP Top Ten&lt;/a&gt;): browsers and users trust redirects that appear to come from a site they already trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Check the WordPress database and plugins
&lt;/h2&gt;

&lt;p&gt;If you're on WordPress, the hack often lives in the database itself, not the files. Two places to check, using WP-CLI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Site URL hijack&lt;/strong&gt; — run &lt;code&gt;wp option get siteurl&lt;/code&gt; and &lt;code&gt;wp option get home&lt;/code&gt;. If either points to a domain that isn't yours, that's your redirect source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A rogue or disguised plugin&lt;/strong&gt; — run &lt;code&gt;wp plugin list&lt;/code&gt; and look for anything you don't recognize, or a "legit-looking" plugin name you never installed. Also compare your core files against the official versions with &lt;code&gt;wp core verify-checksums&lt;/code&gt;, a built-in WP-CLI command that flags any modified core file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Malicious code also frequently gets planted directly in the &lt;code&gt;wp_posts&lt;/code&gt; or &lt;code&gt;wp_options&lt;/code&gt; table as a serialized PHP snippet that runs on &lt;code&gt;init&lt;/code&gt;. This is harder to spot by eye than a file, which is one reason a manual, human-led review tends to catch what a quick automated scan misses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix checklist, in order
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Confirm DNS A/NS records match your actual host (Step 1)&lt;/li&gt;
&lt;li&gt;[ ] Test with &lt;code&gt;curl&lt;/code&gt; using Googlebot and mobile User-Agents to catch conditional redirects (Step 2)&lt;/li&gt;
&lt;li&gt;[ ] Remove suspicious &lt;code&gt;RewriteCond&lt;/code&gt;/&lt;code&gt;RewriteRule&lt;/code&gt; blocks from &lt;code&gt;.htaccess&lt;/code&gt; (Step 3)&lt;/li&gt;
&lt;li&gt;[ ] Grep theme/plugin files for &lt;code&gt;eval(&lt;/code&gt;, &lt;code&gt;base64_decode&lt;/code&gt;, and obfuscated &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; blocks (Step 4)&lt;/li&gt;
&lt;li&gt;[ ] Check &lt;code&gt;wp option get siteurl&lt;/code&gt;/&lt;code&gt;home&lt;/code&gt; and run &lt;code&gt;wp core verify-checksums&lt;/code&gt; (Step 5)&lt;/li&gt;
&lt;li&gt;[ ] Change all passwords — hosting, FTP, WordPress admin, registrar — since redirects usually mean broader access was gained, not just one file&lt;/li&gt;
&lt;li&gt;[ ] Update every plugin, theme, and WordPress core to the latest version&lt;/li&gt;
&lt;li&gt;[ ] Re-check Search Console's Security Issues report after cleanup and request a review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; after cleanup to confirm the redirect and any related malware are actually gone, not just hidden again.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to stop DIY-ing it
&lt;/h2&gt;

&lt;p&gt;If you've been through all four checks and the redirect keeps coming back, or you're not comfortable editing &lt;code&gt;.htaccess&lt;/code&gt; and database values on a live production site, that's the point to bring in a second pair of eyes. Automated scanners are good at flagging known malware signatures but routinely miss custom, hand-placed redirects like the ones above — that gap is exactly why manual review exists; see our comparison 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 it matters here. It's also worth reading &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;is my website hackable&lt;/a&gt; to understand what let the attacker in, so you're not just cleaning the symptom and leaving the door open.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A spam redirect almost always means compromise, not a bug — and it hides in &lt;code&gt;.htaccess&lt;/code&gt;, injected JavaScript, your WordPress database/plugins, or DNS.&lt;/li&gt;
&lt;li&gt;Test with &lt;code&gt;curl&lt;/code&gt; using a Googlebot User-Agent and a Google referrer before assuming your site is clean — many redirects are deliberately conditional and invisible on a normal desktop visit.&lt;/li&gt;
&lt;li&gt;Rule out DNS first with &lt;code&gt;dig&lt;/code&gt; — if the A or NS records are wrong, no file cleanup will fix it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eval()&lt;/code&gt; combined with &lt;code&gt;base64_decode&lt;/code&gt; in theme or plugin files is a near-certain sign of injected malware.&lt;/li&gt;
&lt;li&gt;After cleaning up, change every password tied to the site (hosting, FTP, WordPress, registrar) — the redirect was a symptom of broader access, not an isolated glitch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've gone through this checklist and still aren't fully sure it's clean — or you'd rather have someone find the exact injection point for you — &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Bug Circuit's Circuit audit&lt;/a&gt; is $49 for a human security engineer to manually trace it, document exactly what was changed and where, and hand you the precise fix. No card needed to start with the &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free check&lt;/a&gt; first.&lt;/p&gt;

</description>
      <category>websitehacked</category>
      <category>redirectmalware</category>
      <category>wordpresssecurity</category>
      <category>dnshijack</category>
    </item>
    <item>
      <title>Fix the 'Not Secure' Warning on Your Website</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 31 Jul 2026 02:29:21 +0000</pubDate>
      <link>https://dev.to/bugcircuit/fix-the-not-secure-warning-on-your-website-4gc3</link>
      <guid>https://dev.to/bugcircuit/fix-the-not-secure-warning-on-your-website-4gc3</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/fix-the-not-secure-warning-on-your-website" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Not Secure" warning means your site either has no SSL certificate, an expired one, or is loading some content over an insecure &lt;code&gt;http://&lt;/code&gt; connection — and you fix it by installing (or renewing) a certificate, forcing every page to load over &lt;code&gt;https://&lt;/code&gt;, and cleaning up any leftover &lt;code&gt;http://&lt;/code&gt; links.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is for any small business owner, blogger, or shop owner who opened their site and saw "Not Secure" next to the address bar — and now customers are asking about it (or worse, leaving). You don't need to be technical. Below is the exact sequence: diagnose, fix, verify, in about 20-40 minutes depending on your platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Not Secure" actually means
&lt;/h2&gt;

&lt;p&gt;Every browser checks whether your site is using &lt;strong&gt;HTTPS&lt;/strong&gt; — the encrypted version of the web address protocol. HTTPS relies on an &lt;strong&gt;SSL/TLS certificate&lt;/strong&gt;, a small file that proves your domain is who it says it is and encrypts the connection between your visitor's browser and your server. Chrome explains its address-bar security indicators directly here: &lt;a href="https://support.google.com/chrome/answer/95617" rel="noopener noreferrer"&gt;Chrome's "Not secure" warning explained&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You'll see the warning for one of three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No certificate at all&lt;/strong&gt; — your site is still served over plain &lt;code&gt;http://&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A broken certificate&lt;/strong&gt; — expired, self-signed, or issued for the wrong domain (e.g., it covers &lt;code&gt;example.com&lt;/code&gt; but not &lt;code&gt;www.example.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixed content&lt;/strong&gt; — the page itself loads over HTTPS, but it's pulling in an image, script, or stylesheet from an &lt;code&gt;http://&lt;/code&gt; address, so the browser can't call the whole page secure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three are fixable without touching code. Here's the order to work through them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Diagnose which one you have
&lt;/h2&gt;

&lt;p&gt;Before fixing anything, find out exactly what's broken:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the padlock or "i" icon in your browser's address bar and choose &lt;strong&gt;Certificate is not valid&lt;/strong&gt; or &lt;strong&gt;Connection is not secure&lt;/strong&gt; to see the reason.&lt;/li&gt;
&lt;li&gt;Run your domain through &lt;a href="https://www.ssllabs.com/ssltest/" rel="noopener noreferrer"&gt;Qualys SSL Labs' free SSL Test&lt;/a&gt; — it grades your certificate and flags expired, mismatched, or misconfigured setups in plain terms.&lt;/li&gt;
&lt;li&gt;If the padlock looks fine but you still see a warning or a "not fully secure" icon, open your browser's developer console (F12 → Console tab) and look for lines mentioning "Mixed Content" — that confirms issue #3 above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write down which case you're in; it determines which step below actually applies to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install or renew the SSL certificate
&lt;/h2&gt;

&lt;p&gt;If you have no certificate or an expired one, get a new one. Most hosts now offer this for free:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;How to get/renew the certificate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WordPress (shared hosting)&lt;/td&gt;
&lt;td&gt;Host's control panel → SSL/TLS → "Enable free SSL" (usually powered by &lt;a href="https://letsencrypt.org/getting-started/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify&lt;/td&gt;
&lt;td&gt;Settings → Domains — SSL is automatic and free; if it's missing, remove and re-add the domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Squarespace / Wix&lt;/td&gt;
&lt;td&gt;Settings → Domains → SSL — toggle on; provisioning can take up to 24-48 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare (in front of any site)&lt;/td&gt;
&lt;td&gt;SSL/TLS tab → set mode to "Full" or "Full (strict)", not "Flexible"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom server / VPS&lt;/td&gt;
&lt;td&gt;Install &lt;a href="https://certbot.eff.org/" rel="noopener noreferrer"&gt;Certbot&lt;/a&gt; for free Let's Encrypt certificates, set to auto-renew every 90 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let's Encrypt certificates expire every 90 days by design, specifically so renewal gets automated rather than forgotten — that's the single most common cause of a site suddenly going "Not Secure" after working fine for months. Confirm your host has auto-renewal turned on, not a manual reminder on someone's calendar.&lt;/p&gt;

&lt;p&gt;One more gotcha: make sure the certificate covers every version of your domain you actually use — &lt;code&gt;example.com&lt;/code&gt;, &lt;code&gt;www.example.com&lt;/code&gt;, and any subdomains. A certificate issued for only one of those will show "Not Secure" on the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Force every visitor onto HTTPS
&lt;/h2&gt;

&lt;p&gt;Having a certificate isn't enough if your site still lets people load the &lt;code&gt;http://&lt;/code&gt; version. You need a &lt;strong&gt;redirect&lt;/strong&gt; that automatically bumps every visitor to &lt;code&gt;https://&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WordPress:&lt;/strong&gt; install the free plugin &lt;strong&gt;Really Simple SSL&lt;/strong&gt; — it detects your certificate and forces the redirect with one click, no code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare:&lt;/strong&gt; SSL/TLS → Edge Certificates → turn on &lt;strong&gt;"Always Use HTTPS."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache (.htaccess):&lt;/strong&gt; add this to the top of your &lt;code&gt;.htaccess&lt;/code&gt; file:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;  &lt;span class="nc"&gt;RewriteEngine&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
  &lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{HTTPS} &lt;span class="ss"&gt;off&lt;/span&gt;
  &lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nginx:&lt;/strong&gt; in your server block:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;  &lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt; &lt;span class="s"&gt;www.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the redirect works, add one more header to tell browsers to &lt;em&gt;always&lt;/em&gt; use HTTPS for your domain from now on, even if someone types &lt;code&gt;http://&lt;/code&gt; again later: &lt;code&gt;Strict-Transport-Security: max-age=31536000; includeSubDomains&lt;/code&gt;. This is called &lt;strong&gt;HSTS&lt;/strong&gt;, and OWASP's cheat sheet covers exactly how to set it safely: &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Strict_Transport_Security_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP HSTS Cheat Sheet&lt;/a&gt;. You can check whether yours (and other security headers) are already in place with our free &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;security headers checker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Clean up mixed content
&lt;/h2&gt;

&lt;p&gt;If the padlock shows a warning icon even after Steps 2-3, some element on the page is still loading over plain &lt;code&gt;http://&lt;/code&gt;. Browsers block or flag this because an attacker on the same network could tamper with that one insecure file and use it to attack the rest of the page — Mozilla's developer docs explain the mechanics here: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content" rel="noopener noreferrer"&gt;MDN: Mixed content&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Common culprits and fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Old image or script tags&lt;/strong&gt; hardcoded as &lt;code&gt;http://yoursite.com/logo.png&lt;/code&gt; — change them to &lt;code&gt;https://&lt;/code&gt; or, better, a protocol-relative &lt;code&gt;//yoursite.com/logo.png&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded content&lt;/strong&gt; (YouTube videos, fonts, ad scripts, widgets) pulled from a third party still on &lt;code&gt;http://&lt;/code&gt; — check the embed code and swap to the provider's &lt;code&gt;https://&lt;/code&gt; version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database-stored links&lt;/strong&gt; in WordPress posts/pages from before you had SSL — use the plugin &lt;strong&gt;Better Search Replace&lt;/strong&gt; (or Really Simple SSL's built-in "Mixed Content Fixer") to bulk-update &lt;code&gt;http://yoursite.com&lt;/code&gt; to &lt;code&gt;https://yoursite.com&lt;/code&gt; across your database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After fixing, reload the page and re-check the browser console — no more "Mixed Content" warnings means you're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Verify the fix actually stuck
&lt;/h2&gt;

&lt;p&gt;Check all of these before calling it fixed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;code&gt;https://yourdomain.com&lt;/code&gt; loads with a padlock, no warning&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;http://yourdomain.com&lt;/code&gt; automatically redirects to &lt;code&gt;https://&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;http://www.yourdomain.com&lt;/code&gt; and &lt;code&gt;https://www.yourdomain.com&lt;/code&gt; also redirect correctly&lt;/li&gt;
&lt;li&gt;[ ] Browser console shows zero mixed-content errors on your homepage and top 2-3 pages&lt;/li&gt;
&lt;li&gt;[ ] SSL Labs test shows grade A or A+, not a warning&lt;/li&gt;
&lt;li&gt;[ ] Certificate expiry date is at least a month out, and auto-renewal is confirmed on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any box stays unchecked after these steps, the underlying cause is usually a caching layer (CDN or browser cache serving an old version) — clear your CDN cache and hard-refresh before troubleshooting further.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;"Not Secure" almost always means one of three things: no certificate, a broken/expired certificate, or mixed content — diagnose which one first.&lt;/li&gt;
&lt;li&gt;Get a free certificate from Let's Encrypt (via your host or Certbot) and confirm auto-renewal is on, since 90-day expiry is the #1 cause of recurring warnings.&lt;/li&gt;
&lt;li&gt;Force HTTPS with a 301 redirect (plugin, Cloudflare toggle, or a few lines in &lt;code&gt;.htaccess&lt;/code&gt;/Nginx config), then add an HSTS header.&lt;/li&gt;
&lt;li&gt;Hunt down and update any leftover &lt;code&gt;http://&lt;/code&gt; links in images, embeds, or your database — that's what causes mixed-content warnings even after the certificate is fixed.&lt;/li&gt;
&lt;li&gt;Re-test with SSL Labs and your browser console before considering it closed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've fixed the padlock but you're still wondering what else on your site might be exposed, that's worth a second look — our guide on &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;what makes a website hackable&lt;/a&gt; covers the other common gaps. And if you'd rather have a person confirm everything is actually locked down (not just the padlock, but the whole site), Bug Circuit's &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit audit&lt;/a&gt; is a one-time $49 manual review by a real security engineer, with a full report of anything else worth fixing. You can also start with a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive security check&lt;/a&gt; — no card, no login — before deciding if you need more.&lt;/p&gt;

</description>
      <category>ssl</category>
      <category>https</category>
      <category>websitesecurity</category>
      <category>notsecurewarning</category>
    </item>
    <item>
      <title>12 Signs Your Website Has Been Hacked</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 31 Jul 2026 02:23:38 +0000</pubDate>
      <link>https://dev.to/bugcircuit/12-signs-your-website-has-been-hacked-4e0h</link>
      <guid>https://dev.to/bugcircuit/12-signs-your-website-has-been-hacked-4e0h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/12-signs-your-website-has-been-hacked" 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 shows a browser warning, redirects visitors somewhere strange, has admin accounts you didn't create, or your emails are suddenly bouncing, treat it as hacked until you've checked and ruled it out.&lt;/strong&gt; None of these signs alone is proof, but two or more together is a strong signal.&lt;/p&gt;

&lt;p&gt;This is for any small business owner, freelancer, or agency running a WordPress site, Shopify store, or small SaaS app who's noticed something "off" and wants to know if it's a hack or a glitch. You'll get a plain-English checklist of the 12 most common symptoms, what each one actually means, how urgent it is, and the exact first steps to take.&lt;/p&gt;

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

&lt;p&gt;Run down this table first. Anything in the Critical or High row means stop reading and act now — jump to "What to do right now" below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sign&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;Browser or antivirus blocks your site&lt;/td&gt;
&lt;td&gt;Malware or phishing content detected&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google flags you in Search Console&lt;/td&gt;
&lt;td&gt;Confirmed malware, spam, or hacked content&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visitors get redirected to another site&lt;/td&gt;
&lt;td&gt;Malicious redirect script injected&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Homepage defaced or shows a ransom note&lt;/td&gt;
&lt;td&gt;Active, confirmed compromise&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New admin/user accounts you didn't create&lt;/td&gt;
&lt;td&gt;Attacker has persistent access&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unknown PHP/script files in your file manager&lt;/td&gt;
&lt;td&gt;A backdoor was uploaded&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Site is suddenly slow or host suspends you&lt;/td&gt;
&lt;td&gt;Server resources hijacked (e.g., crypto-mining)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popups or ads only visitors see, not you&lt;/td&gt;
&lt;td&gt;Cloaked malware showing different content to bots vs. humans&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emails from your domain bounce or land in spam&lt;/td&gt;
&lt;td&gt;Domain blacklisted or used to send spam&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customers report fraud after buying from you&lt;/td&gt;
&lt;td&gt;Payment page or card data possibly skimmed&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gibberish or spammy pages show up in Google&lt;/td&gt;
&lt;td&gt;"SEO spam" injection targeting search rankings&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can't log in / login page looks different&lt;/td&gt;
&lt;td&gt;Credentials changed or a fake login page installed&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The 12 signs, explained
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Your browser or antivirus blocks the site
&lt;/h3&gt;

&lt;p&gt;If Chrome, Safari, or your antivirus shows a "Deceptive site ahead" or "This site may harm your computer" warning, Google or another security vendor has already detected malware or phishing on your pages. Check your status directly with &lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Google's Safe Browsing site status tool&lt;/a&gt; — it's free and takes ten seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Google Search Console shows a Security Issues warning
&lt;/h3&gt;

&lt;p&gt;If you have Search Console set up, go to &lt;strong&gt;Security &amp;amp; Manual Actions &amp;gt; Security Issues&lt;/strong&gt;. A message here ("hacked content," "harmful content," or "URL injection") is Google's own confirmation, not a guess. Google documents the common causes and cleanup steps in its &lt;a href="https://developers.google.com/search/docs/monitor-debug/security/hacked-overview" rel="noopener noreferrer"&gt;hacked-sites help center&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Visitors get redirected to a random site
&lt;/h3&gt;

&lt;p&gt;Someone lands on your homepage and ends up on a casino, pharmacy, or fake-prize site instead. This is almost always a malicious redirect injected into your theme files, &lt;code&gt;.htaccess&lt;/code&gt;, or a compromised plugin. It often only fires for visitors coming from Google, so you may not notice it browsing directly — test in an incognito window from a search result, not by typing your URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Gibberish or spammy pages show up in your Google results
&lt;/h3&gt;

&lt;p&gt;Search &lt;code&gt;site:yourdomain.com&lt;/code&gt; in Google. If you see pages you never wrote — often in Japanese, Chinese, or stuffed with pharmacy/gambling keywords — that's "SEO spam injection." Attackers create thousands of hidden pages on your domain to piggyback on its search authority.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. There's an admin account you didn't create
&lt;/h3&gt;

&lt;p&gt;Check &lt;strong&gt;Users &amp;gt; All Users&lt;/strong&gt; in WordPress, or run &lt;code&gt;wp user list --role=administrator&lt;/code&gt; if you have WP-CLI access. An unfamiliar admin (sometimes with a generic name like "support" or "admin2") means an attacker created persistent access — even if you change your password, they can still log back in through that account.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Unfamiliar files appear in your file manager
&lt;/h3&gt;

&lt;p&gt;Look in &lt;code&gt;wp-content/uploads/&lt;/code&gt;, your theme folder, or your site root for &lt;code&gt;.php&lt;/code&gt; files that don't belong there — uploads folders should never contain executable scripts. A quick way to spot recently added files via SSH: &lt;code&gt;find . -type f -mtime -14 -name "*.php"&lt;/code&gt;. These are frequently backdoors that let an attacker back in even after you "clean" the visible hack.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Your site is suddenly slow, or your host suspends it for "resource abuse"
&lt;/h3&gt;

&lt;p&gt;A hosting email about excessive CPU use, or a site that crawls to a halt, can mean an attacker installed a script that mines cryptocurrency or sends spam email using your server's resources. Check your hosting control panel's resource-usage graph for an unexplained spike.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Emails from your domain bounce or land in spam
&lt;/h3&gt;

&lt;p&gt;If customer emails suddenly bounce, or your own test emails land in spam, your domain may have been used to send spam and gotten blacklisted, or your SPF/DKIM/DMARC records were tampered with. Run a free check with &lt;a href="https://bugcircuit.com/tools/email-spoofing" rel="noopener noreferrer"&gt;our email spoofing and DNS checker&lt;/a&gt; to confirm your records are intact and your domain isn't blacklisted.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Popups, fake update prompts, or ads appear — but only for visitors
&lt;/h3&gt;

&lt;p&gt;If customers report seeing "Your Flash Player is out of date" popups or unexpected ads, but you see nothing when you visit, that's likely cloaking: malicious code detects it's talking to a real visitor (not a search bot or the site owner) and serves different, malicious content. This is a classic technique to avoid detection while still infecting visitors — &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Incident_Response_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP's guidance on detecting and responding to this kind of compromise&lt;/a&gt; is a solid technical reference if you want the deeper mechanics.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. You can't log in, or the login page looks different
&lt;/h3&gt;

&lt;p&gt;A changed login URL, a login form that looks slightly off, or a password reset that silently fails can mean an attacker replaced your login page with a fake one to harvest credentials, or locked you out after taking over the account.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Customers report fraud charges right after buying from you
&lt;/h3&gt;

&lt;p&gt;This is one of the most serious signs on this list. If several customers report card fraud shortly after a purchase, your checkout page or payment integration may have been tampered with (a "web skimmer") to capture card details in real time. Treat this as a critical, drop-everything incident — it can trigger real financial harm to real people.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. The homepage is defaced, or there's a ransom note
&lt;/h3&gt;

&lt;p&gt;The most obvious sign: your homepage is replaced with a message, a flag, a group's logo, or a ransom demand. This confirms an active compromise with write access to your files. &lt;a href="https://www.cisa.gov/report" rel="noopener noreferrer"&gt;CISA's incident reporting guidance&lt;/a&gt; explains when and how to report an incident like this, particularly if customer data may be involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do right now
&lt;/h2&gt;

&lt;p&gt;If two or more of the signs above match, work through this in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Take a backup of the current (compromised) state first&lt;/strong&gt; — you'll want evidence, and a clean restore point may need comparison.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change every password&lt;/strong&gt;: hosting account, CMS admin, database, FTP/SFTP, and any team logins. Use unique, long passwords for each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for accounts and files you didn't create&lt;/strong&gt; (signs #4 and #5 above) and remove anything unfamiliar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask your host for their malware scan/cleanup tool&lt;/strong&gt; — most reputable hosts have one, and can also tell you if other sites on shared hosting were the entry point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify your DNS and email records&lt;/strong&gt; haven't been changed using &lt;a href="https://bugcircuit.com/tools/email-spoofing" rel="noopener noreferrer"&gt;our email spoofing checker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request a review in Google Search Console&lt;/strong&gt; once you're confident the site is clean, so the browser warnings and search flags get lifted.&lt;/li&gt;
&lt;li&gt;If money, customer data, or payment details were involved, &lt;strong&gt;document everything&lt;/strong&gt; and consider your legal/regulatory notification obligations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're not confident doing this yourself — and most non-technical owners aren't — that's exactly the gap a manual audit closes. For the full step-by-step process (not just the checklist), see our &lt;a href="https://bugcircuit.com/website-hacked" rel="noopener noreferrer"&gt;complete guide to what to do when your website's been hacked&lt;/a&gt;. If you just want a free first read before spending anything, our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; will tell you, no card required, whether something critical is actually going on.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Two or more signs from the checklist above (especially anything marked Critical) means you should act now, not "when you get a chance."&lt;/li&gt;
&lt;li&gt;A hacked site almost always has a hidden backdoor file or extra admin account — cleaning the visible symptom without finding that is why sites get re-hacked within days.&lt;/li&gt;
&lt;li&gt;Bounced email and blacklisting are DNS-level symptoms; check your SPF/DKIM/DMARC records, don't just resend the email.&lt;/li&gt;
&lt;li&gt;Google Search Console's Security Issues report is the most reliable free confirmation you can get in under a minute.&lt;/li&gt;
&lt;li&gt;If fraud is involved, or you're not sure what you're looking at, a second pair of trained eyes beats guessing — a $49 manual audit finds and documents the actual cause instead of you chasing symptoms in the dark.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bug Circuit's $49 Circuit audit has a real engineer manually go through your site, confirm which of these signs are real, find the backdoor or root cause, and hand you a plain-English report with exact fixes — see &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;pricing&lt;/a&gt; if you want a professional to confirm and fix it rather than guess.&lt;/p&gt;

</description>
      <category>websitehacked</category>
      <category>malware</category>
      <category>incidentresponse</category>
      <category>wordpresssecurity</category>
    </item>
    <item>
      <title>Answering a Security Questionnaire, No Security Team</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Fri, 31 Jul 2026 02:23:36 +0000</pubDate>
      <link>https://dev.to/bugcircuit/answering-a-security-questionnaire-no-security-team-4adb</link>
      <guid>https://dev.to/bugcircuit/answering-a-security-questionnaire-no-security-team-4adb</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/answering-a-security-questionnaire-no-security-team" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A client's procurement or legal team just sent you a spreadsheet with 40 questions about penetration tests, vulnerability management, and encryption standards, and you're a two-person shop with no security team. Here's the short version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't need SOC 2 or an in-house security team to pass a vendor questionnaire — you need honest, specific answers backed by real evidence, and a recent third-party security assessment is the single most useful piece of evidence you can attach.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The rest of this guide walks through the questions you'll actually see, explains what each one is really trying to find out, and gives you wording you can copy and adapt without lying or stalling the deal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why they're asking at all
&lt;/h2&gt;

&lt;p&gt;A vendor security questionnaire exists because your client's company is on the hook if &lt;em&gt;you&lt;/em&gt; get breached and their customer data leaks through your systems. It's not personal, and it's rarely read as closely as it feels — most of the time it's a compliance checkbox for their legal or procurement team, and a junior analyst is scoring it against a rubric. Vague answers or silence look worse than an honest "we're small, here's what we actually do."&lt;/p&gt;

&lt;p&gt;If you're wondering whether you even need a security audit to win the contract: usually no single audit is &lt;em&gt;required&lt;/em&gt;, but having something concrete to point to turns a stalled email thread into a five-minute approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decoding the common questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Do you conduct regular penetration testing?"
&lt;/h3&gt;

&lt;p&gt;What they're really checking: has anyone other than your own developers tried to break into your app, and did you fix what they found?&lt;/p&gt;

&lt;p&gt;Honest answer if you haven't: say so, then show what you &lt;em&gt;have&lt;/em&gt; done. "We do not run a continuous penetration testing program. We had a manual security assessment performed on [date] covering [scope], and remediated the findings; the report is attached." A single recent manual audit report is far stronger evidence than a vague "yes" with nothing to show for it — reviewers can tell the difference immediately when they ask for the report and you can't produce one.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Describe your vulnerability management process"
&lt;/h3&gt;

&lt;p&gt;This is asking: when a new bug or CVE comes out, how do you find out, and how fast do you patch it? You don't need a formal SLA document to answer this honestly. A real small-team process might be: "We use [hosting platform]'s automatic security updates for the OS and dependencies, run &lt;code&gt;npm audit&lt;/code&gt; / &lt;code&gt;composer audit&lt;/code&gt; before each release, and subscribe to security advisories for our main frameworks. Critical issues are patched within days of disclosure." Write down what you actually do — most reviewers just want proof there's a process, not a specific tool stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Do you have a SOC 2 report or ISO 27001 certification?"
&lt;/h3&gt;

&lt;p&gt;SOC 2 is an audit of your internal controls over months, done by a licensed CPA firm, and it typically costs many thousands of dollars — it's built for companies with dozens of employees and dedicated compliance staff, not a five-person SaaS. If you don't have one, say so plainly and offer the closest honest substitute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A recent manual security audit report of your actual product (not a generic company-wide audit)&lt;/li&gt;
&lt;li&gt;Your cloud provider's own compliance attestations (AWS, GCP, and Azure all publish SOC 2 / ISO reports for their infrastructure — you inherit some of that coverage)&lt;/li&gt;
&lt;li&gt;A written summary of your access controls, encryption, and backup practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saying "we're not SOC 2 certified, but here's our latest audit report and our cloud provider's compliance documentation" answers the underlying concern without pretending to have something you don't.&lt;/p&gt;

&lt;h3&gt;
  
  
  "How do you encrypt data in transit and at rest?"
&lt;/h3&gt;

&lt;p&gt;This one you can usually answer with total confidence. In transit: "All traffic is served over HTTPS/TLS 1.2+; HTTP requests are redirected to HTTPS." You can verify and strengthen this by checking your site against &lt;a href="https://bugcircuit.com/tools/security-headers" rel="noopener noreferrer"&gt;our free security headers checker&lt;/a&gt; — it'll confirm whether &lt;code&gt;Strict-Transport-Security&lt;/code&gt; is set (a good baseline value is &lt;code&gt;max-age=31536000; includeSubDomains&lt;/code&gt;) and flag missing headers like &lt;code&gt;Content-Security-Policy&lt;/code&gt; or &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;. At rest: most managed databases (RDS, Cloud SQL, MongoDB Atlas, Supabase) encrypt storage by default — check your provider's dashboard and state the actual mechanism, e.g. "AES-256 encryption at rest, managed by [provider]."&lt;/p&gt;

&lt;h3&gt;
  
  
  "Do you have an incident response plan?"
&lt;/h3&gt;

&lt;p&gt;They want to know that if something goes wrong, you won't go silent for two weeks. It doesn't need to be a 20-page document. A short, real answer works: "If we detect a security incident, we isolate the affected system, assess scope, notify affected customers within 72 hours, and document the root cause and fix." If you've never had to think this through, write it down now, before you need it — it's the cheapest item on this list to fix.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Who has access to production data, and how is access managed?"
&lt;/h3&gt;

&lt;p&gt;List it honestly: how many people, whether you use unique logins and multi-factor authentication, whether you revoke access when someone leaves. "Two team members have production access, both via MFA-protected accounts; access is reviewed quarterly and revoked immediately on offboarding" is a complete, credible answer even for a tiny team.&lt;/p&gt;

&lt;h2&gt;
  
  
  "We ran a scanner once" is not the same as a real audit
&lt;/h2&gt;

&lt;p&gt;A lot of small teams have, at some point, pointed an automated scanner at their site and gotten a clean report. That's worth mentioning, but be precise about what it proves: automated scanners check for known signatures — outdated software versions, missing headers, common misconfigurations. They can't chain together a business-logic flaw, test whether one customer can see another customer's data, or notice that a password-reset flow leaks account existence. If you want the actual mechanics of the difference, &lt;a href="https://bugcircuit.com/guides/manual-vs-automated-penetration-testing" rel="noopener noreferrer"&gt;our guide to manual vs. automated penetration testing&lt;/a&gt; breaks it down. A questionnaire reviewer who's seen a few hundred of these can usually tell "we ran a free scanner" from "a person actually tested this," so don't oversell the scanner result — describe it accurately and pair it with something stronger if you can.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to actually attach to the questionnaire
&lt;/h2&gt;

&lt;p&gt;If you want one document that answers the penetration-test question, the vulnerability-management question, and half the encryption question at once, get a manual audit done and attach the report. It doesn't need to be an enterprise-grade, multi-week engagement to be credible — it needs to be recent, specific to your actual site, and written by a human who tested it, not a script.&lt;/p&gt;

&lt;p&gt;Before you spend anything, you can get a free read on where you stand: run a &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free passive security check&lt;/a&gt; to see obvious exposures, or check your email setup with &lt;a href="https://bugcircuit.com/tools/email-spoofing" rel="noopener noreferrer"&gt;our email spoofing tool&lt;/a&gt; if the questionnaire also asks about phishing/domain protection (SPF/DKIM/DMARC records are a common follow-up question). If you want to understand pricing before committing, &lt;a href="https://bugcircuit.com/guides/how-much-does-a-penetration-test-cost" rel="noopener noreferrer"&gt;our breakdown of penetration test costs&lt;/a&gt; explains why enterprise pentests run into five figures and where a productized manual audit fits underneath that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Don't lie, don't leave fields blank, and don't pretend a free scanner result is a penetration test. Answer every question with what's actually true about your setup, back the big claims with real evidence where you have it, and fix the gaps you can fix cheaply (headers, MFA, a written incident plan) before you submit. For the one question you probably can't answer honestly yet — proof of a real security test — a manual audit is the fastest, cheapest way to close that gap.&lt;/p&gt;

&lt;p&gt;If you want that evidence in hand before your next questionnaire lands, &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Circuit&lt;/a&gt; is a $49 one-time manual audit: a real engineer tests your site and hands you a written report with severity ratings and exact fixes — something you can attach directly to a vendor questionnaire instead of leaving the field blank.&lt;/p&gt;

</description>
      <category>securityquestionnaire</category>
      <category>vendorrisk</category>
      <category>penetrationtesting</category>
      <category>soc2alternative</category>
    </item>
    <item>
      <title>Why Is My Website Sending Spam Emails? (Fix It)</title>
      <dc:creator>Bug Circuit</dc:creator>
      <pubDate>Thu, 30 Jul 2026 19:14:02 +0000</pubDate>
      <link>https://dev.to/bugcircuit/why-is-my-website-sending-spam-emails-fix-it-3d8a</link>
      <guid>https://dev.to/bugcircuit/why-is-my-website-sending-spam-emails-fix-it-3d8a</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bugcircuit.com/blog/why-is-my-website-sending-spam-emails-fix-it" rel="noopener noreferrer"&gt;Bug Circuit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your website hasn't grown a mind of its own — a hacked file on your server is almost certainly the one blasting the spam, and you can usually find and remove it in an afternoon.&lt;/strong&gt; This is one of the most common signs of a compromised site, and it follows a predictable pattern: an attacker gets a script onto your server, that script quietly uses your server's mail function to send spam in bulk, and eventually your host notices before your own visitors do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who this is for:&lt;/strong&gt; owners who got a "spam complaints" or "abuse" notice from their host, found their domain on a blacklist, or just have a hunch something's wrong. &lt;strong&gt;What you'll get:&lt;/strong&gt; how to confirm the spam is genuinely coming from your server (not just spoofed), where the malicious script usually hides, how to pull it out safely, and how to close the door it came through.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does a website end up sending spam?
&lt;/h2&gt;

&lt;p&gt;It's almost never "your website decided to email people." It's a small file — often just a few lines of PHP — that an attacker uploaded after finding a weak spot: an outdated plugin, a leaked FTP password, an unpatched CMS version, or a contact form that accepts file uploads without checking what's inside them. This class of bug is well documented by OWASP as &lt;a href="https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload" rel="noopener noreferrer"&gt;unrestricted file upload&lt;/a&gt; — once a script can land anywhere inside your web root, it can call PHP's &lt;code&gt;mail()&lt;/code&gt; function (or open a raw connection to an SMTP server) and start sending on your server's reputation and IP address.&lt;/p&gt;

&lt;p&gt;The script usually isn't sending one email at a time by hand — it's looping through a list, often triggered by repeated visits to its own URL or by a scheduled cron job, which is why the volume can spike into the thousands overnight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Confirm it's really coming from you
&lt;/h2&gt;

&lt;p&gt;Before you go file-hunting, check whether the mail is truly leaving your server, or whether someone is just putting your domain in the "From:" field without touching your site at all (that's email spoofing, a related but different problem you can check with our &lt;a href="https://bugcircuit.com/tools/email-spoofing" rel="noopener noreferrer"&gt;email spoofing checker&lt;/a&gt;).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open a spam sample and view the full headers.&lt;/strong&gt; In Gmail: the three-dot menu → "Show original." Look at the chain of &lt;code&gt;Received: from&lt;/code&gt; lines — read them bottom to top. If one of the early lines shows your actual hosting IP or hostname (not just your domain name), the mail was generated on your server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for a host abuse notice.&lt;/strong&gt; Most hosts auto-flag or suspend accounts once outbound spam volume trips a threshold — look for subject lines like "Exim mail queue is very large" or "abuse complaint" in your hosting account inbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the live mail queue.&lt;/strong&gt; SSH in and run &lt;code&gt;mailq&lt;/code&gt; (Postfix servers) or use WHM/cPanel's &lt;strong&gt;Email → Mail Queue Manager&lt;/strong&gt; if your host uses cPanel. A queue in the thousands, all going to unfamiliar addresses, confirms active sending.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the mail logs for the source.&lt;/strong&gt; Look at &lt;code&gt;/var/log/mail.log&lt;/code&gt; or &lt;code&gt;/var/log/exim_mainlog&lt;/code&gt; (cPanel), or use cPanel's &lt;strong&gt;Email → Track Delivery&lt;/strong&gt;. You're looking for one account or script generating an unusually high, repetitive volume compared to your normal traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your web server's access logs&lt;/strong&gt; for repeated POST requests to an unfamiliar &lt;code&gt;.php&lt;/code&gt; file — especially one sitting inside &lt;code&gt;/wp-content/uploads/&lt;/code&gt; or another folder that should only ever hold images and documents.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Find and remove the mailer script
&lt;/h2&gt;

&lt;p&gt;Mailer scripts hide in a few predictable places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upload folders&lt;/strong&gt; (&lt;code&gt;wp-content/uploads/&lt;/code&gt;, &lt;code&gt;/images/&lt;/code&gt;, &lt;code&gt;/media/&lt;/code&gt;) — these should never contain executable PHP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme files&lt;/strong&gt;, especially &lt;code&gt;functions.php&lt;/code&gt;, where a few extra lines blend in with legitimate code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A "plugin" folder you don't remember installing.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A file with a name designed to look boring&lt;/strong&gt; (&lt;code&gt;class-cache.php&lt;/code&gt;, &lt;code&gt;wp-tmp.php&lt;/code&gt;) sitting next to legitimate files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few read-only commands that help you narrow it down fast:&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-rl&lt;/span&gt; &lt;span class="s2"&gt;"mail("&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;.php wp-content/uploads
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rlE&lt;/span&gt; &lt;span class="s2"&gt;"base64_decode|gzinflate|eval&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;.php public_html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Heavy use of &lt;code&gt;base64_decode&lt;/code&gt;, &lt;code&gt;gzinflate&lt;/code&gt;, and &lt;code&gt;eval()&lt;/code&gt; chained together to hide what a script actually does is the classic signature of a web shell — malicious code an attacker uses to control your server remotely — as described in CISA's guidance on &lt;a href="https://www.cisa.gov/resources-tools/resources/detect-and-prevent-web-shell-malware" rel="noopener noreferrer"&gt;detecting and preventing web shell malware&lt;/a&gt;. None of those functions are automatically evil on their own, but finding them obfuscating a file you don't recognize is a strong signal.&lt;/p&gt;

&lt;p&gt;Other ways to narrow the search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compare against clean copies.&lt;/strong&gt; If you run WordPress, &lt;code&gt;wp core verify-checksums&lt;/code&gt; (via &lt;a href="https://developer.wordpress.org/cli/commands/core/verify-checksums/" rel="noopener noreferrer"&gt;WP-CLI&lt;/a&gt;) flags any core file that's been altered. Redownload fresh copies of your theme and plugins from their official source and diff them against what's on the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort by recent changes:&lt;/strong&gt; &lt;code&gt;find public_html -type f -name "*.php" -mtime -30&lt;/code&gt; surfaces anything touched in the last month — a freshly modified file inside an otherwise untouched plugin folder stands out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for scheduled tasks:&lt;/strong&gt; &lt;code&gt;crontab -l&lt;/code&gt; on the server, and any "cron" entries inside your CMS's own scheduler — some mailers fire on a timer instead of a web request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check for accounts you didn't create:&lt;/strong&gt; an extra WordPress admin user, or an extra FTP/cPanel user, often accompanies the script as a backup way back in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you find it, move the file out of the web root (rather than deleting it immediately) so you can review it later if needed, then keep searching — attackers who get in once frequently leave more than one way back in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Close the door it came through
&lt;/h2&gt;

&lt;p&gt;Removing the script fixes the symptom. These steps fix the cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update everything&lt;/strong&gt; — CMS core, every theme, every plugin. Outdated software with a known, unpatched vulnerability is the single most common entry point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reset every password&lt;/strong&gt;: hosting/cPanel, CMS admin, database, FTP/SFTP. Assume whichever one was weakest is how they got in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete plugins and themes you don't actively use.&lt;/strong&gt; Fewer installed files means fewer places to hide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block PHP execution inside upload folders.&lt;/strong&gt; On Apache 2.4, add this to a &lt;code&gt;.htaccess&lt;/code&gt; file inside the uploads directory:
&lt;/li&gt;
&lt;/ul&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;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.php$"&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; denied
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turn on your host's malware scanner or file-integrity monitor&lt;/strong&gt; if one is offered — it'll catch a repeat attempt faster than you can manually.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: Get off the blacklists
&lt;/h2&gt;

&lt;p&gt;Once the script is gone and the hole is patched:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check your server IP and domain at &lt;a href="https://www.spamhaus.org/lookup/" rel="noopener noreferrer"&gt;Spamhaus's lookup tool&lt;/a&gt; to see if either is listed.&lt;/li&gt;
&lt;li&gt;Use each blacklist's own removal request form — don't request delisting until you've actually confirmed the mailer is gone, or you'll get relisted within hours.&lt;/li&gt;
&lt;li&gt;Set up SPF, DKIM, and DMARC DNS records for your domain. These won't stop a script that's genuinely sending through your real mail path, but they help mailbox providers trust your legitimate mail going forward and stop the closely related problem of someone spoofing your domain from outside — see Google's &lt;a href="https://support.google.com/mail/answer/81126" rel="noopener noreferrer"&gt;bulk sender guidelines&lt;/a&gt; for the exact values major providers now expect.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where to look for evidence
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence source&lt;/th&gt;
&lt;th&gt;What it tells you&lt;/th&gt;
&lt;th&gt;Where to find it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email headers ("Show original")&lt;/td&gt;
&lt;td&gt;Whether mail truly left your server or was spoofed&lt;/td&gt;
&lt;td&gt;Any spam sample sent claiming to be from you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host abuse notice&lt;/td&gt;
&lt;td&gt;Your host has already detected outbound spam volume&lt;/td&gt;
&lt;td&gt;Hosting account inbox / support tickets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mail queue size&lt;/td&gt;
&lt;td&gt;Whether spam is actively queued right now&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mailq&lt;/code&gt;, or WHM/cPanel Mail Queue Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mail logs&lt;/td&gt;
&lt;td&gt;Which account or script is sending, and how often&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/var/log/mail.log&lt;/code&gt;, &lt;code&gt;/var/log/exim_mainlog&lt;/code&gt;, cPanel Track Delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web access logs&lt;/td&gt;
&lt;td&gt;Which URL triggers the script&lt;/td&gt;
&lt;td&gt;Raw access logs / cPanel Metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blacklist status&lt;/td&gt;
&lt;td&gt;Whether your reputation is already damaged&lt;/td&gt;
&lt;td&gt;spamhaus.org/lookup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If digging through server logs isn't something you want to do yourself, our &lt;a href="https://bugcircuit.com/free-website-security-check" rel="noopener noreferrer"&gt;free website security check&lt;/a&gt; can tell you, at no cost, whether your site is showing the obvious red flags of a compromise — and our guide on &lt;a href="https://bugcircuit.com/guides/is-my-website-hackable" rel="noopener noreferrer"&gt;whether your site is hackable in the first place&lt;/a&gt; covers the entry points worth locking down before this happens again.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Spam "from your website" is almost always a hidden script on your server, not spoofing — confirm it by reading the actual email headers.&lt;/li&gt;
&lt;li&gt;Check your mail queue and server logs to find which account or file is generating the volume before you start deleting things.&lt;/li&gt;
&lt;li&gt;Mailer scripts hide in upload folders, theme files, and disguised "plugin" directories — obfuscated code (&lt;code&gt;base64_decode&lt;/code&gt;, &lt;code&gt;eval&lt;/code&gt;) is a strong tell.&lt;/li&gt;
&lt;li&gt;Removing the file isn't the whole fix — update everything, reset every password, and block PHP execution in upload folders so it can't come back.&lt;/li&gt;
&lt;li&gt;Request blacklist delisting only after you've confirmed the script is actually gone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've done the above and still aren't sure the site is clean — or you'd rather have a person confirm it instead of guessing — a real security engineer manually reviewing your site is the honest next step. That's exactly what &lt;a href="https://bugcircuit.com/pricing" rel="noopener noreferrer"&gt;Bug Circuit's $49 Circuit audit&lt;/a&gt; does: a full manual review with a written report of anything found, including exactly where the entry point was and how to close it.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Why is my website sending spam emails?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In almost every case, an attacker uploaded a small script to your server — through an outdated plugin, a weak password, or an unrestricted upload form — and that script is using your server's mail function to send spam in bulk, usually without touching your site's visible pages at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is my website hacked if it's sending spam?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. A site can't send outbound spam on its own; it requires a malicious file or account that shouldn't be there. Treat it as an active compromise and remediate it the same way you would any other hack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I know if my website is sending spam?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check the full email headers of a spam sample claiming to be from you, look for an abuse notice from your host, and check your server's mail queue and logs for an unusually high volume of outbound mail — all of these will confirm whether the mail truly originated on your server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will my host suspend my site for sending spam?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most hosts will suspend or throttle an account once outbound spam trips their abuse threshold, since it damages their shared IP reputation for other customers too. Removing the malicious script and responding to their abuse ticket promptly is usually enough to get reinstated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can my website send spam without me knowing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes — that's the normal case. The script typically runs silently in the background or on a timer, so the first sign is often a host notice, a blacklist listing, or a customer telling you they got a strange email "from" your domain.&lt;/p&gt;

</description>
      <category>websitehacked</category>
      <category>spamemail</category>
      <category>webshell</category>
      <category>malwareremoval</category>
    </item>
  </channel>
</rss>
