Ensomedia Security powered by shieldwave.io

Descriere

shieldwave.io by ensomedia.dev

Ensomedia Security, powered by shieldwave.io, scans your site from the inside and tells you in plain language what is wrong and how to fix it. It is built around one idea: an alert has to be worth your attention. Every check, scan and alert is free, needs no account and has no limits. The screens and alert emails come in 17 languages (see the FAQ).

Why owners switch to it

  • Official checksums first. Core, directory plugins and directory themes are compared with files WordPress.org published for your version.
  • Malware detection that needs real evidence. One weak signal is never a finding. Unsure findings go under „Ask your developer to check” and send no email.
  • Change monitoring for what WordPress.org cannot verify: premium plugins, custom themes, must-use plugins and drop-ins.
  • Alerts that do not cry wolf. One email per scan for new or worse problems at or above your threshold, at most four a day, and at once when an account becomes administrator or the user name of an administrator gets locked. A check that could not run never sends email.
  • Never rewrites your site on its own. Files, users and settings change only when you press a button or turn on a switch.

The checks

  • Malware and backdoors in files WordPress.org cannot vouch for: web shells, decode-and-execute chains, obfuscated code, remote code loaders, PHP hidden in images, spam mailers, hidden administrators, injected JavaScript and malicious redirects.
  • Core, plugin and theme files against WordPress.org, plus PHP files the releases do not contain.
  • File changes against the recorded baseline, and plugin or theme folders that appear without the WordPress installer.
  • PHP files in uploads, and .htaccess or .user.ini rules that make the server run uploads as PHP.
  • Known vulnerabilities (opt-in) in plugins, themes and WordPress, premium ones included, with the version that fixes each one.
  • Closed, abandoned and unused plugins and themes, updates and PHP version support.
  • Injected content: scripts, hidden iframes and spam links in posts, widgets, every site option, code snippets and account data. Ordinary embeds and tracking codes are left alone.
  • What visitors and search engines see: the home page and checkout as a visitor, Googlebot and a search click, and spam pages in the site folder.
  • Exposed files your server hands out to anyone (wp-config.php copies, database dumps, backups, .git, .env, logs), confirmed by a request to your site; leftover installers; folder listings.
  • Accounts and configuration: administrators, user registration, wp-config.php, debug output, file editor, XML-RPC, HTTPS, user list exposure, suspicious scheduled tasks and backups.

Live protection (three features, all opt-in):

  • Known vulnerabilities: the lookup above.
  • Live threat feed: new malware rules and file signatures from ShieldWave reach your site within about an hour, verified by signature. It sends nothing about your site.
  • AI second opinion: for a file the local rules cannot judge, a redacted excerpt gets a verdict in plain words.

All three are off until you turn them on (the plugin asks once after activation) and run from WP-Cron once an hour, whether or not a scan is running. See External services.

Request firewall

An optional local firewall, off until you turn it on: attack rules for common injections and executable uploads, IP and country blocks, request limits and narrow exceptions. It sends no request data.

Login protection

  • Failed logins are limited per address (five by default, then a cooldown you set) and per user name across all addresses (20 an hour by default, any number from 1 to 500, 0 turns it off). Password reset requests are limited per address, 5 an hour by default. A lock is always temporary, and trusted addresses are never locked.
  • Only the connection’s own address counts, never a header a request can fake. Behind a proxy or CDN, list its addresses or CIDR ranges (/8 or narrower, up to 20 entries) under trusted proxies and pick the header with the visitor’s address.
  • User names are hidden from logged-out visitors: login errors, ?author=N, the REST API, embeds and the users sitemap.
  • On by default for new installs, off after an upgrade.
  • Opt-in: a bot check on the login forms, refusing breached passwords, a hidden login address and form spam traps.

Two-factor login, passkeys and sessions

  • Two-factor login with an authenticator app, ten recovery codes and wp shieldwave two-factor disable <user>, so nobody is locked out.
  • Required for the roles you choose, with 0 to 30 days (7 by default) to set it up.
  • Passkeys (WebAuthn) as the second step or, opt-in, to sign in without a password, on HTTPS with PHP’s OpenSSL extension.
  • See where your account is signed in, sign out other sessions or every user, and set how long an administrator’s session lasts.

Hardening

One switch each:

  • The plugin and theme file editor and XML-RPC, without editing wp-config.php.
  • PHP in uploads: a block in the uploads .htaccess file on Apache and LiteSpeed, the nginx and IIS rule, and Check now to test it.
  • Security headers, Strict-Transport-Security over HTTPS only. Headers already sent are kept.
  • Virtual patches. With the live threat feed on, a small must-use file stops requests exploiting a known vulnerability of an installed plugin, when the feed has a patch for it and the installed version is affected. Each patch is reviewed and tested against ordinary requests before it enters the feed. On by default. They block once you accept the offer after activation, else only record. Patch count: shieldwave.io/wordpress-plugin.
  • Security updates (WordPress 6.6 or newer), chosen per plugin: WordPress’s automatic updates install a release that fixes a known vulnerability of the installed version, and roll back if the update fails.

A file with a finding of medium severity or higher can be moved into quarantine with one button, and Restore puts it back. The FAQ explains what is never moved.

Activity log and privacy

Each history entry carries a keyed hash that includes the hash of the entry before it, so Check history integrity shows whether an entry was edited or deleted outside ShieldWave. Entries are kept for 7 to 730 days (90 by default) and can be exported as CSV. The plugin adds a suggested text to Settings > Privacy and takes part in the WordPress personal data export and erasure tools.

ShieldWave dashboard (optional)

Press Connect with shieldwave.io under ShieldWave > Settings and the site shows up in your dashboard at shieldwave.io with its score and open issues. Every site you connect shows up, on the free plan too. Pro (12 USD a month) and Enterprise (29 USD a month) add the outside scan, monitoring and reports, other currencies on shieldwave.io/pricing. The dashboard cannot change anything on the site. See External services.

What this plugin does not do

It is not a full web application firewall and does not clean malware out of files. It can put back the WordPress.org original of a changed core, plugin or theme file; other fixes it explains are yours to make. Ensomedia Security is built by ENSOMEDIA (Radosław Fedorczuk, Wrocław, Poland), which also runs shieldwave.io.

External services

No outside requests are made on activation or when admin pages load, only when a scan runs, when you use the account actions, and once an hour from WP-Cron for the live protection features you turned on and a connected account. Requests to your own site are listed in the FAQ. Requests to WordPress.org and most requests to your own site use the WordPress HTTP API’s default user agent (WordPress version and site address). Requests to ShieldWave send a neutral user agent (ShieldWave-Security and the plugin version) and never your site address in their headers. Each request comes from your server’s IP address.

WordPress.org core checksums (api.wordpress.org/core/checksums/1.0/)
For the „WordPress core files” check. Sent: your WordPress version and package language. Cached for a day.

WordPress.org release list (api.wordpress.org/core/stable-check/1.0/)
Tells the same check which older releases to compare with. Sent: nothing about your site. Cached for a day.

WordPress.org plugin checksums (downloads.wordpress.org/plugin-checksums/)
For the „Plugin files” check. Sent: the folder name and version of each installed plugin. Cached for a week, or for a day when no list was available.

WordPress.org repository (core.svn.wordpress.org, plugins.svn.wordpress.org, themes.svn.wordpress.org)
Only when you press „Replace with the original” on a finding. Sent: the version and path of that one file.

WordPress.org theme packages (downloads.wordpress.org/theme/)
For the „Theme files” check: each directory theme’s release package is downloaded, hashed and deleted. Sent: the theme’s folder name and version. Cached for a week.

WordPress.org plugin information (api.wordpress.org/plugins/info/1.2/)
Used by the „Closed and abandoned plugins” check. Sent: the folder name of each installed plugin. Cached for a day.

WordPress.org theme information (api.wordpress.org/themes/info/1.2/)
Tells the „Theme files” check which installed themes come from the directory. Sent: the folder name of each installed theme. Cached for a day.

All seven are provided by WordPress.org: privacy policy.

ShieldWave vulnerability lookup (shieldwave.io, endpoint /api/plugin/vulnerabilities), off until you turn it on
For the „Known vulnerabilities” check. Sent: your WordPress version and the folder name and version of each installed plugin and theme, premium ones included. A premium plugin’s product name is compared on your site, never sent. No site address, no account, no personal data. The data comes from Wordfence Intelligence, and each result links to its record with its copyright notice; links go only to Wordfence, NVD, CVE.org, WPScan, Patchstack, shieldwave.io, WordPress.org and the GitHub advisory database. Runs with the scan and WP-Cron; cached 3 hours, source data refreshed every 6 hours.

ShieldWave threat feed (shieldwave.io, endpoint /api/plugin/intel), off until you turn it on
For the „Live threat feed” option and virtual patches. The plugin downloads a signed file of extra malware rules, file signatures and virtual patch rules once an hour from WP-Cron and verifies its signature before use. Sent: nothing about your site; only the plugin version, which every request carries.

ShieldWave AI second opinion (shieldwave.io, endpoint /api/plugin/ai/review), off until you turn it on
For a file the local rules cannot judge. Sent: an excerpt of up to 6,000 characters around the suspicious code; the file’s SHA-256 and MD5 fingerprints and size; its kind and where it sits (plugin or theme folder name, uploads and so on); the local verdict and the matched rule identifiers; the site language, the plugin version and a salted hash of the site. Removed before sending: your site address, email addresses, IPv4 and IPv6 addresses, the server paths of WordPress and of home folders (replaced by a neutral path), every DB_ constant and the arguments of database connections, values named like a password, key, salt, secret or token (from 6 characters) and long random tokens. Other web addresses stay. Never read: wp-config*, .env*, .htpasswd, .user.ini, php.ini, auth.json, backup copies (.bak, .old, .orig, .save, .swp, names ending in ~), .sql dumps, logs and .ini files. If the redaction fails, nothing is sent. shieldwave.io passes the excerpt to an AI provider of shieldwave.io, described in the ShieldWave privacy policy; the verdict is kept by the file’s fingerprint and shared across sites. Runs after a scan and once an hour from WP-Cron.

Link to the outside check (shieldwave.io)
The Overview links to the free outside check. Nothing is sent until you click; then your browser opens shieldwave.io/?check=yourdomain.com. Links to shieldwave.io carry utm_source=wordpress, utm_medium=plugin and utm_campaign=(the screen).

ShieldWave account (shieldwave.io), only after an administrator connects the site under ShieldWave > Settings

  • Connecting opens shieldwave.io/connect in your browser with this site’s address, the address to come back to and a random value. Back on the site, the plugin sends the single-use code, this site’s id and address, and the plugin, WordPress and PHP versions to /api/plugin/connect/exchange and receives a key for this site. With a pasted API key, /api/license/verify receives the key and /api/plugin/connect the same site facts.
  • While connected, the home page carries a meta tag named shieldwave-verify with a code of your account, and /api/plugin/verify-domain asks shieldwave.io to read it, after connecting and every few hours until the domain is confirmed.
  • Hourly and after each scan: /api/plugin/heartbeat receives the site id, the site address and language, the versions of the plugin, WordPress and PHP, the scan status, the score and grade, the issue counts and the times of the last and next scan.
  • Decoys, with the heartbeat and the sync: whether they are on, and per use the kind, time, how it came in, whether it locked the address out or why not, and a keyed hash of the address, whose key never leaves the site.
  • After each scan (if sending is on): /api/plugin/sync receives the scan summary (counters, score, active theme, number of active plugins, site language and the language of the administrator who started the sync), the open and ignored issues (severity, confidence, title, message, fix, when first seen, the file, plugin or setting involved, rule identifiers, line, the plugin or theme and its version, the vulnerability identifier, score and record link, and the AI second opinion when there is one) and the installed plugins and themes with their names, versions and source.
  • Never sent: posts, pages, comments, user names, email addresses or passwords. Private issues (accounts, site address, snippets, drafts) go with title and general advice only.
  • „Disconnect” calls /api/plugin/disconnect, which removes this site and its results from shieldwave.io. Deleting the plugin from the Plugins screen makes the same call once, with a 5 second limit, before the key is removed.
  • The key is kept in the database encrypted with a key derived from your wp-config.php salts, where the server has libsodium, and sent only in a request header.

Have I Been Pwned, Pwned Passwords (api.pwnedpasswords.com/range/), off until you turn it on
On new passwords and weekly at sign-in. Sent: the first 5 characters of the password’s SHA-1 hash. Privacy policy.

Cloudflare Turnstile (challenges.cloudflare.com), only with your keys
Login forms load its script; answer tokens go with your secret key to /turnstile/v0/siteverify. Terms and privacy policy.

The data above is processed by shieldwave.io, run by ENSOMEDIA in Poland, and for the AI second opinion by an AI provider of shieldwave.io. ShieldWave terms of service and privacy policy.

Capturi ecran

Instalare

  1. Install the plugin from Plugins > Add Plugin, or upload the ensomedia-security folder to /wp-content/plugins/.
  2. Activate it.
  3. Open ShieldWave and press Scan now. The first scan records the baseline and usually takes a few minutes; later scans are faster.
  4. Scheduled scans run daily at 03:00 (site time). Change that, the alerts and the options under ShieldWave > Settings.
  5. Answer the offer shown after activation: Turn on protection turns on the vulnerability lookup, the threat feed and virtual patches. You can also do it later under ShieldWave > Settings > Live protection.
  6. Optional: to see the site in the ShieldWave dashboard, press Connect with shieldwave.io under ShieldWave > Settings > ShieldWave account.

Întrebări frecvente

How does the request firewall load, and how do I undo a block?

A must-use loader checks requests before normal plugins load. The optional Load before WordPress setting adds a marked entry to .user.ini on PHP CGI/FastCGI hosts and refuses to replace another auto_prepend_file; the firewall screen shows whether early loading ran. Named password fields and authentication headers are not inspected. History stays on your site for up to 30 days and records metadata, not query strings or submitted values. Reducing protection, adding an exception, clearing history or lifting a block asks for your password or an authenticator code.

If the firewall blocks you, replace wp-content/ensomedia-security-firewall.php with an empty PHP file and remove only the marked .user.ini entry, and keep the empty file until PHP’s configuration cache expires. Without early loading, define SHIELDWAVE_FIREWALL_OFF in wp-config.php to turn the loader off. The firewall adds protection; it does not replace updates or fix vulnerable code. Its rules ship with plugin updates and are separate from the virtual patches and the malware feed.

Do I need a ShieldWave account?

No. All 25 checks, scheduled scans, email alerts and the vulnerability lookup work without one, with no limits.

Can I hide ShieldWave from the toolbar?

Yes. Under ShieldWave > Settings > Toolbar, turn off „Show ShieldWave in the toolbar”. The choice is per administrator. Visitors never see it.

How is this different from other security scanners?

It trusts the files WordPress.org can vouch for, needs real evidence before it calls something malware, and emails only about problems that are new or got worse. The goal is that every alert you get is one you would want.

What does „Ask your developer to check” mean?

The scanner found something unusual that is often harmless: for example a new PHP file in a premium plugin without an update. It is listed so someone who knows the site can look at it, and it never sends an email on its own. Problems under „Fix now” are the ones with clear evidence.

A finding is about a file I changed on purpose.

Open the item and press „Ignore”. It stays out of the score and the alerts, and an ignored file comes back by itself if it changes again. Ignored items stay under the „Ignored” link below the to-do list, where „Restore” brings one back.

What does the History record about the people on my site?

Scans and settings, and also sign-ins, new and deleted accounts, role changes, who edited, published or trashed a post or page, plugin and theme installs, updates, switches and removals, and changes to the site addresses, the administration email, „Anyone can register” and the new user role. A post is named by its title and number, never its text. Sign-ins and edits are written once per person in a short window, at most 300 a day together. The History screen filters by type and person, and the CSV export holds every entry.

Does ShieldWave make backups?

No. The Backups check looks for a switched-on backup plugin, a few hosts that back up themselves and archives in the usual folders, and reads the date of the last backup from their settings and files without running them. It says so when the newest backup is older than 7 days. When it cannot read a date, it marks the check as not assessed and does not raise an alarm.

Will it slow my site down?

No. Scans never run while a visitor’s page loads: they work in the background in steps of a few seconds, and later scans skip files that were clean and did not change. On a busy shared host you can choose the low scan speed in Settings.

What happens to the scheduled scan when the clocks change?

It stays on the hour you chose, in the time zone set under Settings > General, and it follows a change of that time zone at once. On the one day a year the clocks skip the chosen hour, the scan runs right after the skipped hour. On the day an hour happens twice, it runs once, the first time the clock shows it.

Which outside requests does it make?

Only when scans run: to WordPress.org for checksums, theme packages, plugin information and the list of WordPress releases, and to your own site. With the vulnerability lookup, live threat feed or AI second opinion on: to shieldwave.io, once an hour from WP-Cron and after scans. With an account connected: to shieldwave.io, also once an hour. With the breached password check: to api.pwnedpasswords.com. With Cloudflare Turnstile: to challenges.cloudflare.com. Each of those is off until you turn it on, and the External services section below lists exactly what is sent.

Requests to your own site: the XML-RPC, debug output and exposed files checks request xmlrpc.php, the debug.log URL, backup files found on disk and the uploads folder; the HTTPS check asks for the home page over http and https and the security headers check once over https. „Check now” for PHP in uploads writes two harmless test files there, requests them and deletes them. After a file is moved to quarantine or replaced with its original, or after a security update, the plugin requests the home page and the login page to see that the site still answers. The check of what visitors and search engines see requests the home page and the WooCommerce checkout with a browser user agent, as Googlebot and with a Google search referrer. A running scan calls your own admin-ajax.php to continue in the background.

Why does the plugin register a public AJAX action?

The AJAX action shieldwave_worker lets a running scan continue in the background; it does nothing without the random token of the running scan. The plugin’s REST routes answer administrators only.

My headless front end reads authors from the REST API.

With login protection on, the REST API user list answers only logged-in requests, so an anonymous request for an author gets an error. To keep the list public, add add_filter( 'shieldwave_hide_user_list', '__return_false' ); to a small plugin or to your theme’s functions.php. The same filter also brings back the author fields in embeds and the users sitemap.

Does it work on multisite?

Yes, network-wide. It is activated for the whole network (Network Activate): two-factor login and login protection need that, because one sign-in works on every site. Scanning, the schedule, alerts, the settings screens and the optional ShieldWave account all live on the main site, in the Network Admin, for network administrators only. Every other site of the network enforces the same choice made there: when login protection, two-factor or a hardening switch is on, it is on for that site too, with no separate settings screen to set up. A lockout after failed logins is shared by the whole network, not counted per site, so an address cannot dodge the limit by trying a different site.

Does it work without WP-Cron?

Yes. If WP-Cron is disabled or loopback requests are blocked, scans still run while the ShieldWave screen is open, and scheduled scans run whenever your server cron calls wp-cron.php.

How is the score calculated?

It starts at 100. For each check, the most serious open issue takes off points: critical 30, high 15, medium 8, low 3. The most serious issue on the site then sets the range, as in the outside scan on shieldwave.io: 0-39 with a critical issue, 40-59 with a high one, 60-100 with neither. Ignored issues, hints and checks that could not run take nothing off.

Which languages does it speak?

English, Arabic, Chinese (Simplified), Dutch, French, German, Indonesian, Italian, Japanese, Korean, Polish, Portuguese (Brazil), Russian, Spanish, Swedish, Turkish and Vietnamese. The screens, the login protection and the alert emails follow the language of your WordPress admin, and Arabic gets a right-to-left layout. Regional variants such as Spanish (Mexico), German (Switzerland) or French (Canada) use the main language. For these languages the plugin’s own translation is used, and a translate.wordpress.org pack fills only what it lacks; other languages use the pack from translate.wordpress.org once one is complete.

The old ShieldWave Security from shieldwave.io is installed too.

Builds downloaded from shieldwave.io before the directory listing were called ShieldWave Security, numbered up to 3.6.6, and live in the folder shieldwave-security. They cannot update themselves to this plugin. Keep Ensomedia Security active, deactivate ShieldWave Security, then delete it on the Plugins screen: the settings, results and two-factor set-ups carry over, because Ensomedia Security keeps them while the old copy’s clean-up runs. The Plugins screen shows a notice while an old copy is installed.

What does quarantine do, and can I undo it?

A finding of medium severity or higher about one file can move that file into quarantine. The file is stored encoded, so it cannot run, in a folder the web server refuses. wp-config.php, the main .htaccess, WordPress’s own files and files the site loads on every request are never moved, and if the site stops working after a move, the file goes back. Nothing is moved unless you press the button.

Restore puts back the same bytes, with their date and permissions, where the file was. Quarantined files are kept in a folder inside wp-content that is removed, with the files the plugin put there, when the plugin is deleted, so restore what you want to keep before you delete the plugin.

What do the sign-in checks do, and how do I get back in?

All of them are under ShieldWave > Settings > Sign-in checks and Spam traps, and all are off until you turn them on.

  • Sign in with a passkey, without a password. The login page gets a button. The passkey checks your fingerprint, face or device PIN, so it stands for both the password and the code. Needs passkeys on, and a passkey your device keeps for the site; one added only as a second step may need adding again. Your password keeps working.
  • Bot check. The browser solves a small puzzle (a proof of work) before the login, registration or reset form is sent. It needs JavaScript and sends nothing anywhere. Cloudflare Turnstile is the other choice, with the keys of your own Cloudflare account. Record only writes to History what Block would stop. Trusted addresses are never checked, and if Cloudflare cannot be reached the form goes through. To turn it off without the dashboard, add define( 'SHIELDWAVE_BOT_CHECK_OFF', true ); to wp-config.php or run wp shieldwave bot-check off.
  • Breached passwords. A new password is refused if the Pwned Passwords service of Have I Been Pwned knows it. Only the first 5 characters of its SHA-1 hash are sent. At sign-in an account with such a password is asked to change it, never blocked. If the service does not answer, the password is accepted.
  • Hidden login address. The login page moves to an address you choose and wp-login.php shows „not found”. This hides the login page, it does not secure it: login protection and two-factor login still do that. The new address is emailed to you when you set it. If you lose it, add define( 'SHIELDWAVE_LOGIN_URL_OFF', true ); to wp-config.php or run wp shieldwave login-url off, and the login page is back at wp-login.php. Not available on multisite or beside another plugin that moves the login page.
  • Spam traps. Comments, registration, Contact Form 7 and WPForms get a hidden field and a signed time stamp. A form filled in by a program, or sent within 3 seconds, is caught. With Block, a caught comment goes to the Spam folder, where you can approve it. Signed-in visitors and trusted addresses are never checked. Clear the page cache once after turning it on.

What does the plugin store about logins?

When logins are paused after too many failed attempts, the plugin records the IP address and the typed user name (the name only when the account exists). After a successful login it sets a cookie whose name starts with shieldwave_kd_. It holds only a random identifier, lets that browser keep signing in while someone else guesses the password for the same account, expires after 90 days and stops working when the password changes.

What happens to my data when I delete the plugin?

The plugin removes its settings, results, tables, scheduled tasks, user settings, two-factor and passkey data, the quarantine folder and its block in the uploads .htaccess file. If the site is connected to shieldwave.io, it first asks shieldwave.io to remove the site and its results.

What does connecting to shieldwave.io do?

It shows the site in your shieldwave.io dashboard with its score and open problems, next to the outside scan of shieldwave.io, and confirms that the domain is yours, which the full outside scan needs. Every site you connect shows up, on the free plan too. Everything in the plugin works the same without it.

I think a finding is wrong.

Open a topic in this plugin’s support forum with the check name and what you see. False positives are treated as bugs.

My site was hacked. Can someone clean it?

When the plugin finds signs of a break-in, the Overview links to an order form for a one-time cleanup by ENSOMEDIA, the maker of this plugin, at shieldwave.io/cleanup, and the link sends nothing from your site.

How do I report a security problem in the plugin?

Follow https://shieldwave.io/legal/en/vulnerability-disclosure?utm_source=wordpress&utm_medium=plugin&utm_campaign=readme. Please do not post it in the public support forum.

Which fonts does the plugin use?

The admin screens use the Inter typeface by The Inter Project Authors, licensed under the SIL Open Font License 1.1 (assets/fonts/inter-license.txt). It is loaded from the plugin itself, only on the ShieldWave screens.

Recenzii

Nu există nicio verificare pentru acest modul.

Contributori și dezvoltatori

„Ensomedia Security powered by shieldwave.io” este un software open-source. La acest modul au contribuit următoarele persoane.

Contributori

„Ensomedia Security powered by shieldwave.io” a fost tradus în 4 locale. Mulțumim traducătorilor pentru contribuția lor.

Tradu „Ensomedia Security powered by shieldwave.io” în limba ta.

Te interesează dezvoltarea?

Răsfoiește codul, vezi depozitarul SVN, sau abonează-te la jurnalul de dezvoltare prin RSS.

Istoric modificări

1.1.28

  • WP-CLI: the rescue commands wp shieldwave login-url off, wp shieldwave bot-check off and wp shieldwave two-factor disable now run under the names the readme and the Settings screen give.
  • Sign-in: an account whose only second step is a passkey sees on the second step how to get back in if the device is lost.
  • Custom login address: the notice says the address was emailed only when the email went out; otherwise it asks you to write the address down.
  • Firewall: country blocking behind Cloudflare works without typing in the Cloudflare ranges; the plugin now ships them as the default list, and your own list replaces it. Ordinary traffic (WooCommerce, the block editor, REST, comments, contact forms, sign-in) is covered by tests and passes with every rule on.
  • Translations reviewed in all 16 shipped languages.

1.1.27

  • Sign-in: optional passwordless sign-in with a passkey, an optional bot check on login, registration and password reset (proof of work in the browser, or Cloudflare Turnstile with your own keys), an optional check of new passwords against known breaches (only 5 characters of a hash leave the site), and an optional custom login address with a way back through wp-config.php or WP-CLI. All start off.
  • Spam traps: hidden fields and timing on registration and comments, and on Contact Form 7 and WPForms when they are active. Off until you turn them on.
  • Activity log: successful sign-ins, accounts created and deleted, role changes, post and page edits (who and when, no content), plugin and theme installs, updates and deletions, and changes of key settings. Filter by type and person; the CSV export includes them.
  • Backup check: the plugin looks for a backup plugin and the date of its last backup, and reports when there is none from the last 7 days. If the date cannot be read, the check says so instead of raising an alarm.
  • When a break-in is found, the overview links to ordering a cleanup from ENSOMEDIA.

1.1.26

  • Request firewall (opt-in): local attack rules, IP/range and trusted-country blocks, request and 404 limits, must-use and optional pre-WordPress loading, scoped exceptions and a local history. All settings use a separate option, start off and do not change virtual patches. Includes translations in all 16 shipped languages and tests for normal forms, forged sessions, uploads, concurrent storage, early loading and safe removal.

1.1.25

  • Turn on protection: after activation, and once after this update, the plugin asks whether to turn on vulnerability alerts, the threat feed and virtual patches in one step, and says what leaves the site and where it goes. Nothing that sends data is turned on without your consent. The AI second opinion stays a separate choice. An update does not change your settings.
  • Virtual patches that need no connection are on for new installs.
  • Cleanup of injected code: when a scan finds code injected into a theme, a custom plugin or uploads, or a script or hidden link injected into posts or options, the plugin shows the exact change, makes a backup and applies it only when you approve it. Every cleanup can be undone. New administrator accounts it cannot explain are reported, never deleted.

1.1.24

  • PHP version check: php2shell (CVE-2026-109618 and CVE-2026-109619, rated 9.2 of 10, remote code execution without logging in; PHP fixed it on 2026-10-21 in 8.5.12, 8.4.27, 8.3.36 and 8.2.35). The check compares your web server’s exact PHP version with the fixed release of its branch. Branches 8.1 and older get no fix from the PHP project. The finding is high, because the flaw is critical. Linux distributions and hosts often ship the fix without changing the version number, so it tells you to ask your host whether the fix is installed and does not say the site is vulnerable.

1.1.23

  • Updating this plugin by uploading its ZIP over the old version (Plugins > Add > Upload > Replace current with uploaded) no longer reports the plugin as changed without an update. The checksum check no longer moves the change time of files the earlier scan saw, which made the recorded update look older than the files. Found on a hand check of 1.1.22 on a real site, where it showed as high until WordPress.org published the version.
  • The virtual patches loader the plugin writes into the must-use plugins folder is no longer reported as a new file in a highly trusted location.
  • Caching, object cache and query plugins write advanced-cache.php, object-cache.php and db.php into wp-content. When an active plugin that ships or generates such a file names itself in it, the change is low and names the plugin, not high. Any other drop-in stays high.
  • The handler cPanel writes for the account’s PHP version on LiteSpeed and CloudLinux (ea-php82___lsphp, as AddHandler or AddType) is no longer counted as a rule that runs files as PHP in .htaccess.
  • A change to wp-config.php that only adds plain settings, such as WP_CACHE or FORCE_SSL_ADMIN written by a caching, security or SSL plugin, is low and names the settings. The plugin remembers which lines the file had as hashes only, never as text. Code, includes and changes to the database or site address settings stay medium. The advice never says to delete wp-config.php.
  • A script found by reading a public page is high, not critical: the page is read from outside and matched by signatures, so critical stays for what the files or the database prove.
  • Advice no longer tells you to delete or remove something you cannot identify (odd file names and links, a changed PHP file, an unknown file in the site folder, a new plugin folder, a hidden administrator). It says to ask your developer or host to look at it and to keep a copy first. The warning about a break-in stays where a malware signature or a known bad file is the evidence.
  • The content check no longer takes more than a minute on a very large post on PHP 8.2 and older. A post of 1.6 MB with 120,000 paragraphs took 80 seconds on PHP 7.4 to 8.2 and under a second on 8.3 and 8.4.
  • Unused themes can be deleted from their finding, as unused plugins already could. Only themes the finding lists are offered, never the active theme, its parent, a theme another site of a network uses or the default fallback theme, and WordPress’s own delete function does the work.
  • Password hints on the settings screen are no longer cut off, and the decoy login checkbox is aligned.
  • Before release, the plugin was run through a test site with every optional feature switched on (baseline, features on, two rescans), through an update from 1.1.18, 1.1.19 and 1.1.20, through a two-site network, through PHP 7.4 to 8.4, and through the 200 most popular WordPress.org plugins.

1.1.21

  • The content check now reads every site option, not only widgets, theme settings and header code, as well as the snippets of the Code Snippets plugin and account data. In those places it reports only what a real setting never carries: a script from a bare IP address or a throwaway domain, a hidden decoded loader, a card skimmer or code the malware signatures call malicious. Cached answers of other services, this plugin’s own data and the signature stores of other security plugins are left out, and a value of many megabytes is read as its beginning and its end. Such findings go to „Ask your developer”.
  • An administrator that code on the site hides from the list of users is reported. The administrators are now read from the database and compared with the list WordPress gives. Two new signatures look for code that leaves a named account out of that list or lowers the administrator count above it.
  • A new administrator made by an administrator who signs in with a password alone is now a low, unscored item to confirm instead of a note: the record alone does not show who used that password.
  • New application passwords of administrators, changes of the site address, the WordPress address and the administration email address, scheduled tasks whose code lives in the uploads folder, has no file of its own or is a PHP command function, and database triggers on WordPress tables are reported. A change made by an administrator who signs in with a second factor is not.
  • Decoy login names and the decoy path lock an address out only on its second use within an hour, and never a signed-in visitor, a request another website made the browser send or the shared address of a CDN that is not set as a trusted proxy.
  • Turning off the threat feed, the vulnerability lookup, the AI second opinion, the decoy path lockout or security updates of a plugin, and ignoring a whole group of findings, now ask for your password or a code.
  • The threat feed never takes a feed older than the one it has, also right after a plugin update.
  • The suggested WP-CLI commands for a vulnerable plugin quote its folder name and version.
  • A changed core, plugin or theme file can be replaced with its original: one button on the finding downloads that file of the installed version from WordPress.org, uses it only when it matches the official checksum and keeps the changed file in quarantine, where restoring it undoes the repair. If the site answers with an error afterwards, the changed file is put back at once.
  • A new check, What visitors and search engines see, reads the home page and the checkout as a visitor, as Googlebot and as a visitor from Google search, and reports injected scripts, redirects only search visitors get and links only Googlebot gets. It also looks for folders of spam pages, sitemaps of other sites and extra Google verification files in the site folder.
  • Scripts that load code from an address hidden in encoded text are reported, in files and in published posts, as is PHP that shows search engines other content.
  • With a connected account, decoy hits appear in the shieldwave.io dashboard. Only a keyed hash of the address is sent.
  • Virtual patches also run on the sites of a multisite network and on the login page, XML-RPC, WP-Cron, robots.txt and the sitemaps. They read the body of PUT, PATCH and DELETE requests and JSON sent with any content type, compare a value also the way plugins clean it, and keep working for 14 days when the threat feed cannot be refreshed. A large post saved in the block editor is no longer blocked.
  • A finding is never lost because its text is too long for the database. Stored content made to slow the scan down, exhaust its memory or hide deep inside page builder data is read in small parts and to the end.
  • An administrator whose role is stored in a form WordPress never writes is found.
  • No login name or post title goes to shieldwave.io with a finding.
  • Replace with the original also works for the WordPress files in the site root, checks that the installed version is still the scanned one, and says so when it cannot confirm the new file. Putting a kept copy back needs the same update permission as the repair.
  • Security updates install only offers from WordPress.org, and never one that WordPress.org, the host or another plugin turned off.
  • Decoy records cannot push lockout records out of the history, a decoy hit never locks out the address of a proxy or CDN, a ShieldWave scan reaching the decoy path is written to the history without a lock, and taking a name off the decoy list asks for your password.
  • Ignoring a critical finding, or more than five findings one by one within an hour, asks for your password.
  • What visitors and search engines see follows redirects within the site, says when a page could not be read in full and keeps the earlier findings about that page open until it can.
  • Files made to slow down the malware rules or exhaust their memory are read in linear time and small memory. A file that stops the scan twice is skipped and reported instead of stopping every scan. A permission check that every user passes no longer hides request input that reaches code.
  • The suggested privacy policy text says which decoy details go to shieldwave.io with a connected account.

1.1.20

  • The check for PHP printing errors on pages no longer reports display_errors as on when the server’s php.ini turns it on and the site turns it off for its own folder (php_flag in .htaccess, .user.ini or the PHP-FPM pool). Checks started with the Run checks button and the scheduled scans now use the value a normal admin page sees. Until an admin page has been opened after the update, the check says the setting could not be assessed.
  • A server configuration file is no longer reported as changed when WordPress rewrote only its own block of it, on a site where the plugin was installed before version 1.1.10 or where an earlier report kept no copy of the lines outside the blocks. Such a file was reported on every scan, for example after the site address moved to https. A rule outside the blocks that runs files as PHP, prepends a PHP file or sends visitors to another site is still reported. The finding for a changed configuration file now lists the lines added and removed outside the blocks of WordPress and plugins, and no longer says that it disappears after a new scan.

1.1.19

  • Decoys, off until you turn them on under Settings: login names no account has and one Disallow line for a random path in the robots.txt that WordPress serves. A use of either is refused, written to the history and mailed once a day per address, and can lock the address out with the login protection. Nothing is created: no user, no file.
  • Detects four kinds of script that attackers put into hacked sites to attack visitors: a fake CAPTCHA that asks the visitor to paste a command (ClickFix), a fake browser update page, a loader that reads its code from a blockchain contract (EtherHiding) and a card skimmer that sends payment card fields to an outside host. Plugin and theme files are checked, and so are scripts stored in posts, page builder data, widgets and options. A finding needs every sign of its kind in the same script, so copy buttons, CAPTCHA services, web3 sites and payment forms are not reported.

1.1.18

  • No PHP warning on hosts whose open_basedir setting leaves out the folder above WordPress. The plugin checks that setting before it looks at a wp-config.php there, a debug log or any other file outside the allowed folders.
  • Unused plugins are one finding with their number and names, and so are unused themes, so the Overview and shieldwave.io show the same count. A plugin or theme with a finding of its own keeps that finding too.
  • The note on extra files of a plugin built outside WordPress.org says what ShieldWave did: it has no copy of the author’s source for that version, so it did not compare those files.
  • With WordPress in a subfolder of the site, a copy of wp-config.php in the folder above (the web root) is requested at the site address like a copy in the WordPress folder: high when it downloads, an info note when the server refuses it. Before, it was low without a request.
  • After a plugin update the threat feed is downloaded again, and a stored copy that another plugin version checked is replaced even when the feed has not changed. Before, a copy an older version had stored without the vendor file lists stayed in use. „Copy for your developer” and the sync name the feed version, when it was issued and the plugin version that stored it.
  • Security updates, off until you choose a plugin: when a release fixes a known vulnerability of the installed version, WordPress’s own automatic updates install it (WordPress 6.6 or newer, which puts the previous version back if the update fails), the plugin then checks that the home page and the login page answer, and every step goes to the activity log.
  • Virtual patches, off until you turn them on under Settings. With the live threat feed on, a small must-use file stops a request that exploits a known vulnerability of an installed plugin, for as long as the installed version is affected. Patch rules come only from the signed feed. Each patch only records matching requests until you let it block them, and a blocked request gets a plain 403. Turning the switch off removes the file.
  • Arabic: severity names match shieldwave.io, and instructions address the reader without masculine imperatives.
  • Polish: one-letter words stay with the next word, so none ends a line.
  • A changed .htaccess, .user.ini or php.ini is described as a server configuration file: the steps for your developer say to undo the lines nobody added and keep the file, instead of treating it as a PHP file and suggesting to delete it.
  • An update that adds files to a plugin or theme WordPress.org cannot verify, including one installed by uploading a ZIP, no longer makes every changed file „changed outside an update”. Before, the files the update added were indexed first and made the update look older than the change.
  • The readme fits the WordPress.org limits again: the description and External services are shorter, quarantine and login data moved to the FAQ, and the changes before 1.1.10 moved to changelog.txt.

1.1.17

  • The score follows the same severity bands as shieldwave.io: an open critical finding keeps it at 39 or below, a high one between 40 and 59.
  • Detects file-dropper backdoors: request input written into a PHP file, a written file’s path chosen by the request, and decoder names assembled from pieces whose result is run.

1.1.16

  • One score everywhere. The Overview, the weekly email, WP-CLI, the heartbeat and the sync all show the score stored with the last scan, and it is stored again when you ignore or restore an issue, when a live check runs and when an AI second opinion arrives. Before, the Overview and the sync could show two numbers for the same moment.
  • A known vulnerability is rated by the access it needs. Without login it keeps the advisory’s rating, and critical needs code execution, SQL injection, an authentication bypass, an arbitrary file upload or a CISA KEV entry. A subscriber, customer or contributor account makes it high at most, author, editor or shop manager medium at most, administrator low. An advisory without a rating is low, with a note. „Update to” names the version that fixes every listed advisory.
  • One cause, one finding. An unused plugin WordPress.org closed for a security issue that also has a known advisory is one finding, which says it was closed, plus a note that it is unused. A file reported by more than one check (it differs from its release, it is new since the last scan, the malware check flags it) is counted once, at the most serious finding.
  • WordPress PHP translation files (.l10n.php) next to a plugin’s or theme’s translations are no longer „a PHP file the release does not have”. The malware check still reads them.
  • A request from the server to its own https:// address that fails is a note that HTTPS could not be checked, not „login not served over HTTPS”. A refused HTTPS port while http:// answers is still high.
  • Scans started from WP-CLI or a system cron no longer judge the web server by the command line’s PHP. The plugin remembers the web server’s PHP version and display_errors from your admin pages. Until it has seen them, those two settings are not assessed. WP_DEBUG_DISPLAY set to null follows php.ini, as WordPress does.
  • Notes instead of findings: an administrator created with WP-CLI, XML-RPC multicall when another login limiter is active or a firewall answers, PHP that stops getting security fixes within four months, and a leftover scheduled task with only a web address. On a network, a theme active on any site is in use, and a default theme a WordPress update adds is not „added outside the installer”.
  • A base64_decode counts only when the decoded text reaches code that runs or includes it, so the plugin no longer flags its own passkey code. Drafts, pending and private posts are read with the malware signatures only. Security keys follow WordPress’s own rule (empty, the sample phrase or shared), not their length. A stale wp-content/debug.log is checked even when WP_DEBUG_LOG names another file.
  • Private findings keep their identity when you replace the security keys in wp-config.php. Low findings no longer suggest looking for a break-in, and a few texts were reworded to say what was observed.

Changes before 1.1.16 are in changelog.txt in the plugin folder.