WordPress plugin intelligence profile

A little more secure

Stop bots from brute force hacking your wp-login.php

WP PlugIndex snapshot

Current directory snapshot

Tested up to WordPress 7.1
Current version1.1.2
WordPress coverageTested up to WordPress 7.1
Minimum stackWP 5.0 · PHP 8.2
Directory statusactive
Last directory update2 Oct 20261mo ago
Active installations100Adoption metric — not a quality score
WordPress.org rating5.0 / 5 from 1 ratings
Official packageDirect from WordPress.org

Repository metrics are context, not quality scores. Active installations measure adoption and can strongly reflect a plugin’s age and historical popularity. Ratings, recent updates and “Tested up to” metadata also do not guarantee modern code, error-free operation, security, feature completeness or suitability for a particular site. Why active installs don’t tell the whole story →

WP PlugIndex currently records A little more secure version 1.1.2 as active, updated 1mo ago and tested up to WordPress 7.1.

Overview

About this plugin

php

php without an unlock parameter answers with a 404 and a

holding page. JavaScript counts down a few seconds, then redirects to the same

URL with the parameter appended. Only that request renders a usable login form,

and only it carries the nonce that a login POST has to contain — a POST without

a valid nonce is rejected.

This raises the cost of naive automation. It is not a lockout mechanism: whoever

requests the unlock URL first can read the nonce and post with it, which is why

the plugin is called a little more secure.

There is nothing to configure. Activating the plugin is enough.

Customising

Three filters, for a theme or a small plugin of your own.

a_little_more_secure_is_unlocked decides whether a request counts as unlocked.

By default that is the presence of the parameter; override it to implement your

own rule, for example a one-time token or an office IP allowlist:

add_filter( 'a_little_more_secure_is_unlocked', function ( $is_unlocked ) { return $is_unlocked || my_own_check(); } );

a_little_more_secure_get_param_name changes the name of the unlock parameter, a-little-more-secure by default.

a_little_more_secure_redirect_wait_seconds changes the delay before the

redirect, 3 seconds by default.

php has to render the

nonce itself, otherwise the POST is rejected — call

a_little_more_secure_nonce_field() inside the form. Forms built with

wp_login_form() get it automatically.

Rotating the unlock parameter

The default parameter name is public knowledge, so a bot written for this plugin

can hardcode it. If you want a name that changes over time, put the token in the

name itself: the parameter name filter runs both when the redirect URL is built

and when the request is checked, so both sides agree without storing anything.

function my_alms_token( int $bucketsAgo = 0 ): string { $ttl = 15 * MINUTE_IN_SECONDS; $bucket = (int) floor( time() / $ttl ) - $bucketsAgo;

return 'alms_'. substr( hash_hmac( 'sha256', 'alms|'. $bucket, wp_salt( 'nonce' ) ), 0, 20 ); }

add_filter( 'a_little_more_secure_get_param_name', function () { return my_alms_token(); } );

add_filter( 'a_little_more_secure_is_unlocked', function ( $is_unlocked ) { return $is_unlocked || isset( $_GET[ my_alms_token( 1 ) ] ); } );

Accepting the previous bucket as well keeps a request that crosses a bucket

boundary from being rejected, so the effective validity is 15 to 30 minutes.

Keep the token alphanumeric — PHP rewrites dots and spaces in parameter names.

Be aware of what this does and does not do. It stops bots that hardcode the

parameter name. It does not stop anything that fetches the page and reads the

name out of it — the value has to be handed to the browser before anyone is

logged in, so a scraper can always obtain it too.

Three things to expect: bookmarked unlock URLs stop working once the token

expires, though an expired token lands on the holding page and is redirected

with a fresh one, so it costs one extra request. Keep the lifetime well above

the redirect delay, otherwise the token can expire during the countdown. And be

careful with page caching — a short-lived token in cached HTML means logins that

are rejected until the cache is refreshed.

WordPress.org metadata

Plugin tags

Topics listed for this plugin in the WordPress.org directory.

  • security
Compatibility & maintenance

Compatibility & maintenance

Tested with WP 7.1

Marked as tested with the current WordPress 7.1 release.

Current WordPress releaseWordPress 7.1
WordPress.org Tested up to7.1
Minimum requirementsWordPress 5.0 · PHP 8.2
Update activity2 Oct 20261mo ago

“Tested up to” is directory metadata supplied by the plugin author. WP PlugIndex does not turn an older declaration into a claim that the plugin is incompatible.

Changes recorded by WP PlugIndex

Recent tracked changes

Version1.1.11.1.2
Version1.1.01.1.1
WordPress compatibility6.7.77.1.2
Tracking & source

WP PlugIndex tracks public WordPress.org directory metadata and records selected version, compatibility and availability changes as they are detected.

Plugin watchlist

Watch this plugin

Sign in to your WP PlugIndex account or create a free account. Free accounts can watch up to 5 plugins and see what changed.

Watch limit

Watchlist limit reached

You have reached your current active watch limit.