WordPress.org

Plugin Directory

Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner…

Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner…

Description

Premium Security. Zero Cost.

Vigilant provides enterprise-level WordPress security features completely free. No premium version, no upsells, no hidden features behind paywalls.

Protect your site with a complete security suite: firewall, two-factor authentication, brute force protection, security headers, file integrity monitoring, closed plugin detection, malware detection, user management, security audit logging, under attack mode, verification of its own files and much more.

Once activated, Vigilant immediately applies firewall rules against common attacks (SQL injection, XSS, file inclusion), security headers, login attempt monitoring, XML-RPC blocking, WordPress version hiding and sensitive file protection (.htaccess, wp-config.php).

One-Click Security Presets

Choose a preset and get protected instantly:

Standard – Balanced security suitable for most websites. Enables all modules with sensible defaults that won’t interfere with normal site operation.

Maximum Security – Strictest settings for high-security sites. Tighter rate limits, stronger CSP rules, mandatory admin notifications. May require fine-tuning for some setups.

You can always customize individual settings after applying a preset.

Under Attack Mode

Is your site under active attack? Activate Under Attack mode with one click and stop malicious traffic instantly:

  • JavaScript challenge – Every visitor must pass an automatic browser verification before accessing your site. Real browsers solve it in seconds, bots get blocked completely
  • Aggressive rate limiting – Requests limited to 30 per minute with 15-minute blocks for offenders
  • HTTP method restriction – Only GET, POST and HEAD allowed; PUT, DELETE, PATCH and OPTIONS are blocked
  • Empty user agent blocking – Requests without a user agent header are rejected
  • Full XML-RPC lockdown during the attack
  • REST API restriction – Only authenticated users can access the REST API
  • Auto-deactivation – Mode turns off after 4 hours so you never forget it’s on
  • Email notifications when the mode activates and deactivates
  • HMAC-signed cookies – Verified visitors get a signed cookie so they only see the challenge once

Under Attack mode works independently from your preset configuration. Your regular settings are preserved and restored when the mode deactivates.

Two-Factor Authentication (2FA)

Add a second verification step to your WordPress login:

  • Authenticator app (TOTP) – Google Authenticator, Authy, Microsoft Authenticator or any TOTP-compatible app
  • Email codes – One-time 6-digit verification codes sent via email
  • QR code setup directly in user profiles
  • 10 backup codes for emergency access if you lose your device
  • Configurable grace period for users to set up their authenticator app
  • Trusted devices – optionally let users skip 2FA on recognized devices for 30 days
  • Role-based enforcement – require 2FA for administrators, editors or any role
  • Exclude specific users from 2FA requirements
  • Admin tool to reset TOTP for users who lost their authenticator
  • Configurable code expiry, attempt limits and email sender name
  • User notification emails when 2FA is enabled or the method changes

Firewall Protection

Block malicious requests before they reach WordPress:

  • SQL injection blocking
  • XSS (Cross-Site Scripting) attack prevention
  • File inclusion protection (LFI/RFI)
  • Directory traversal blocking
  • Bad query string filtering (catches generic suspicious patterns the specific blockers miss)
  • Bad bot detection and blocking
  • Block requests with empty user agent
  • Rate limiting against DDoS and brute force, with optional progressive lockouts
  • IP whitelist and blacklist management (IPv4 and IPv6, with CIDR ranges and wildcards)
  • User-Agent whitelist and blacklist with partial matching
  • Visitor IP detection: from the connection by default, which cannot be spoofed, or from a proxy header behind Cloudflare, a reverse proxy or a load balancer, with a notice when a proxy is detected but not set up
  • HTTP method restriction
  • Server-level file protection via .htaccess: block direct access to wp-config.php, .htaccess, wp-includes/ and sensitive files (.log, .sql, .bak, .ini, debug.log, readme.html, etc.)
  • Block PHP execution in /uploads (one of the most common post-exploit vectors)
  • Block web access to the folders where WordPress unpacks updates
  • Disable directory browsing

Login Security

Stop unauthorized access attempts:

  • Limit login attempts with configurable thresholds
  • Progressive lockouts – longer blocks for repeat offenders
  • Custom login URL – hide wp-login.php from bots
  • Login URL change notifications to all admin-area users
  • Hide login error messages – don’t reveal valid usernames
  • XML-RPC control: leave it on, block only the pingback methods (recommended, it closes the amplification vector while the mobile app and Jetpack keep working), or disable it completely
  • Application passwords control
  • Email notification when an IP is blocked for exceeding login attempts
  • Admin login notifications via email
  • IP whitelist for trusted locations

User Security

Comprehensive user account protection:

  • Block insecure usernames (admin, test, root, etc.) on new registrations
  • Warn about existing users with insecure usernames so you can rename or remove them
  • Block author scanning – intercept ?author=N URLs so WordPress doesn’t redirect them to /author/USERNAME/ and leak the login slug
  • Force strong passwords with minimum length
  • Password expiration with configurable intervals
  • Password history – prevent reusing old passwords
  • Force password reset – by specific users, by role, or all users (post-hack recovery)
  • Session limits – control concurrent logins per user
  • Session management – view and revoke active sessions
  • Email verification for new registrations
  • Registration approval workflow – manually approve new users
  • Admin account monitoring – alerts for new admins, email changes, password changes, privilege escalation
  • Display name protection – prevent exposing login username publicly

Security Headers

Achieve Grade A security ratings:

  • Content Security Policy (CSP) with a WordPress-compatible default policy and Report-Only mode for safe testing before enforcing
  • HSTS (HTTP Strict Transport Security) with includeSubdomains and preload options
  • X-Frame-Options – prevent clickjacking
  • X-Content-Type-Options – prevent MIME sniffing
  • Referrer Policy control
  • Permissions Policy (camera, microphone, geolocation, payment, USB)
  • Cross-Origin policies (COEP, COOP, CORP)
  • HTTPS enforcer with automatic mixed content fix
  • Server fingerprint hiding – the Server: header is neutralized and X-Powered-By and other fingerprinting headers are stripped from responses

File Integrity Monitoring

Detect unauthorized changes to your files and compromised plugins:

  • WordPress core against official checksums, plus files added to wp-admin and wp-includes
  • Plugins against WordPress.org checksums, themes against their WordPress.org package
  • Whatever has no official copy (other plugins and themes, must-use plugins, drop-ins, the rest of wp-content) searched for hidden code
  • Critical config files (wp-config.php, .htaccess, the secrets.php drop-in) monitored against baseline, detecting code injection even in files with no official checksum
  • Closed and removed plugins detection: a daily check against WordPress.org flags any installed plugin that was closed or silently removed, with per-plugin Ignore
  • Line-level diff view of changes, with per-file approval workflow
  • Extra file detection in plugins and themes (files not in original distribution)
  • Uploads scanning for PHP, double extensions and .htaccess files
  • What each finding usually is and what to do about it
  • Root directory scanning for non-core PHP files (common attack vector)
  • String concatenation obfuscation detection
  • Configurable notification levels and an ignore list to dismiss known files
  • Excluded paths and file extensions
  • Scheduled automatic scans (daily, weekly)
  • HTML formatted email alerts with severity sections, including a dedicated section for closed plugins

Self-Protection

A tampered security plugin is worse than none, because it keeps reporting that everything is fine. Vigilant verifies its own files against the checksums WordPress.org publishes, a SHA-256 manifest shipped with the plugin and a fingerprint of that manifest stored in the database:

  • At the start of every integrity scan, right after every update, and when the version on disk changes outside the WordPress updater
  • Modified, missing and added files, symbolic links and a replaced or deleted manifest are reported, by email with the default settings
  • Its own scheduled tasks are watched and scheduled again if something removes them
  • Its own block in File Integrity and a check in Security Check, with what each finding means and how to fix it, and no way to switch it off
  • One click repair that reinstalls Vigilant from WordPress.org, keeping your settings, tables and log

It detects tampering, not vulnerabilities in Vigilant itself. SECURITY.md explains what it covers, what it does not, and how to verify your installation from outside the server.

Security Audit

Track everything happening on your site:

  • Successful and failed login attempts
  • Two-factor authentication events
  • User account changes (creation, deletion, role changes)
  • Content modifications (posts, pages)
  • Plugin and theme activations/deactivations
  • Security events and blocked threats
  • Secrets API changes, by name, never by value
  • HTTP request method tracking and filtering (GET, POST, PUT, DELETE)
  • Enhanced log detail popup with grouped sections and quick actions
  • One-click add IP or User-Agent to firewall whitelist/blacklist from log entries
  • Direct IP lookup links to AbuseIPDB
  • Configurable retention period, CSV export, and filtering by event type, severity, request method or date

Audit Alerts – get an email when the audit log points to something worth your attention, off by default and configured under Security Audit:

  • Immediate alerts the moment a serious event is logged, by minimum severity (a new administrator, a closed plugin or a privilege escalation are all logged as Critical)
  • Threshold alerts when a category of events spikes within 30 minutes, or 1, 6 or 24 hours, counting only warning and critical events so routine activity never trips them
  • A single anti-repeat cooldown keeps a storm of events down to one notice instead of flooding your inbox
  • Active alerts surface in Settings & Tools, the Dashboard, the configuration level and the Security Check
  • “Send test email” button to confirm delivery

Security Check

On-demand security audit built into the Dashboard. No external services, no accounts, no API keys – everything runs on your server:

  • More than 50 checks across 6 categories: SSL/TLS, HTTP Headers, WP Exposure, Access & Auth, Sensitive Files and Internal Checks
  • Single 0-100 score with A-E grade, plus per-category breakdown and explanatory details for every check
  • 17 exclusive internal checks impossible from the outside: PHP end-of-life status, PHP security fixes, pending updates, inactive plugins, closed or removed plugins, Vigilant self-protection, file permissions, default salts detection, wp_ table prefix, admin username, administrators without 2FA enrolled, module status, recent audit errors, last File Integrity scan result and whether audit alerts are configured
  • DNS-only reputation lookup against Spamhaus ZEN, Barracuda BRBL and SpamCop SCBL (informational – listings are flagged but don’t deduct from the score)
  • Two-phase scan: fast local checks appear in under a second, remote checks stream in as they complete
  • Weekly automatic scan with opt-in email alert if the score drops by 10+ points or a new critical check starts failing
  • 30-scan history with sparkline trend and delta chip
  • “Go to setting” fix link on every failing check, jumping straight to the exact Vigilant field that resolves it
  • Smart header diagnostics that report “configured but not being served” when a cache/CDN overrides your headers

WordPress Hardening

Layered protection at the WordPress level – admin, content, head, feeds and database:

  • Lock down the admin: disable the built-in plugin and theme file editor, block installations and updates from the admin area, and force HTTPS for the admin area. Compatible with any hosting layout, respecting values already in place and never overriding them
  • Disable WordPress’s internal page-view cron when you already have a real server-side cron job configured
  • Dashboard warning when debug mode is left enabled in production, so error output never leaks to visitors
  • Hide your WordPress version everywhere it can leak: from the HTML head, from RSS and Atom feeds, and optionally from every script and style URL on the front-end (stripping only the WordPress version itself, leaving plugin and theme cache busting intact)
  • Automatic daily removal of readme.html, license.txt and licencia.txt from the WordPress root, which otherwise expose your version
  • HTML head cleanup – remove the RSD link, Windows Live Writer manifest, shortlink header and REST API discovery link
  • Database hardening – check for the default wp_ table prefix and one-click rename tool with full backup before the change
  • Comment security – honeypot field against spam bots, force moderation on every new comment, close comments on old posts, disable pingbacks and trackbacks
  • Feed management – completely disable RSS and Atom feeds, or only disable them when the site has no published content

REST API Security

Control API access to your site:

  • Three access modes: public (default WordPress behavior), authenticated only (closes the API to anonymous visitors), or selective (custom allow/block lists)
  • Block user enumeration via /wp-json/wp/v2/users
  • Protect any list of sensitive endpoints from anonymous access
  • Per-plugin compatibility toggles so authenticated mode doesn’t break the front-end: WooCommerce, Contact Form 7, Gravity Forms, WPForms, Elementor, Jetpack. oEmbed and Site Health endpoints stay accessible by default

Security Tools

Utilities included:

  • Database Backup – Download a full or partial database backup as ZIP with table selection
  • Database Prefix Change – Change the default wp_ prefix to a random secure prefix
  • Export/Import Settings – Transfer your configuration between sites
  • Configuration Backup – Download wp-config.php, .htaccess and robots.txt as a ZIP
  • Reset to Defaults – Start fresh with one click

Safe by Design

Vigilant validates .htaccess and wp-config.php before writing to them, and keeps no copy of them, because they hold your database password: download a backup from Settings & Tools first.

Deactivating removes its blocks from both files and brings back the lines it had commented out. Switch Under Attack mode off before deactivating.

Vigilant checks its own files too, and tells you how to check them yourself: every release ships a MANIFEST.sha256 that sha256sum can verify, and WordPress.org publishes the same checksums for comparison.

Why Vigilant?

Most WordPress security plugins reserve their best features for paid plans. Vigilant gives you everything upfront – no premium tier, no feature locks, no upsells. Firewall, 2FA with authenticator app, security headers, file integrity scanner, security audit, on-demand Security Check with weekly regression alerts, and more. All free, all maintained, all following WordPress coding standards.

We maintain a detailed feature comparison between Vigilant and other popular security plugins (Wordfence, Solid Security, AIOS, Sucuri, SG Security). See what each offers in its free version and where Vigilant fills the gaps.

View the full comparison

Support

Need private support or custom development?

Do you need one-on-one help, priority troubleshooting, or a custom feature, integration, or tweak built specifically for your site? I offer private support and custom development. Just contact me and tell me what you need.

Need help or have suggestions?

Love the plugin? Please leave us a 5-star review and help spread the word!

About AyudaWP

We are specialists in WordPress security, SEO, AI and performance optimization plugins. We create tools that solve real problems for WordPress site owners while maintaining the highest coding standards and accessibility requirements.

Screenshots

Installation

  1. Upload the plugin files to /wp-content/plugins/vigilante/ or install directly from the WordPress plugin repository
  2. Activate the plugin through the ‘Plugins’ menu in WordPress
  3. Go to ‘Vigilant’ in the admin menu
  4. Apply a security preset or customize individual module settings

Requirements:

  • WordPress 6.2 or higher
  • PHP 7.4 or higher
  • Apache or LiteSpeed server (for .htaccess features)
  • SSL certificate recommended for HSTS

FAQ

Will this plugin slow down my site?

No. Vigilant is optimized for performance. The firewall uses efficient pattern matching, database queries are cached with transients, and .htaccess rules execute at server level before PHP even loads.

What happens when I activate the plugin?

Vigilant applies its default settings: all modules on, with balanced values for most sites. On Apache and LiteSpeed that writes two blocks to .htaccess, and it writes one block of constants to wp-config.php.

If wp-config.php already defines DISALLOW_FILE_EDIT, DISALLOW_FILE_MODS, FORCE_SSL_ADMIN, FORCE_SSL_LOGIN, DISABLE_WP_CRON, WP_DEBUG, WP_DEBUG_LOG, WP_DEBUG_DISPLAY or SCRIPT_DEBUG, Vigilant comments that line out, marks it and sets the value from its own settings in WP Hardening. If you rely on one of them, check that tab after activating. Your lines come back when you deactivate.

Vigilant keeps no copy of those two files. If you want one, make it before activating.

What happens when I deactivate the plugin?

Vigilant removes its Protection and Security Headers blocks from .htaccess, removes its constants from wp-config.php, brings back the lines it had commented out there and clears its scheduled tasks.

Two things to know:

  • Switch Under Attack mode off first. Its .htaccess block is removed when the mode ends, not on deactivation.
  • If you delete the plugin folder by FTP instead of deactivating, nothing is reverted: remove the blocks between the Vigilante markers by hand.

How does two-factor authentication work?

Vigilant supports two 2FA methods. With the authenticator app (TOTP), you scan a QR code in your profile to link an app like Google Authenticator or Authy, then enter a 6-digit code from the app on every login. With email codes, you receive a one-time code via email after entering your password. If enabled by the site administrator, you can mark your device as trusted to skip 2FA for 30 days.

What if I lose my phone or authenticator app?

When you set up TOTP, Vigilant generates 10 backup codes. You can use any of them as a one-time replacement for the authenticator code. If you run out of backup codes, an administrator can reset your TOTP from the plugin settings.

What if I don’t receive the 2FA email code?

Check your spam folder first. You can click “Resend code” on the verification form. Codes expire after 10 minutes by default. If issues persist, an administrator can temporarily disable 2FA from the plugin settings.

Can I switch between email and authenticator app?

Yes. Go to Login Security > Two-Factor Authentication and change the verification method. If notifications are enabled, affected users will receive an email explaining the new method and how to set it up.

Which user roles require 2FA?

By default, 2FA is enforced for administrators and editors. You can customize which roles require 2FA in the Login Security settings, and exclude specific users individually.

How do I recover if I’m locked out?

Access your site via FTP/SFTP and either rename the plugin folder to disable it temporarily, or delete the vigilante_login_attempts table rows for your IP address in the database.

Will the firewall block legitimate users?

The firewall is configured to allow normal WordPress operations, including the block editor, REST API, and popular page builders. If you experience issues, you can whitelist specific IPs or adjust rate limiting thresholds.

Block Bad Bots also stops SEO crawlers (Ahrefs, Semrush, Majestic, Screaming Frog) and command line clients (curl, wget, python-requests). To let one of them through, add its name to User-Agents not treated as bots, in the same tab.

Why is a blocked request missing from the Security Audit?

Requests are blocked in two places:

  • Rules in .htaccess (bad bots, bad query strings, unusual HTTP methods, protected files) answer 403 before WordPress loads, so nothing is logged.
  • The PHP firewall logs what it blocks. “Bad bot blocked” shows the entry of the list that matched; the full User-Agent is in its own column.

A page served by a page cache or a CDN reaches neither. Read the log as a floor, not as a count of every attack.

Can I use this with other security plugins?

While Vigilant works standalone, running multiple security plugins can cause conflicts. We recommend testing in a staging environment first if you need to combine security solutions.

Does this work with caching plugins?

Yes. Vigilant is compatible with popular caching plugins. The firewall runs before cache layers, and .htaccess rules don’t interfere with caching mechanisms.

Does this work with WooCommerce?

Yes. Vigilant includes compatibility settings for WooCommerce. The REST API security module automatically allows WooCommerce endpoints, and the firewall won’t block payment gateway connections.

How do I test my security headers?

Use the built-in header testing tool in the Security Headers tab, or visit securityheaders.com with your site URL to get a security grade.

What is Security Check?

Security Check is an on-demand audit built into the Dashboard. It runs more than 50 checks across 6 categories (SSL/TLS, HTTP headers, WordPress exposure, access and authentication, sensitive files, and internal checks) and returns a 0–100 score with an A–E grade. Unlike external online scanners, it runs entirely on your server and has access to 17 exclusive internal checks: PHP end-of-life status, PHP security fixes, pending updates, closed/removed plugins, Vigilant self-protection, file permissions, default salts detection, administrators without 2FA enrolled, and more.

Does Security Check send my data to an external service?

No. All checks run on your server. The only external traffic is three DNS lookups against public blacklists (Spamhaus, Barracuda, SpamCop) for the reputation category: standard DNS queries with no authentication, no API keys, and nothing sent beyond your site’s IP address.

What does the Security Check score measure?

It adds the points of every check that passes, out of the checks it could run.

  • Some checks test the live site: HTTPS, the headers the browser receives, files that should not be reachable.
  • Others read a Vigilant setting, such as the custom login URL, the login attempt limit or two-factor. They count while the module that applies the setting is switched on, and tell you whether it is on, not whether a CDN or your host changes the result.
  • A check that could not be run, because the site did not answer in time for example, is left out of the score and counted as not measured.

The letter follows one scale: A is 100, B from 85, C from 70, D from 50 and E below. The Dashboard also shows Vigilant configuration, a bar with no letter: it only counts what is switched on, so the two figures can differ.

How often should I run Security Check?

Run it manually after any significant change (plugin update, server migration, new user role configuration). For ongoing monitoring, enable the weekly automatic scan from the widget. You’ll only receive an email if the score drops by 10 points or more, or if a new critical check starts failing — so no spam from routine scans.

What is password expiration?

You can require users to change their passwords after a set number of days (30, 60, 90, etc.). Users are warned before it expires. Once it does, they are taken to their profile to set a new one before they can do anything else. Password history prevents reusing recent passwords.

What is registration approval?

When enabled, new user registrations require manual approval by an administrator before the account becomes active. Pending users cannot log in until approved. You can configure auto-rejection after a set number of days.

What does email verification do?

New users must verify their email address by clicking a link before their account becomes active. This prevents fake registrations and ensures valid contact information.

How do session limits work?

You can limit how many concurrent sessions each user can have. When the limit is reached, either the new login is blocked or the oldest session is terminated, depending on your configuration.

Can I export the security audit log?

Yes. The security audit log can be exported to CSV format for external analysis or compliance reporting. You can also filter logs by event type, user, or date range before exporting.

Which events are sent by email?

Every event is logged as Info, Warning or Critical. By email you get:

  • Security Audit alerts: Critical events by default, such as a closed plugin. Choose “Warning and Critical” to get more.
  • Admin monitoring, in Users: a new administrator, a change of role to administrator and changes to an administrator’s email or password. Each has its own checkbox.
  • File Integrity: the findings of each scan, according to the level you chose.
  • Self-protection: always, when Vigilant’s own files change.

What files does the integrity scanner check?

It checks:

  • WordPress core, against the checksums WordPress.org publishes, plus any file added to wp-admin or wp-includes.
  • Plugins from WordPress.org, against their checksums.
  • Themes from WordPress.org, against the package WordPress.org publishes for the installed version. It is downloaded once per version.
  • In both, files that changed, files that are missing and PHP files that are not in the published copy.
  • Plugins and themes from anywhere else, must-use plugins and drop-ins (advanced-cache.php, object-cache.php and the like). There is no official copy of them, so they are searched for obfuscated code.
  • The uploads directory, for PHP and other scripts, double extensions, .htaccess files and PHP configuration files.
  • The other folders of wp-content (languages, upgrade and the like), for hidden code in their PHP files, unless they are in Excluded Paths. A translation file has to hold text and nothing else.
  • The site root, wp-content and the plugins folder, for loose files that do not belong there, backups left within reach and a .user.ini or php.ini that loads another file.
  • wp-config.php and .htaccess, for any change since you last approved them.

The results name what could not be compared. For those, a clean result means no hidden code was found, not that every file is the original one. A PHP file too large to be searched (over 8 MB) is listed as not searched.

What do the file integrity findings mean?

  • Modified: the file does not match the copy on WordPress.org. Usually an update that did not finish or a manual edit. Reinstalling the plugin, theme or WordPress fixes it.
  • Suspicious: code where none is expected (PHP in uploads or in the site root) or obfuscated code. Real infections land here, and so do the cache or template files some plugins generate.
  • Extra: a file that WordPress, the plugin or the theme does not ship. Often legitimate. A copy of wp-config.php or a database dump in the site root should be moved out.
  • Critical config: wp-config.php or .htaccess changed since you last approved them.
  • Closed or removed: WordPress.org closed the plugin. Replace it.

I got an email saying wp-config.php or .htaccess changed. Was I hacked?

Usually not. Cache, security and redirection plugins rewrite their own blocks in those files, often on every update, and Vigilant reports every change it did not make itself.

Open File Integrity, press Review changes and read the lines. If they belong to a plugin you use, press Approve: that records the current content as the reference and does not touch the file. Lines you cannot explain need a closer look, above all the ones that load a file (auto_prepend_file, include) or send requests to a PHP file.

You get that email once per change, not after every scan. The change stays listed in File Integrity until you approve it.

The scan keeps reporting files that are fine. What can I do?

  • Ignore hides one file.
  • For a folder where a plugin keeps generating PHP (compiled templates, caches), add the folder to Excluded Paths, for example wp-content/uploads/cache.
  • If the scan says it ran out of time in a folder of wp-content, such as a very large cache, add that folder to Excluded Paths too.
  • A .htaccess inside uploads that only denies access protects that folder, and is not reported. WooCommerce writes several.

What does Vigilant write to .htaccess and wp-config.php?

On Apache and LiteSpeed, two blocks in .htaccess, between the lines # BEGIN Vigilante Protection and # END Vigilante Protection, and # BEGIN Vigilante Security Headers and # END Vigilante Security Headers. While Under Attack mode is on there is a third one, # BEGIN Vigilante Under Attack.

In wp-config.php, one block between /* BEGIN Vigilante Security Constants */ and /* END Vigilante Security Constants */, and the prefix // [VIGILANTE_ORIGINAL] on any line of yours that defined one of the same constants.

Vigilant writes these blocks when you save its settings and after it updates, not in between. If another plugin or a person removes one, save that tab again to write it back.

I updated from a version that stored wp-config.php in the database. Is there anything else to do?

Previous versions kept a copy of wp-config.php in an option, with the database password and the eight authentication keys and salts. Updating removes the copy, but cannot undo an exposure that already happened. If your database, or a backup of it, may have been read by somebody else while that copy was stored:

  • Replace the eight keys and salts in wp-config.php with fresh ones from the WordPress.org secret-key service. Everybody is signed out, you included, which is the point. If File Integrity watches a wp-content/secrets.php, approve it once more afterwards.
  • Have a backup code at hand first if you use an authenticator app with Vigilant: new keys stop the app codes from working. A backup code still lets you in, and you can set the app up again from your profile.
  • Do not replace WP_SECRETS_KEY with them, if your wp-config.php has it: it is not one of the eight, and a new one makes every secret kept with the WordPress Secrets API unreadable.
  • Change the database password if your host lets you.

Does a scan always check the whole site?

Not on a very large one. A scan runs for 60 seconds at most and starts from the beginning each time. With many plugins, a large uploads folder or a large cache, it may not reach every plugin and theme, and it is the same part that is left out on every scan.

  • File Integrity says when the last scan was partial, and names the plugins, the themes and the areas it did not reach. The scan email says it too.
  • Security Check does not count a partial scan as a clean one.
  • If the server stops the scan before it ends, or WordPress does not run its scheduled tasks, nothing is stored. File Integrity and Security Check then say that no scan has finished since the date shown.
  • To check what was left out, File Integrity lists the folders the scan did check: add them to Excluded Paths, run a scan by hand, and take them out again.
  • While the whole folder of a plugin or of a theme, or the uploads folder, is in Excluded Paths, File Integrity and Security Check keep saying so: no scan looks inside it.
  • Adding large folders that do not need checking to Excluded Paths leaves more time for the rest.

How often does the file integrity scan run?

You can configure automatic scans to run daily or weekly. You can also run manual scans at any time. Email notifications support three levels: every finding, serious findings only (suspicious and extra files, changes in wp-config.php or .htaccess and closed plugins), or disabled. The email goes out when a scan finds something new, so a finding you were already told about is not repeated.

How do I know Vigilant itself has not been tampered with?

Vigilant verifies its own files against the checksums WordPress.org publishes for your version, the MANIFEST.sha256 file shipped with the plugin and a fingerprint of that manifest stored in your database. The result appears in File Integrity, with the results of the last scan, and in Security Check. To check from outside WordPress, run wp plugin verify-checksums vigilante, or php bin/verify-manifest.php inside the plugin folder, which also reports added files and accepts line endings rewritten by the host. SECURITY.md lists every option.

What is the MANIFEST.sha256 file?

A list of the SHA-256 checksum of every file in the plugin, in the standard format of the sha256sum tool, generated as the last step of each release. It is what lets Vigilant, and you, notice a changed file even when WordPress.org cannot be reached. readme.txt and changelog.txt are not in it, because WordPress.org allows updating them without a new version.

Vigilant says that its scheduled tasks were missing. What should I do?

Usually nothing. Vigilant has already scheduled them again, and the notice is not about changed files.

  • WordPress itself drops a scheduled task when it cannot save its next run, for example if the database does not answer at that moment.
  • A cleanup or optimization plugin can remove scheduled events: exclude the ones whose name starts with vigilante_.
  • The notice goes away by itself after a week with no task missing.
  • If it turns critical, the same task was missing three times in one week or four in a month: something is removing it. Look for the plugin or the hosting job that does it, and if you find neither, review recently installed plugins and the administrator accounts.

Does self-protection detect vulnerabilities in Vigilant?

No. It detects that Vigilant’s files were changed, deleted or added to, not bugs in its code. Vulnerabilities are fixed in new releases, so keep Vigilant updated, and report any you find as SECURITY.md explains.

What is the difference between Standard and Maximum presets?

Standard applies balanced settings suitable for most sites. Maximum applies stricter rules: lower rate limits, tighter CSP policies, required admin notifications, session limits, and more aggressive hardening. Maximum may require adjustments for sites with complex functionality.

Where are backups stored?

Nowhere on the server. The configuration backup (wp-config.php, .htaccess and robots.txt) is a ZIP built on the fly and sent to your browser, and Vigilant keeps no copy of those files, because they hold your database password and other secrets. A database backup you download is generated as a temporary ZIP with an unguessable name and removed right after the download.

What is Under Attack mode?

Under Attack mode is an emergency feature you can activate when your site is experiencing an active attack. It adds a JavaScript challenge that real browsers solve automatically in a few seconds, while bots and automated scripts are blocked completely. It also applies aggressive rate limiting, blocks restricted HTTP methods, and restricts API access.

Will Under Attack mode affect my logged-in users?

No. Logged-in users, admin pages, cron jobs, AJAX requests, and the login page are all excluded from the JavaScript challenge. Only unauthenticated frontend visitors see the verification page.

What if I forget to turn off Under Attack mode?

It automatically deactivates after 4 hours. You will also receive an email notification when it activates and deactivates.

Does Under Attack mode change my regular security settings?

No. It operates independently from your preset configuration (Standard or Maximum). Your regular settings are untouched and continue working normally after Under Attack mode deactivates.

How does the database backup work?

Go to Vigilant > Tools > Database Backup. Select which tables to include (or leave all selected), then click Download. The backup is generated as a temporary ZIP with an unguessable name, streamed to your browser and deleted from the server immediately after the download.

What does changing the database prefix do?

WordPress uses wp_ as default table prefix. Changing it to a random prefix adds a layer of protection against SQL injection attacks that target default table names. Go to Vigilant > WP Hardening > Database Hardening. Always create a backup before changing the prefix.

How do I exclude management services like ManageWP from the firewall?

Go to Vigilant > Firewall > User-Agent Lists and add the service name (e.g., ManageWP, MainWP, UptimeRobot) to User-Agents not treated as bots. Partial matching is used, so “ManageWP” matches any User-Agent that contains it. This only exempts it from the bad bots rules: any client can send any User-Agent, so every other firewall rule still applies.

If you also use a custom login URL, add the management dashboard’s IP address to the firewall IP Whitelist as well. Some operations (for example pushing a plugin update from MainWP) reach wp-admin without a WordPress session and with a generic WordPress user agent rather than the service name, so the User-Agent rule alone would not match them. A whitelisted IP is allowed past the hidden login/wp-admin protection (it still has to authenticate).

Can I send security notifications to someone other than the site admin?

Yes. Go to Vigilant > Settings & Tools > Notification settings. You can add additional email recipients (one per line) and optionally uncheck the WordPress admin email. This is useful for maintenance professionals managing multiple sites who need to receive all security alerts.

Can I customize notification recipients programmatically?

Yes. Use the vigilante_notification_recipients filter. It receives and returns an array of email addresses used for all administrative notifications:

add_filter( 'vigilante_notification_recipients', function( $recipients ) {
    $recipients[] = 'security-team@example.com';
    return $recipients;
} );

Reviews

November 8, 2026 1 reply
A very nice plugin that works good with also nice and kind support provided in the forum. I choose this plugin for now for protect my website, I changed from a bigger plugin to this and I'm feeling very well. Very useful to support a good two step and other securities policy in the Wordpress blog or website! Thank you very much!
October 22, 2026
@fernandot you are a saint for releasing and maintaining this!
October 20, 2026 1 reply
Excelente plugin. Se debe tener en cuenta y corregir el 2FA, ya que teniéndolo activado causa error de compatibilidad con el plugin WP Hide haciendo que WP Hide envíe un correo de "Login failed", antes de proceder al envío del código del 2FA. Tras añadir el código 2FA se accede sin problema.
October 9, 2026 1 reply
Un gran plugin de seguridad, con bastantes más opciones que otros de pago. Además no ocupa mucho y no se nota en lo que a rendimiento del sitio se refiere. Para colmo, responde en el foro de soporte antes de que puedas cerrar sesión y hacer otras cosas. ¡No se puede pedir más! Gracias, Fernando.
September 22, 2026 1 reply
Hola que tal me interesa mucho probar el plugin pero cuando elijo un presets que se supone que al usarlo deberia no aparecer mas errores despues de volver a escanear, me siguen saliendo errores que aun no se han solucionado, algo estoy haciendo mal?
Read all 25 reviews

Contributors & Developers

“Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner…” is open source software. The following people have contributed to this plugin.

Contributors

“Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner…” has been translated into 4 locales. Thank you to the translators for their contributions.

Translate “Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner…” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

3.0.13

Closes wp-content/upgrade, where WordPress unpacks updates, to web requests and checks it in Security Check. Watches the secrets.php drop-in, logs changes to WordPress secrets and explains two factor errors after new security keys.

  • Improved: a new Update Folders setting in Firewall, Server Protection, on by default, closes wp-content/upgrade and wp-content/upgrade-temp-backup to web requests. WordPress unpacks every update there before moving it into place, and CVE-2026-119977 was exploited by calling a file of a WordPress update while it was being unpacked; the update to the version that fixes it is still unpacked by the code it replaces, so a firewall inside WordPress cannot see that request. Vigilant writes two rules, so the block holds when a .htaccess further down switches rewriting on, ignores case and repeated slashes, and follows a content folder renamed inside the WordPress folder. Existing sites with the Firewall module on get it when they update, without saving anything. Nginx does not read .htaccess, and a server that hands PHP files to PHP-FPM with ProxyPassMatch does not read it for them: there, block those two folders in the server configuration. The new Security Check row says which case a site is in.
  • Improved: Security Check has a new row in Sensitive files that asks the server for a PHP file that does not exist inside wp-content/upgrade and for one outside it, and passes only when the first is refused and the second is not. A server that refuses both is not scored, because it cannot be told apart. Sensitive files now scores out of 10.
  • Improved: File Integrity watches wp-content/secrets.php, the drop-in WordPress loads on every request where it has the Secrets API, as it watches wp-config.php and .htaccess: it says when the file appears, changes or goes, and asks you to approve it. Its lines are never stored, only a fingerprint keyed with the security keys of wp-config.php and its size, because it can hold the credentials of a secrets store. A site that already has one is asked once, and so is a site whose security keys are replaced, because the fingerprint is keyed with them. Approving takes the file as the scan saw it: if it changed since, scan again. On a network, approving or ignoring it takes a network administrator.
  • Improved: the activity log records every change to a secret of the WordPress Secrets API, with its name and never its value. A secret that goes back within a day to a value it had and that was replaced by another is logged as critical, so the audit alerts can send it: putting back a key that was rotated is what somebody who knew the old one would do. Deleting a secret and creating it again with the same value is not.
  • Improved: when the codes of an authenticator app can no longer be checked because the security keys of wp-config.php were replaced, the two factor screen says so and points to the backup codes, and the activity log says why. It used to say Authentication error.
  • Fix: after ignoring a file in File Integrity, the list of ignored files shows it right away. Until now the count above the list said one more than the table until the page was reloaded. Reported by Juan Díez.
  • Fix: after approving a change to wp-config.php or .htaccess in File Integrity, its line changes no longer stay open on screen until the page is reloaded.

3.0.12

Fixes the IP login lockout and the activity log on servers that report table names in lower case, adds a daily limit to wrong two factor codes, saves old browser versions in the User-Agent blacklist again and uses SAMEORIGIN in the Maximum preset.

  • Improved: an account now also stops for up to a day after 20 wrong two-factor codes in 24 hours, besides 10 in 15 minutes, so someone who has the password can no longer keep sending codes just under the limit: 600 in a month at most, where 28,800 got through before. A correct code ends the stop, and a new password starts the day again. The login screen and the email say how long the wait is. Reported by @calzbert.
  • Improved: the Maximum Security preset now sets X-Frame-Options to SAMEORIGIN instead of DENY, and frame-ancestors to self. DENY also blocked the frames of the dashboard itself, such as plugin details, the progress of updates and the Customizer preview, and SAMEORIGIN protects from clickjacking just the same. Sites that applied the preset keep what they have: choose SAMEORIGIN in Security Headers to change it.
  • Improved: User-Agent blacklist lines with an old browser or system version, such as Chrome/49.0.2623, Firefox/3.6 or Android 4.4, are saved again and no longer flagged: they only block that old version, a common sign of a bot. A version cut short that matches browsers in use, such as Chrome/15, is still left out. Reported by @calzbert.
  • Improved: code that writes the settings, such as a network sync, can now learn which blacklist lines were left out through the vigilante_firewall_lines_dropped action. Requested by @calzbert.
  • Fix: on servers that report table names in lower case, such as MySQL with lower_case_table_names set to 1, and with a table prefix in capitals, Vigilant took its own tables for missing. Failed logins were not counted, so the login lockout by IP never started, and the activity log and the file hashes stayed empty. Reported by @calzbert.
  • Fix: some lines that normal browsers send could still be saved to the User-Agent blacklist and blocked the people using them: a piece cut in the middle of a browser name, such as rome/120.0.0.0, or of the Android device or the Linux processor, the whole User-Agent of a newer Firefox for Android, and lines of browsers Vigilant had no example of: Edge and Opera on Mac, Opera on Android and Opera Mini, Yandex, Huawei, UC, Xiaomi, Amazon Silk, DuckDuckGo, the browsers inside the Facebook, Messenger, Instagram, Google, WeChat, TikTok, LinkedIn, Pinterest, Telegram, Snapchat and LINE apps, including the fields they fill with the language or the network of each person, KaiOS phones, LG and Samsung TVs, PlayStation and Xbox. Windows 7 and 8.1 lines, such as Windows NT 6.1, are no longer saved either, because Chrome 109, Firefox ESR and newer Chromium forks still run there; Windows XP and Vista lines still are. A line that names a bot or a testing tool, such as LinkedInBot, Lighthouse or GTmetrix, is still saved, and so is a combination no browser sends, such as a current Chrome on an old macOS. A very long line no longer slows down the Dashboard and the Firewall tab.
  • Fix: on a network, the email about a two-factor stop could be sent again from each subsite for the same run of wrong codes. It is now sent once a day at most for the whole network while the codes keep coming, and again after a new password. Reported by @calzbert.
  • Fix: on a network, deleting a user could leave their authenticator secret and backup codes in the table kept from a deleted subsite. Reported by @calzbert.

3.0.11

The User-Agent blacklist no longer saves lines that normal browsers or WordPress also send, which locked people out; saved ones keep working and are flagged. Sections now fold, with summaries and an index. Also fixes the author scan block with NextGEN Gallery and a percent sign in headers.

  • Improved: the User-Agent blacklist no longer saves a line that normal browsers, your own browser or WordPress itself also send, because it blocks the people who use them or stops the site from reaching itself. Chrome and Safari send the same User-Agent to everybody on the same version and system, and bots copy it, so a line taken from such a bot blocked every visitor with that browser. The notice says what each line would block and suggests blocking the IP instead. A line that blocks Googlebot or Bingbot is saved with a warning.
  • Improved: lines of that kind saved with an earlier version keep applying, and the Dashboard and the Firewall tab now point them out. They are left out the next time the Firewall tab is saved.
  • Improved: importing settings leaves out those User-Agent lines too, and IP blacklist entries that are an address of the site, and says which ones.
  • Improved: the activity log popup no longer offers to blacklist a User-Agent. It checks the lists as the firewall does, IP ranges and part of a User-Agent included, says which line matches, and a request blocked by the User-Agent blacklist now records the line that blocked it.
  • Improved: adding an IP or a User-Agent to a list from the activity log now leaves an entry in the log.
  • Improved: the User-Agent whitelist is now called User-Agents not treated as bots, and its description says what it does: it exempts them from Block Bad Bots and nothing else.
  • Improved: settings sections, and the groups inside them, fold from their heading, and the heading says what they hold even when folded: how many options are enabled, how many entries a list has, the mode chosen, or what the block shows, such as notifications active, IPs blocked or the date of the last scan. The browser remembers what you folded.
  • Improved: an error is marked on the heading of the section that holds it and in the section index, and opens that section on every load. A warning is marked on the folded heading that hides it.
  • Improved: tabs with three or more sections get an index on the left with Open all and Close all, which marks the section you are reading. Links to a setting, from the settings search, Security Check or the Dashboard, open a folded section first.
  • Improved: in File Integrity, Run Scan Now and Clear Previous Results are now in the results block, which always shows, also before the first scan. Save buttons that only save one section fold with it.
  • Improved: the rows of the self-protection box and of the Security Check breakdown remember whether you left them open, except a critical self-protection row, which always opens. Pending registrations show their count in the heading instead of an orange badge.
  • Improved: File Integrity keeps the Ignored Files section on screen when the list is empty, and says so. Ignoring files, taking them off the list and emptying it are now recorded in the activity log, with how many files and which ones. The confirmations say how many files they take, selections on other pages of the table included, and the button that empties the whole list says how many it removes.
  • Fix: in .htaccess, a User-Agent whitelist entry also exempted requests from the rules against malicious query strings and unused HTTP methods. Any client can send any User-Agent, so it now only exempts from the bad bots rule, as it already did in PHP.
  • Fix: a percent sign in a security header value reached .htaccess as a format of the server, which could stop the whole site with an error or put a server variable in a public header. It is now written as a plain percent sign.
  • Fix: with NextGEN Gallery active, ?author=N still redirected to the author page and showed the username, with nothing in the log. The block now runs before any plugin can redirect.
  • Fix: when ?author=N still showed the username with the protection on, Security Check blamed a cache without checking. It now asks again past any page cache, tells a cache from something on the site that redirects first, and says so when it cannot tell.
  • Fix: Security Check missed generator meta tags with their attributes in another order, such as the one Divi prints, and now names the tag it finds.
  • Fix: unchecking User changes in the activity log also stopped logging blocked author scans, blocked insecure usernames and the session limit, and their audit alerts.
  • Fix: deleting a user left their two-factor data, the authenticator secret and backup codes included, in the tables of Vigilant.

3.0.10

Two factor now stops an account after 10 wrong codes in 15 minutes and emails its holder, Ignore applies to the file as it is when ignored, and the visitor IP is read right behind proxies that add the port, such as Azure.

  • Improved: Ignore in File Integrity now applies to a file as it is when it is ignored: if it changes, goes away or comes back, its finding shows again and the file leaves the ignored list. Excluded Paths is still the way to stop watching a file or a folder for good. Files ignored with an earlier version of Vigilant show once more, to be ignored again.
  • Improved: only one File Integrity scan runs at a time. Run Scan Now says when another scan is already running and since when, the scheduled scan leaves it to the one that is running, and a scan the server stops is always the one reported.
  • Improved: Security Check asks for the home page once per scan also when it does not answer or answers with a verification screen, instead of once per check that reads it.
  • Fix: two-factor verification had no limit per account. The tries of each verification session started again with every correct password, and the lockout of Login Security counts per address and does not run on a site of a network where that module is off. Each account now has 10 wrong codes in 15 minutes, by app or by email, counted across sessions and addresses; then verification stops until that time passes, and the account holder and the site recipients get an email, because every one of those codes came with the right password.
  • Fix: behind a proxy that writes the port in X-Forwarded-For or X-Real-IP, as Azure App Service does, every visitor was read as the proxy, for the firewall, the rate limit, the login lockout and the IP lists, and the notice that detects a proxy did not show. The port is now set aside, and the IP whitelist rules of .htaccess accept it too.
  • Fix: on a site whose WordPress lives on a host of its own, the redirect to set up the authenticator app once the grace period ended went to the dashboard, which redirected again, in a loop. The Activity Log and File Integrity menu shortcuts landed on the dashboard there too.
  • Fix: Remove X-Powered-By and Server headers now also removes an X-Powered-By header added by the server configuration, such as PleskLin on Plesk. Security Check no longer calls a value without a version number version information, and when the header still arrives with the rules of Vigilant applied, it says that the server adds it outside .htaccess.
  • Fix: on a network, deleting a site now also removes Vigilant’s tables for that site, its activity log included. The two factor table stays while it holds an enrolment, because accounts belong to the network.
  • Fix: the IP blocklist of Comment Security, which only code can fill, compared the connection address as text. It now reads the visitor IP and matches the list as the firewall does.

3.0.9

Security Check now says when the PHP of the server lacks the fixes of PHP2Shell, the critical flaws of October 2026, and the firewall blacklist no longer accepts an address of the site itself, which stopped WP-Cron.

  • Improved: Security Check has a new row in Internal Checks, PHP security fixes, that compares the release of PHP, and not only its branch, with the critical security releases of PHP that Vigilant knows about. The first one is PHP2Shell (CVE-2026-109618 and CVE-2026-109619, October 2026), fixed in PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35. An older release of those branches fails, and so does a branch that no longer gets fixes. A release marked by a Linux distribution, which can carry fixes without changing its number, also on a branch PHP no longer fixes, and a test release are a warning, because the number cannot tell. Until now a site on PHP 8.5.3 passed, so a site with an older PHP gets a lower score until PHP is updated, and the weekly scan, where its email is switched on, reports the row as a new failing check.
  • Improved: the hidden login answers wp-login.php, wp-admin and the login shortcuts with one same page, the 404 page of the theme, as an address that does not exist gets it, so they cannot be told apart from a missing page. Until now wp-login.php showed the theme and wp-admin a plain page, and comparing them showed that something was there. Vigilant keeps a copy of that page, taken by asking the site for a missing address and renewed every day, after a theme switch and after updates; while there is none, every path gets the same plain page.
  • Fix: with a custom login URL, /login.php answered with a redirect to the hidden login address, because WordPress sends that address to the login page and Vigilant only blocked /login and /wp-login.php. It now gets the same not found page as the rest.
  • Fix: an address of the site itself could be put in the firewall blacklist: a loopback address, the address of the server or the one its domain points to. The requests WordPress sends to itself come from one of them, so WP-Cron stopped and the REST API test of Site Health failed with nothing on screen to say why. Saving the Firewall tab now leaves such an entry out, also one saved before, and says so in a second notice; the button of the Security Audit refuses it; and the Dashboard recommends removing one that is already saved.
  • Fix: on a hosting that disables gethostbynamel() or gethostbyname(), the blacklist checks of Security Check stopped it with a fatal error, and its weekly run with it. They now say that the hosting disabled that function of PHP and are skipped.
  • Fix: the password expiry setting could be saved at 0 days through an import or a request that skipped the limits of the field, and then every password with a date had expired. It can no longer be saved below 7 days, the minimum on screen, and a 0 saved before is read as 7.
  • Fix: where PHP counts its time limit in clock time, as on Windows, a File Integrity scan fitted to a short limit could start a request for checksums that waited longer than the time left, and the server stopped the scan before it saved its result. That wait now shrinks to the time left. Where PHP counts processor time, the time used by other tasks of the same scheduled run now counts too, so the closed plugins check does not start with less time ahead than it needs.
  • Fix: with the wp-includes folder linked from another place on the server, the alert about self-protection switched off by a filter could name a file of WordPress itself again.
  • Fix: with Content-Security-Policy in report-only mode, the Test Headers button said so twice.

3.0.8

Security Check tells a firewall verification screen, a stale cache and headers set only on files apart from a missing header. A File Integrity scan stopped by the server is now reported, and the scan fits the time limit of PHP.

  • Improved: when a security header arrives more than once, Security Check says so in its row, because it is being sent from more than one place and only one should be left. The policy that Vigilant itself sends from PHP with upgrade-insecure-requests alone does not count as a repetition.
  • Improved: Security Check also asks for the home page as it is generated now, and says when the copy that visitors get comes from a cache and does not carry the same security headers, so that the cache can be emptied.
  • Improved: when a File Integrity scan is stopped before it can save its result, because PHP runs out of time or memory or the server cuts the request, the tab and Security Check say so, with the cause when PHP gives it, and the Security Audit records it. Until now such a scan left no trace.
  • Improved: in the Security Audit, Escape closes the details popup, and the actions for the IP and for the User Agent are now in two separate blocks, each with its value and buttons that say what they act on, so that a User Agent is not blacklisted by mistake instead of the IP.
  • Fix: Security Check took the verification screen of a firewall or an anti-bot service for the site. A challenge answered with 403 passed as a protected user list, a refused wp-cron.php or a protected file, and one answered with 202 as the home page. Those checks now say that they could not measure and whose screen it was, for the screens that can be told apart: the challenges of SiteGround, Cloudflare and AWS WAF, the block pages of Cloudflare, Sucuri, Imperva, DataDome and Wordfence, and the challenge of the Under Attack mode of Vigilant itself. A file or a page served with 2xx is never taken for a screen. The Test Headers button says the same.
  • Fix: on a server that applies the header rules of .htaccess to files and not to the pages PHP generates, as some hosting with PHP as CGI does, Security Check said that mod_headers was not enabled. It now checks an image of WordPress and says what happens. A copy kept by a cache is told apart in the same way, and the policy that Vigilant sends from PHP no longer counts as a header of its .htaccess block that arrives.
  • Fix: X-Content-Type-Options and Cross-Origin-Opener-Policy with a value other than the expected one were reported as missing. The row now says which value arrives and which one is expected.
  • Fix: a blacklist that does not answer this server was reported as not listing the site. When the answer is empty, each list is now asked about the test entry it keeps listed on purpose, and an answer that is not a blacklist code, which some DNS providers give to every name, is no longer read as a listing.
  • Fix: the Limit HTTP Methods option and the description of Under Attack promised to block TRACE. Apache answers TRACE before it reads .htaccess, so only the hosting can switch it off, and the option now says so.
  • Fix: with self-protection switched off by a filter that returns __return_false, as in the example of SECURITY.md, the email and File Integrity named wp-includes/functions.php as the file that switched it off. A function or a method of WordPress itself, such as __return_false or is_admin, is no longer named, also when it is passed as a closure, and the steps say how to find the filter. A callback written as Class::method or an object that can be called is now traced to its file, and when something hooks the filter that cannot be traced to a file, the screens say so.
  • Fix: in the Security Audit, a scheduled task created for the first time was explained as one that had disappeared, a critical entry listed every task restored in that pass instead of the ones that keep disappearing, and the entries about self-protection switched off or about its hooks removed had no explanation.
  • Fix: a Content-Security-Policy with upgrade-insecure-requests alone, the one Vigilant sends from PHP, scored in Security Check as a full policy, and with CSP off in Vigilant it read as delivered by something other than Vigilant. It restricts nothing, so it no longer counts as a policy, and a site whose only CSP is that one loses those points.
  • Fix: a Content-Security-Policy-Report-Only scored in Security Check as a policy in force. In that mode the browser reports what the policy would block and blocks nothing, so the row is now a warning with half the points, and when the policy is the one of Vigilant it says how to put it in force. The strictest preset sets CSP to report-only, so a site that applied it gets half the points of that row until the mode is turned off.
  • Fix: the attempt to open the hidden wp-admin logged before translations load showed in English in a translated log. It is now translated when it is shown, older entries included.
  • Fix: with WPML active, the hidden wp-admin answered a visitor with no session with a server error instead of a not found page, and left a fatal error in the PHP log on every visit. The page is now written without the template of WordPress, with the same text and the same 404, and always as an HTML page, where a request that asked for JSON or XML got the error in that format.
  • Fix: the File Integrity scan saved its result only after asking WordPress.org about every installed plugin, so a server that stopped the request at that point lost a scan that had finished. It is now saved as soon as the files are checked, and when little time is left the closed plugins check is left to its daily run.
  • Fix: the Run Scan Now button deleted the previous result before scanning, so a scan stopped halfway left the tab empty, and it ran with the memory limit of php.ini instead of the one WordPress gives the dashboard.
  • Fix: the scan did not take the time limit of PHP into account, so on hosting that gives a request 30 seconds a scan could be stopped halfway. It now asks for more time and, when the hosting does not allow it, stops in time to save its result, measuring the time as PHP counts it on that server, and says so in the list of what it did not check.

For older changelog entries, please check the changelog.txt file