Requirements
| WordPress | 6.0 or later |
| PHP | 7.4 or later (PHP 8.x supported). The sodium extension, bundled since PHP 7.2, encrypts two-factor secrets. |
| Database | MySQL 5.7+ or MariaDB 10.3+ |
| Web server | Apache, LiteSpeed or Nginx |
| Outbound HTTPS | To api.wordpress.org and downloads.wordpress.org, for file integrity checks and repairs |
Installation
- Upload the pluginIn WordPress, go to Plugins > Add New > Upload Plugin and choose
wonder-secure.zip. You can also copy thewonder-securefolder intowp-content/plugins/. - Activate itClick Activate on the Plugins screen. Activation creates four database tables and schedules a daily maintenance task. The firewall, brute force protection and automatic IP blocking are switched on straight away.
- Open Wonder SecureA new Wonder Secure item appears in the admin menu. It opens on the Dashboard.
Your first 10 minutes
Do these five things in order right after installing. They prevent the most common setup mistakes and close the biggest gaps.
- Check how visitor IPs reach your siteGo to Firewall > Visitor IP address source. If your site is behind Cloudflare, Sucuri or a load balancer, choose the matching header. The screen shows your own IP address so you can check it is right.
- Run your first scanOpen Malware Scanner and click Start scan. It runs in short batches. You can leave the page; the scan continues in the background.
- Turn on two-factor for yourselfGo to your WordPress profile (Users > Profile), find Two-Factor Authentication, scan the QR code with your authenticator app and enter the 6-digit code. Save the backup codes somewhere safe.
- Add your alert emailOpen Notifications, enter the recipients and click Send test email to check alerts arrive and don't land in spam.
- Work through the recommendationsBack on the Dashboard, use the Fix buttons and review links on each recommendation. Each one you resolve raises your score.
Behind a proxy or CDN? Do step 1 first. Automatic blocking is on by default, and with the wrong IP source every visitor looks like the proxy. One blocked attacker would then block everyone, you included.
Your security score
The score, out of 100, is built from 21 weighted checks across firewall, login, scan results, hardening and server setup. It sorts your site into one of three states.
Some of the checks it runs:
| Check | What fixes it |
|---|---|
| Web application firewall | Keep the firewall on (Firewall screen). |
| Two-factor for administrators | Every administrator sets up 2FA, and the Administrator role requires it. |
| Recent malware scan | Scan at least weekly, with scheduled scans on. |
| No critical scan findings | Repair, quarantine or ignore critical and high findings. |
| Disable XML-RPC, hide WP version, disable file editor, block user enumeration, security headers | One-click Fix buttons, or the Hardening screen. |
| Block PHP execution in uploads | Turn on Asset Protection. |
| Custom login URL and CAPTCHA | Login Security screen. |
| WordPress, plugins and PHP up to date | Install updates; ask your host for PHP 8.1 or newer. |
| HTTPS, hidden errors, no "admin" user, custom table prefix | Server and wp-config.php changes, explained in each recommendation. |
Dashboard
Wonder Secure Dashboard
Your overview of the site's security. It loads its panels live, so the numbers are always current.
- Security overview: your score and status, whether the firewall is active, how many IPs are blocked, and a Run a scan button.
- Threat analytics: blocked attacks, failed logins, lockouts and open scan issues, with a graph you can switch between 24 hours, 7 days and 30 days.
- Developer recommendations: everything that is lowering your score, most important first. Items a setting can solve have a Fix button; the rest have Review, which opens the right screen.
- Recent activity and top IPs: the latest events and the addresses causing the most trouble.
Malware Scanner
Wonder Secure Malware Scanner
Checks your files against the official WordPress.org releases, searches for malware and looks up known vulnerabilities.
Running a scan
Click Start scan. The scan works in batches (8 seconds of work each by default) so it never times out. When it finishes, the Findings table lists every issue with its severity.
Acting on a finding
| Action | What it does |
|---|---|
| Repair | Replaces a modified core, plugin or theme file with a verified copy from WordPress.org. The original is backed up to quarantine first. |
| Quarantine | Moves a suspicious file to a folder the web cannot reach. Restore it any time from Quarantine & backups. |
| Update | Shown for vulnerable or outdated components; takes you to the update. |
| Ignore | Hides a finding you know is safe, such as a custom file you added yourself. |
Scan settings
| Setting | Default | Notes |
|---|---|---|
| Automatic scans | Weekly | Off, Daily or Weekly. |
| What to scan | All on | WordPress core files, Plugins, Themes, Uploads folder. |
| Skip malware checks for files larger than | 2048 KB | Large media files rarely hide code. |
| Seconds of work per batch | 8 | Lower it on slow or shared hosting. |
| Automatically repair modified core files | Off | The original is kept in quarantine. |
| Automatically quarantine malware | Off | Turn on once you trust the results on your site. |
| Vulnerability database | Updates only | Choose WPScan and paste your API token. The free plan allows 25 lookups a day; results are cached for 12 hours. |
Premium plugins and themes that are not on WordPress.org cannot be checked against official checksums. They are still searched for malware signatures.
Firewall
Wonder Secure Firewall
The web application firewall inspects every request before WordPress, plugins and themes load, and returns a 403 page when a request matches a rule.
| Setting | Default | Notes |
|---|---|---|
| Enable the web application firewall | On | The main switch. |
| Skip rules for logged-in administrators and editors | On | Prevents false positives when trusted users save content containing code. |
| Visitor IP address source | REMOTE_ADDR | Only choose a proxy header if your site really is behind that proxy, or attackers can fake their IP. |
| Firewall rules | All on | SQL injection, cross-site scripting, path traversal, remote file inclusion, code and command injection, malicious bots, sensitive file probes. |
| Rate limiting | Off | 120 requests per 60 seconds, then a 15-minute block. Slows scrapers and application-layer floods. |
| Automatic IP blocking | On | Blocks an IP for 60 minutes after 10 violations within 10 minutes. |
| Country restriction | Off | Block the countries listed, or allow only the countries listed, using ISO codes such as CN, RU, KP. Visitors whose country is unknown are always allowed. |
| Country detection | CDN / server headers | Cloudflare, Sucuri, CloudFront or mod_geoip headers. Optionally fall back to ipinfo.io, cached per IP for a week. |
IP allowlist and blocklist
Add a single IP or a CIDR range such as 203.0.113.0/24, choose Block or Allow (never blocked), and set a duration in minutes (0 means permanent). Click Allowlist my current IP to make sure you can never block yourself.
A form or page builder flagged by mistake? Keep "Skip rules for logged-in administrators and editors" on, or ask a developer to add the field name with the wondersecure_waf_skip_keys filter.
Login Security
Wonder Secure Login Security
Brute force protection
On by default: 5 failed attempts within 15 minutes locks the IP out for 30 minutes. Two extra options help further:
- Lock out immediately when a non-existent username is tried (off by default). Bots guess names like "admin"; real users rarely mistype theirs.
- Show a generic error on failed login (on by default). Hides whether the username or the password was wrong.
Current lockouts are listed under Active lockouts, where you can unlock an IP early.
Two-factor authentication
- Install an authenticator appGoogle Authenticator, Microsoft Authenticator, 1Password, Authy or any app that supports TOTP codes.
- Open your profileUsers > Profile, or click Set up for my account on the Login Security screen.
- Scan the QR codeOr type the key into the app by hand.
- Enter the 6-digit code and click Update ProfileTwo-factor is now on for your account.
- Save your backup codesThey are shown once. Each one works a single time if you lose your phone.
Once you have it working, tick roles under Require two-factor for these roles. Users in those roles are sent to their profile to enrol before they can use the dashboard. Administrators can reset another user's two-factor from that user's profile.
CAPTCHA
Choose Google reCAPTCHA v2 (checkbox) or hCaptcha, paste the site key and secret key from the provider, and pick the forms to protect: login, registration and lost password.
Hide login URL
Turn on Move the login page to a custom address and choose an address (the default suggestion is secure-login). Visitors who are not logged in get a "not found" page, or the homepage, at wp-login.php and /wp-admin/.
Bookmark your new login address. If you forget it, see Locked out?. Custom login URLs are not available on multisite networks.
Asset Protection
Wonder Secure Asset Protection
Turn on Enable asset protection (off by default), then pick a protection scope.
| Scope | What it protects |
|---|---|
| Full website | Blocks script execution in uploads and wp-includes, disables directory listing in wp-content, and protects every image from hotlinking, right-click and dragging. |
| Folder-wise | Choose folders, relative to your WordPress root, and how each is restricted. wp-admin cannot be restricted here. |
| Image-wise | Protect only the images you select. You can also tick "Protect this image" when editing an image in the Media Library. |
Block hotlinking stops other websites embedding your images, while search engines and direct visits still work. Add trusted domains, such as your CDN, under "Other domains allowed to embed images", one per line.
Right-click and drag protection is not applied for logged-in users who can upload files. It is a deterrent: no web technique can fully stop a determined visitor from saving an image they can see.
Hardening
Wonder Secure Hardening
Each switch closes a common attack path. All are off by default and safe for most sites.
| Option | What it does |
|---|---|
| Hide WordPress version | Removes the generator tag, RSS generator and ?ver= strings that reveal your version. |
| Disable XML-RPC | Blocks xmlrpc.php, a favourite target for password guessing and pingback floods. Leave it enabled only if you use Jetpack or the WordPress mobile app. |
| Disable theme & plugin file editor | Stops PHP being edited from the dashboard, so a stolen admin session cannot inject code. |
| Block user enumeration | Stops ?author=N scans and hides users from the public REST API, oEmbed and sitemaps. |
| Send security headers | Adds X-Content-Type-Options, X-Frame-Options, Referrer-Policy and Permissions-Policy. |
| HTTP Strict Transport Security (HSTS) | Tells browsers to always use HTTPS. Only turn it on when your whole site works over HTTPS. |
Notifications
Wonder Secure Notifications
Email configuration
Set a sender name and an address on your own domain so alerts are not marked as spam. Add recipients separated by commas; by default alerts go to the site admin email. Click Send test email to check delivery.
Real-time alerts
On by default for administrator logins, new administrators, file changes and malware, attacks and vulnerabilities. Lockout alerts are off by default because they can be frequent. An attack alert is sent after 25 blocks in 10 minutes, and each alert type is sent at most once every 15 minutes.
Templates
Edit the subject and message. These placeholders are filled in for you:
{site_name} {site_url} {event_title} {event_details} {ip} {time} {dashboard_url}
Summary reports
A weekly report is sent by default; choose Never, Daily, Weekly or Monthly. It includes the threat graph, events by type, top offending IPs, your security score and the latest scan. Agencies can add their own company name, logo and footer under Report branding.
Activity Log
Wonder Secure Activity Log
Every blocked request, login, lockout, scan and settings change in one table. Filter by type or severity, search by IP or message, and click Export CSV to share it. Clear log deletes all entries after asking you to confirm.
Settings
Wonder Secure Settings
- Firewall rule & malware signature updates: pull new rules daily from an HTTPS feed URL without updating the plugin. Every rule is checked before it is used. No feed is set by default.
- Keep activity log for: 90 days by default.
- Delete all Wonder Secure data when the plugin is deleted: off by default.
- Export settings (JSON): download your configuration to copy it to another site.
- Emergency access: a reminder of the wp-config.php lines below.
Locked out?
Open wp-config.php with your host's file manager or FTP, add the line you need above the /* That's all, stop editing! */ comment, log in, fix the setting and then remove the line.
// Turn off the firewall, IP lists, country blocking and rate limiting. define( 'WONDERSECURE_DISABLE_FIREWALL', true ); // Make wp-login.php work again if you forgot your custom login address. define( 'WONDERSECURE_DISABLE_HIDE_LOGIN', true );
- Lost your two-factor device? Enter one of your backup codes instead of the 6-digit code, or ask another administrator to reset your two-factor setup from your user profile.
- Last resort: rename the
wp-content/plugins/wonder-securefolder to switch the plugin off completely.
Nginx and other servers
On Apache and LiteSpeed, Wonder Secure writes its rules to .htaccess files between # BEGIN Wonder Secure markers and removes them when you deactivate the plugin.
Nginx ignores .htaccess. The Asset Protection screen shows the equivalent configuration for your server block; add it and reload Nginx (your host can help). The firewall, login security, scanner and everything else run in PHP and work on every server.
Privacy and external services
Wonder Secure sends nothing to Wonderfolks Interactive. Security events (IP address, country, user ID, request details) are stored in your own database and deleted after your retention period. Two-factor secrets are encrypted and backup codes are hashed. The plugin also adds suggested text to Settings > Privacy for your privacy policy.
| Service | When it is used | What is sent |
|---|---|---|
| WordPress.org | During scans and repairs | Your WordPress version and locale, plugin and theme slugs and versions, and the file being restored. |
| WPScan | Only if you choose it and add your token | Your token, and the slugs and versions of core, plugins and themes. |
| IPinfo | Only if chosen for country detection and your CDN gives no country | The visitor's IP address, and your token if set. Cached. |
| reCAPTCHA / hCaptcha | Only if you choose one and add keys | The CAPTCHA response, your secret key and the visitor's IP. |
| Rule feed | Only if you enter a feed URL; checked daily | A standard HTTPS request with the plugin version. |
Deactivate and uninstall
- Deactivating removes scheduled tasks and the plugin's server rules. Your settings and logs stay.
- Deleting keeps your data unless Delete all Wonder Secure data when the plugin is deleted is on under Settings. Then its tables, settings, quarantine and two-factor secrets are removed.
For developers
Filters and actions
| Hook | Type | Use |
|---|---|---|
wondersecure_client_ip | filter | Override the detected visitor IP. |
wondersecure_ip_country | filter | Supply a country code from your own GeoIP source. Args: $country, $ip. |
wondersecure_firewall_should_run | filter | Return false to skip the firewall for a request. |
wondersecure_waf_skip_request | filter | Return true to skip rule matching (IP lists still apply). |
wondersecure_waf_skip_keys | filter | Request parameter names the rules ignore. |
wondersecure_waf_rules | filter | Add, change or remove firewall rules. |
wondersecure_block_page_html | filter | Customize the 403 page. |
wondersecure_malware_signatures, wondersecure_malware_hashes | filter | Add malware signatures or known-bad file hashes. |
wondersecure_vulnerability_lookup | filter | Plug in another vulnerability database. |
wondersecure_score_checks | filter | Add or change security score checks. |
wondersecure_captcha_fail_open | filter | Whether logins proceed when the CAPTCHA service is unreachable (default true). |
wondersecure_signatures_url | filter | Override the feed URL. |
wondersecure_data_dir | filter | Move the protected data folder (default uploads/wondersecure-data/). |
wondersecure_mail_headers | filter | Change alert and report email headers. |
wondersecure_event_logged | action | Fires for every logged event. Args: $type, $message, $severity, $context, $id. |
wondersecure_request_blocked | action | Fires before the block page is sent. |
wondersecure_settings_updated | action | Fires after a settings section is saved. Arg: $section. |
REST API
Namespace wondersecure/v1. Every route needs the manage_options capability and a wp_rest nonce.
| Route | Purpose |
|---|---|
GET /dashboard?range=24h|7d|30d | Score, graph series, recommendations, top IPs, recent events. |
POST /recommendations/{id} | Apply a one-click fix. |
POST /scan/{start|step|cancel|status} | Control the scanner. |
POST /issues/{id}/{repair|quarantine|ignore} | Act on a scan finding. |
POST /quarantine/{key}/{restore|delete} | Manage quarantined files. |
Rule and signature feed
Set the feed under Settings, or with a constant in wp-config.php. It is fetched daily, and entries whose pattern does not compile are skipped.
define( 'WONDERSECURE_SIGNATURES_URL', 'https://example.com/wonder-secure/feed.json' );
{
"version": "2026.10.16",
"waf_rules": [
{ "id": "custom-001", "category": "sqli", "severity": "high",
"targets": ["get", "post", "cookie", "uri"],
"pattern": "/\\bunion\\s+select\\b/i",
"description": "UNION-based SQL injection" }
],
"malware_signatures": [
{ "id": "mw-custom-001", "severity": "critical", "types": ["php"],
"pattern": "/eval\\s*\\(\\s*base64_decode/i",
"description": "Obfuscated eval" }
],
"malware_hashes": { "d41d8cd98f00b204e9800998ecf8427e": "Known web shell" }
}
Rule targets: get, post, cookie, uri, ua, referer. Severities: low, medium, high, critical. Categories match the switches on the Firewall screen.
Still stuck? Email hello@wonderfolks.com with your WordPress version, PHP version and what you see on screen.