Skip to content
System nominalUTC --:--:--Articles 041

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 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 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 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 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 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 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 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 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 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 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 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 07 JAN 2026 · 8M