Tomas Lindqvist
@tlindqvist · Hardening and operations · 12 ARTICLES
Threat models plugins, audits capability and nonce handling, and builds the observability that tells you an integration broke before a customer does.
The Capability Checks People Forget at Three Entry Points
REST routes, admin-ajax handlers and admin-post actions each need their own guard. Here is the check each one requires and why the admin menu is not protection.
SEC
Tomas Lindqvist
15 SEP 2026 · 7M
What PHPStan Catches in a WordPress Plugin, and What It Misses
PHPStan finds undefined variables and wrong argument counts in plugin code. It cannot see a wrong capability name, a filter arity bug or a SQL injection.
TOOL
Tomas Lindqvist
04 SEP 2026 · 8M
Redis or Memcached: What the WordPress Object Cache Needs
Both backends store the same WordPress keys. What decides the choice is eviction, restarts, shared servers and what wp_cache_flush really clears.
INFRA
Tomas Lindqvist
07 AUG 2026 · 8M
A Nonce Proves Intent, and Never Permission to Act
WordPress nonces are short-lived CSRF tokens, not permission checks. Where they fail, why the failure looks like a logout, and what to pair them with.
SEC
Tomas Lindqvist
03 AUG 2026 · 9M
Where $wpdb->prepare() Protects You, and Where It Cannot
prepare() escapes each value and splices it into a query string. Here is what that contract covers, and the identifiers, wildcards and shapes it never touches.
SEC
Tomas Lindqvist
02 JUL 2026 · 9M
The Thundering Herd When a Flash Sale Cache Entry Expires
When one popular cache entry expires under load, every request recomputes the same value. Here is how to spread that work, and where a lock makes it worse.
PERF
Tomas Lindqvist
18 JUN 2026 · 7M
From WP-Cron to a Job Queue With Claims, Retries and Dead Letters
WP-Cron runs when traffic arrives. System cron fixes the trigger; a queue with an atomic claim, backoff retries and a dead-letter state fixes the work.
INFRA
Tomas Lindqvist
04 JUN 2026 · 8M
Deciding What Invalidates What Before the Cache Bugs Arrive
An object cache with no invalidation plan serves stale data either on a timer or forever. How to choose between counter bumps, key deletes and versioned keys.
INFRA
Tomas Lindqvist
27 MAY 2026 · 8M
Threat Modelling a WooCommerce Plugin in Ninety Minutes
Four questions, seven trust boundaries and a table you can fill in as a team. What a ninety-minute threat model finds, and the class of bug it will never find.
SEC
Tomas Lindqvist
28 APR 2026 · 9M
What to Log on a Store, and What Has to Stay Out of the Log
Logs, metrics and traces answer different questions. What a WooCommerce store should record, what must never reach a file, and which alerts earn a page.
INFRA
Tomas Lindqvist
26 FEB 2026 · 8M
Handling File Uploads in a Plugin Without Creating an Incident
The type field in $_FILES is whatever the browser sent. Upload handling starts with an allowlist, a content check and a filename the client never chooses.
SEC
Tomas Lindqvist
05 FEB 2026 · 8M
Database Migration Safety When the Store Cannot Go Offline
A plugin schema change runs inside a web request, on a database you do not control, with no rollback. The rules that keep it survivable.
TOOL
Tomas Lindqvist
07 JAN 2026 · 8M