What it does

WordPress security best practices, one switch for each.

Status

  • The first tab says what is protected and what is not, in four boxes (switches, login and users, server, files and configuration): green, yellow or red rows, each with a link to the fix.
  • It checks the recommended protections that are off, the file editor, the attempt limit, administrators without a second factor, predictable usernames such as «admin», HTTPS, security headers, .htaccess rules, versions exposed in responses, the PHP version against end-of-support dates, WordPress, plugin and theme updates, file permissions and debug.
  • Headers, .htaccess rules and debug logs are verified with requests the site makes to itself; «Check again» repeats the check.
  • Everything off on activation: the site doesn't change until you decide. «Apply the recommended settings» turns on the protections suited to almost every site.

Protections

  • Comments off (hidden, not deleted), pingbacks and trackbacks stopped in both directions.
  • Theme and plugin file editor turned off; if you want, installations and updates blocked from the dashboard, with automatic updates still running. With the block on, the Plugins, Themes and Updates pages explain why the buttons are missing, how many updates are pending and how to install them.
  • XML-RPC off: xmlrpc.php returns 403, with a warning for those using Jetpack.
  • WordPress version hidden from the header, feeds and file addresses; RSD, Windows Live Writer and shortlink links removed.
  • Users hidden from visitors: no usernames from /?author=1, from the REST API, from the author sitemap or from embeds.

Login

  • Limit on failed login attempts: after 5 attempts in 15 minutes the IP address is blocked for 30 minutes (thresholds and duration can be changed), on the login page, on XML-RPC and on Application Passwords; one-day block after three blocks in 24 hours.
  • Addresses and ranges never blocked, with the «Add my IP address» button.
  • Site behind Cloudflare or a proxy: the real address is read only from Cloudflare's ranges or from trusted proxies, and a panel shows what the plugin sees with each choice.
  • Generic error messages at login and in password recovery, Application Passwords that can be turned off, REST API only for logged-in users with the namespaces to leave open (forms, shops).

Two factors

  • After the password, the six-digit code from an authentication app (Google Authenticator, Aegis, 1Password and similar): it is activated from the profile in three steps, with the QR code drawn by the plugin itself, without external services.
  • Ten single-use emergency codes, «remember this device» for the chosen number of days, code by email as an optional alternative.
  • Mandatory for the chosen roles (administrators, by default) with a grace period; secrets are encrypted in the database.
  • Ways out: reset by another administrator from the user list, WP-CLI command, constant in wp-config.php. If another plugin already handles the second factor, the tab asks which one to use: only one per site.

HTTP headers

  • One switch per header: X-Content-Type-Options, X-Frame-Options with frame-ancestors (article embeds stay free), Referrer-Policy, Permissions-Policy, Strict-Transport-Security on HTTPS sites, upgrade-insecure-requests, X-Powered-By removed.
  • Your own Content Security Policy, in «report only» or «enforced» mode, with browser reports in the event log.
  • A header already sent by the server or by another plugin is left to them and flagged next to the switch.
  • The panel shows the headers a visitor really receives from the home page and who sends them, with a warning if the responses reveal the Apache and PHP versions.

.htaccess rules

  • On Apache and LiteSpeed, three rules: no PHP from the uploads folder, no directory listing, no downloading of sensitive files (wp-config.php, readme.html, license.txt, log, backup and SQL files, hidden files).
  • Written in a marked block of the .htaccess, without touching the one from WordPress and the other plugins, with a preview before saving.
  • After writing them the plugin checks them with requests to the site; if the home page returns an error the block is removed straight away.
  • Turning off the switches, deactivating or deleting the plugin removes the block. On nginx the rules are shown ready to copy into the server configuration.

Log and notifications

  • Failed logins, blocks and unblocks, administrators from new addresses, new administrators, plugins and themes installed, activated or deleted, second factor events, Content Security Policy reports: in a table within the plugin, with filters.
  • The addresses blocked right now, with the «Unblock» button; automatic cleanup after the chosen number of days.
  • Email notifications by event type, to the administrator or to a chosen address; during an attack, events of the same type are sent together in a summary email. Button for the test email.

Tools

  • Export of all settings to a JSON file, with plugin version, date and site address: a backup copy, or a starting point for another site.
  • Two-step import: you upload the file, you see what would change setting by setting (on the site and in the file) and you confirm. Unknown keys are ignored and listed, every value goes through the limits of its field.
  • The settings tied to the site (proxy, proxy addresses, never-blocked IPs) are a separate part, off by default when the file comes from another site: a wrong proxy would block everyone.
  • Also from WP-CLI, with the same preview and confirmation. The import stays in the log, with the source site and the settings changed.

Support

  • In the Information tab, «Ask for support» opens the contact form of this site already filled in: plugin name as the subject and the site data in the message (plugin, WordPress and PHP versions, theme, language, protections turned on, proxy).
  • The message is in Italian if the dashboard is in Italian, in English otherwise: all that is left is to describe the problem, and a screenshot can be attached.
  • Nothing is sent until you press Send on the form; the same data can also be copied with a button.

Reversible

  • Every switch works with WordPress hooks: turning it off, or deactivating the plugin, returns the site to how it was. Deleting the plugin also removes its options, the log and the .htaccess blocks.
  • If you lock yourself out, blocks and second factor are suspended with a constant in wp-config.php, or from WP-CLI.
  • Works alongside Wordfence 9.0: different hooks, no conflicts; keep only one attempt limit and one second factor.
  • Italian and English included. No external dependencies: TOTP, QR codes and encryption are in the plugin.

Support

The plugin comes together with the support.

Lobbit Hardening is the tool; the service is what I do on your WordPress site, with the plugin included. Three options, on their own or one after the other: start with the audit, go on with the configuration and, if you want, with monitoring over time.

Security check

A review of the site as it is, with a list of things to fix in order of priority.

  • WordPress, plugins and themes: versions, pending updates, abandoned or unnecessary components.
  • Users and logins: administrators, predictable usernames, passwords, second factor.
  • Hosting: HTTPS, PHP version, security headers, exposed files, permissions, backups.
  • The plugin's Status tab is the starting point; the rest I check by hand.

The result is a document with the priorities and, for each point, what to do.

Installation and configuration

I install the plugin and configure it with you, switch by switch, based on how the site is used.

  • The recommended settings, and a reasoned choice on the ones that have a price: XML-RPC with Jetpack, REST API with forms and shops, comments, Application Password.
  • Second factor for administrators, with emergency codes and the ways out explained.
  • HTTP headers and .htaccess rules verified on the real site; correct IP address behind Cloudflare or a proxy; notifications to those who need to receive them.
  • Coexistence with Wordfence or with the other security plugins already in place.

On delivery, the instructions to manage it yourself.

Monitoring

A periodic check, so the site doesn't stay as it was the day it was configured.

  • Updates for WordPress, plugins and themes; PHP version and end-of-support dates.
  • Reading the log and the notifications: blocks, logins from new addresses, new administrators, Content Security Policy reports.
  • New plugin versions and new protections, applied with the same choices.
  • Support when needed: unblocks, second factor resets, a plugin that stops working.

Ongoing arrangement, at the agreed frequency.

The plugin comes with the service. You don't download it: you find it installed and configured on your site, with a GPL licence, and it stays yours even if the service ends. Write to me from the form at the bottom of the page: I'll reply with a quote based on the site and the option.

Paid licences for Lobbit plugins follow the Terms and conditions of sale.

Screenshots

How it looks in WordPress.

The Status tab with twelve things to look at, before the recommended settings
The Status tab before: twelve things to look at, with the fix next to each one.
The Status tab after the recommended settings, with eight things to look at
After «Apply the recommended settings»: what remains are the things the plugin cannot do on its own.
The Protections tab with the switches for comments, file editor and XML-RPC
Protections: every switch explained, with a warning when it comes at a cost.
The Login tab with the failed attempts limit, the thresholds and the addresses never blocked
Login: attempt limits with thresholds, block duration and addresses that are never blocked.
The Two factor tab with the required roles, the grace period and the remembered device
Two factors: required by role, grace period, remembered device.
The Server tab with a switch for each HTTP security header
Server: one switch per header, with the value to choose where needed.
The panel with the headers a visitor receives from the home page and who sends them
The panel: the headers a visitor really receives, and who sends them.
The .htaccess rules with a preview of the block that will be written
.htaccess rules, with a preview of the block before saving.
The code page after the password, in the WordPress style
The code after the password, in WordPress style.
Enabling the second factor from the profile, with the QR code
Activation from the profile: the QR code is drawn by the plugin.
The ten emergency codes shown after activation
The ten emergency codes, shown only once.
The Log tab with the addresses currently blocked and the events table
Log: the addresses blocked right now, the unblock and the events with filters.
The Status and Two-factor tabs on the phone
On the phone: Status and Two-factor.
The Tools tab with settings export and import
Tools: the JSON file to download, and the file to check before importing it.
The preview of an import from another site: the settings that change and those tied to the site
Before importing: what changes, setting by setting, with the site-specific settings kept apart.

How it is used

From installation to the settings worth keeping, in six steps.

1. Install and activate

In WordPress go to Plugins → Add new → Upload plugin, choose the plugin zip and activate it. A «Hardening» item appears in the menu, opened on the Status tab. All switches are off: the site is exactly as before.

2. Read the Status tab

The red and yellow rows tell you what is missing and where to fix it. Some are solved with a plugin switch; others (HTTPS, an administrator named «admin», the PHP version, file permissions) are fixed in WordPress or in the hosting, and the tab tells you how.

3. Apply the recommended settings

One button turns on the protections suited to almost every site. Then review the others: XML-RPC if you use Jetpack, private REST API if the site has forms or a shop, comments if you use them. Every switch tells you what changes before you turn it on.

4. Turn on the second factor

From your profile: scan the QR code with the app, enter the first code and save the ten emergency codes. The other administrators have the grace period to do the same; those who don't can only open their profile once it expires, until they complete activation.

5. Check Server, Log and Notifications

In the Server tab, look at the headers panel and the preview of the .htaccess rules, then save: the plugin checks them with requests to the site. Turn on the log and choose the events to receive by email, with the test email to check that they arrive.

6. Keep the settings

In the Tools tab, download the JSON file with all the settings and keep it with your backups. On another site upload it, read the preview of what changes and import: the site-specific settings (proxy and addresses) stay out until you tick them yourself.

wp-config.php: the ways out and the secrets key

// Suspends the IP lockouts
define( 'LOBBIT_HARDENING_NO_LOCKOUT', true );

// Suspends the second factor
define( 'LOBBIT_HARDENING_NO_TWO_FACTOR', true );

// No writing of the .htaccess files (the rules are shown to copy by hand)
define( 'LOBBIT_HARDENING_NO_HTACCESS', true );

// Own key for the secrets of the second factor, to set before the users enable it
define( 'LOBBIT_HARDENING_KEY', '...' );

WP-CLI: a user's second factor, the settings

wp lobbit-hardening two-factor status <user>
wp lobbit-hardening two-factor reset <user>
wp lobbit-hardening settings export lobbit-hardening.json
wp lobbit-hardening settings import lobbit-hardening.json --dry-run

PHP: a second factor plugin that the plugin does not know

add_filter( 'lobbit_hardening_two_factor_plugins', function ( $found, $active ) {
	if ( in_array( 'my-2fa/my-2fa.php', $active, true ) ) {
		$found['my-2fa/my-2fa.php'] = 'My 2FA';
	}
	return $found;
}, 10, 2 );

PHP: the visitor's address, for hosting that the settings do not cover

add_filter( 'lobbit_hardening_client_ip', function ( $ip ) {
	// Only when every request really comes through that proxy
	return $_SERVER['HTTP_X_REAL_IP'] ?? $ip;
} );

Another filter: lobbit_hardening_two_factor_api_login, to decide which program-based logins (XML-RPC, REST API) have no page for the code. On nginx the Server tab shows the location blocks to copy into the server configuration.

Updates. New versions of the plugin come with support, not from the WordPress dashboard: you upload them from Plugins → Add new → Upload plugin and WordPress replaces the version in use, keeping the settings, the log and the users' second factors.

Warning. The plugin reduces the attack surface of WordPress, but it does not replace updates, backups and well-managed hosting, and it is neither a firewall nor an antivirus: that is why the Status tab also tells you what needs to be done outside the plugin.

What's new

What has changed, version by version.

The same plugin changelog entries, from the most recent version down to the first. New versions come with the support service and are uploaded from Plugins → Add new → Upload plugin.

Version 1.2 · 13 October 2026

  • With «Block installations and updates from the dashboard» on, the Plugins, Themes and Updates pages state that the buttons are missing because of Hardening, how many updates are pending (plugins, themes, WordPress) and how to update: turn off the block, update, turn it back on. The button leads straight to the switch; the notice is yellow when updates are pending, light blue when not, for administrators only, and it does not appear if the block comes from DISALLOW_FILE_MODS in wp-config.php. Previously those pages showed the new versions without explaining why they could not be installed.

Version 1.1 · 12 October 2026

  • Information tab: the «Ask for support» button opens the contact form on this site already filled in, with request type «Support», the plugin name as the subject and the site data in the message (address; plugin, WordPress and PHP versions; theme; language; active plugins; protections turned on; proxy), in Italian if the dashboard is in Italian and in English otherwise. All that's left is to describe the problem; the data travels in the address fragment, which the browser doesn't send to the server, and nothing is sent until you press Send on the form.
  • New Copy button next to the box with the site data, which now also shows the site address.

Version 1.0 · 10 October 2026

  • New Tools tab, between Notifications and Information. Export: a JSON file with the plugin version, the date, the site address and all the settings of the tabs, as they are saved. Not in the file, because they belong to the site: users' second factors, the log, the status of the .htaccess rules and the email queue.
  • Two-step import: you upload the file, the plugin tells you which site it comes from, when and with which version, then shows only the settings that change, with the value on the site and the one in the file, and you confirm. Site-specific settings (proxy, proxy addresses, never-blocked IPs) are a separate part, ticked by default only if the file comes from the same site. Unknown keys are ignored and listed, every value goes through the limits of its field, a file from a newer version is rejected. The import stays in the log, with the source site and the settings changed.
  • WP-CLI: wp lobbit-hardening settings export and import, with the same table of differences and the confirmation; from the command line the plugin does not write the .htaccess and points to "Check again" in the dashboard.
  • Accessibility verified (WCAG 2.2 A and AA) on every tab, on the import preview, on the profile section and on the login code page. From here on the plugin comes with support from the site: the Information tab explains how updates arrive, from Plugins → Add new → Upload plugin.

Version 0.4 · 10 October 2026

  • Security HTTP headers sent by the plugin, one switch per header, in the new Server tab: X-Content-Type-Options, X-Frame-Options with frame-ancestors (article embeds stay free), Referrer-Policy, Permissions-Policy with the suggested value, Strict-Transport-Security and upgrade-insecure-requests only on HTTPS sites, your own Content Security Policy in «report only» or «enforced» mode with browser reports in the log, X-Powered-By removed. A header already sent by the server or by another plugin is left to them and flagged next to the switch.
  • Headers panel: what a visitor actually receives from the home page and who sends it, with a warning if the responses reveal the Apache and PHP versions; «Check again» repeats the check.
  • .htaccess rules on Apache and LiteSpeed, three switches: no PHP from the uploads folder, no folder listing, no download of sensitive files. Written in a marked block without touching the one from WordPress and the other plugins, with a preview before saving and a check with requests to the site: if the home page answers with an error the block is removed straight away. On nginx the rules are shown so you can copy them into the server configuration.
  • Status tab, the first one: «N things to look at» and four panels with green, yellow or red rows and the link to the fix: recommended switches turned off, limit on attempts, administrators without a second factor, predictable usernames, HTTPS, headers, .htaccess rules, exposed versions, PHP version against end-of-support dates, pending updates, file permissions, debug.
  • "Apply the recommended settings" also turns on the headers and the three .htaccess rules where the plugin can write them: 26 protections in all.
  • The Two factor tab also recognises Really Simple Security, SiteGround's Security Optimizer and Defender: with one of them active the user no longer gets two code prompts without warning. When the second factor is left to the other plugin, the tab only shows the choice.

Version 0.3 · 10 October 2026

  • Two-factor authentication, in the new Two factors tab: after the password, the six-digit code from an authenticator app (Google Authenticator, Aegis, 1Password and similar), activated from the profile in three steps with the QR code drawn by the plugin itself, without external services; ten single-use emergency codes; code by email as an optional alternative. The secrets are encrypted in the database, with the LOBBIT_HARDENING_KEY constant for a key of your own.
  • Mandatory for the chosen roles (administrators, by default) with a grace period; «remember this device» for the chosen number of days; five wrong codes cancel the login and count towards the IP block. It applies to every login form that goes through WordPress, with the code page in the WordPress style.
  • Ways out: reset by another administrator from the user list, WP-CLI command, constant in wp-config.php. If another plugin already handles the second factor (Wordfence, Two-Factor, WP 2FA and others), the tab asks which one to use: only one per site.
  • Second factor events in the log (enabled, disabled, reset, wrong code, access with an emergency code) and email notifications. Coexistence with Wordfence 9.0 verified.

Version 0.2 · 10 October 2026

  • Login tab: limit on failed attempts with blocking of the IP address (5 attempts in 15 minutes by default, 30 minute block), on the login page, on XML-RPC and on Application Passwords; one day block after three blocks in 24 hours; addresses and ranges never blocked with «Add my IP address». Real address behind Cloudflare or a trusted proxy, with the panel showing what the plugin sees. Generic error messages at login and in password recovery, Application Passwords that can be switched off, REST API only for logged in users with the namespaces to leave open.
  • Log tab: failed logins, blocks and unblocks, administrators from new addresses, new administrators, plugins and themes installed, activated or deleted, in a plugin table with filters; the addresses blocked right now with the «Unblock» button; automatic cleanup after the chosen number of days.
  • Notifications tab: email to the administrator or to a chosen address, one switch per event type; during an attack, events of the same type go out together in a summary email. Button for the test email.
  • The emails and the xmlrpc.php response are in the site's language; the translations go through the same mechanism used by WPML and Polylang.

Version 0.1 · 10 October 2026

  • Hardening page with its menu, the summary of active protections, the «Apply the recommended settings» button and the Protections and Information tabs; everything off on activation.
  • The first eight switches: comments off (hidden, not deleted), pingbacks and trackbacks stopped, file editor off, installations and updates blocked from the dashboard with automatic updates still running, XML-RPC off, WordPress version hidden, RSD, Windows Live Writer and shortlink links removed, users hidden from visitors.
  • Plugin icon and Italian translation included.

WordPress security with support

Want it on your site?

Tell me how the site is built (hosting, main plugins, who administers it) and what worries you. I'll reply with a quote for the right formula: the plugin is included.

Contact

Tell me about your site and what you want to protect.

Choose the type of enquiry.
Enter your name.
Enter a valid email address.
Enter a subject.
Write a message.
A screenshot of the problem or your CV: PNG, JPG, WebP or PDF, 5 MB maximum.
Choose a PNG, JPG or WebP image or a PDF of at most 5 MB.
Privacy consent is required to send the request.