Skip to Content

Security Pilot

Security Pilot is een uitgebreide WordPress security-plugin die je site hardt tegen veelvoorkomende aanvallen en kwetsbaarheden. Hij past industriestandaard HTTP security headers toe, beschermt de login-pagina tegen brute-force-aanvallen, blokkeert malicious requests met een ingebouwde firewall, beperkt gevoelige REST API-endpoints en levert een one-click audit die de installatie van A tot F beoordeelt.

In tegenstelling tot opgeblazen security-suites is Security Pilot lichtgewicht en modulair: schakel alleen de bescherming in die je nodig hebt. Elke module kan onafhankelijk worden in- of uitgeschakeld, en alle instellingen worden beheerd vanuit het hoofdmenu Security Pilot in de WordPress admin-sidebar.

Security Pilot — Settings-pagina
Security Pilot — Settings-pagina met elke module op één scrollbaar formulier.

Voordelen

  • HTTP security headers — HSTS, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, X-XSS-Protection en verwijdering van de X-Powered-By-header.
  • Login-bescherming — configureerbare rate limiting, tijdelijke lockouts en permanente bans voor herhaalde offenders, met optionele e-mail alerts.
  • Request-firewall — pattern-gebaseerde detectie van SQL injection, cross-site scripting (XSS), path traversal, remote file inclusion (RFI) en command injection.
  • REST API-bescherming — blokkeer onbevoegde toegang tot gevoelige endpoint-groepen zoals /wp/v2/users, WooCommerce, Jetpack, wp-site-health, Divi Builder en Elementor.
  • WordPress-hardening — schakel de file editor en XML-RPC uit, onderdruk pingbacks en trackbacks, verberg de WordPress-versie, verwijder de RSD-link en de Windows Live Writer-manifest.
  • Rate limiter — per-IP throttling voor 404-floods en andere high-frequency request-patronen, met een configureerbare max-block count en rolling time window.
  • Form-bescherming — rate-limit frontend submissions, blokkeer disposable email-domains en vang bots met verborgen honeypot-velden en een configureerbare time-to-fill-check.
  • Security Check — one-click audit die de installatie van A tot F beoordeelt en per-check status (PASS / WARNING / FAIL) rapporteert over hardening, REST API-exposure, verouderde plugins/themes, debug-instellingen, file editor en meer.
  • Access Rules & attack logging — beheer Blocked IPs, Whitelisted IPs en Whitelisted URLs vanuit een drie-tab-scherm en duik in elke geblokkeerde request in het Attack Log.

Vereisten

Security Pilot is ontworpen voor moderne, self-hosted WordPress-sites.

  • Een werkende WordPress-installatie met administrator-toegang.
  • Een PHP-versie die door je huidige WordPress-release ondersteund wordt.
  • HTTPS wordt sterk aanbevolen. De HSTS-header zou alleen ingeschakeld moeten worden wanneer je site over TLS bereikbaar is op elke URL, inclusief subdomains die je gedekt wilt hebben.
  • Voldoende permissies om HTTP response headers aan te passen. Op de meeste managed hosts werkt dit out of the box; voor sommige reverse proxies of CDNs moeten de headers aan de edge worden toegestaan.

Er zijn geen externe services te configureren en er zijn geen API keys nodig. Settings, logs en blocklists worden opgeslagen in je eigen WordPress-database.

Installatie

  1. Download de Security Pilot plugin-ZIP.
  2. Open in WordPress Plugins → Nieuwe plugin → Plugin uploaden.
  3. Kies het ZIP-bestand en selecteer Nu installeren.
  4. Klik op Plugin activeren zodra de upload klaar is.
  5. Open Security Pilot → Settings om de modules te reviewen. De vier submenu-items, in de volgorde waarin ze verschijnen, zijn Security Check, Access Rules, Attack Log en Settings.

Na activatie wordt geen bescherming geforceerd ingeschakeld — elke module start in een bekende state en kan individueel worden in- of uitgeschakeld. Dat maakt het veilig om op een productie-site te installeren en hardening in kleine, omkeerbare stappen te introduceren.

Configuratie

Alle configuratie gebeurt vanuit Security Pilot → Settings. De pagina groepeert instellingen in modules — elke module is een inklapbare kaart met een eigen enable-toggle en een klein aantal opties.

Een License-kaart bovenaan accepteert een PILOT-XXXX-XXXX-XXXX-XXXX- key (uit je orderbevestiging) en activeert automatische plugin-updates vanuit de GitHub-release-feed zodra geverifieerd. De plugin werkt volledig zonder key; alleen het auto-update-kanaal is gegated.

HTTP Security Headers

De headers-module voegt op standaarden gebaseerde HTTP response headers toe aan elke request die door WordPress geserveerd wordt. Schakel individuele headers in of uit naar de behoeften van je site.

HeaderDefault waardeDoel
X-Frame-OptionsSAMEORIGINVoorkomt clickjacking door de pagina niet in third-party frames te laten embedden.
X-Content-Type-OptionsnosniffStopt browsers met het raden van content types, mitigeert MIME-confusion-aanvallen.
X-XSS-Protection1; mode=blockLegacy XSS-filter voor oudere browsers.
Strict-Transport-Securityingeschakeld met zinvolle defaultsDwingt browsers om HTTPS te gebruiken voor toekomstige visits. Schakel alleen in wanneer de site volledig HTTPS is.
Referrer-Policystrict-origin-when-cross-originBeperkt de referrer-informatie die naar derden lekt.
Permissions-Policyrestrictieve defaultsSchakelt gevoelige browser-features (camera, microfoon, geolocation, etc.) uit die de site niet gebruikt.
Content-Security-PolicyconfigureerbaarBeperkt de origins waarvan scripts, styles, images en andere resources mogen laden.
X-Powered-ByverwijderdVerbergt de X-Powered-By-waarde gegenereerd door PHP of andere componenten die anders je server-stack zouden adverteren.

Een paar notities bij het configureren van headers:

  • HSTS is permanent in browsers zodra ontvangen. Verifieer dat HTTPS overal werkt — inclusief www en eventuele subdomains die je wilt meenemen — voordat je het inschakelt.
  • De Content-Security-Policy is de krachtigste en de meest intrusieve header. Begin met de report-friendly defaults en scherp de policy daarna aan door de browser console te checken op geblokkeerde resources op je echte pagina’s.
  • Zit je site achter een CDN of reverse proxy die headers herschrijft, zorg dan dat die edges de door Security Pilot toegevoegde waarden ongewijzigd doorgeven.

Login-bescherming

Login-bescherming telt failed authentication-pogingen per IP-adres en past een lockout toe wanneer een drempel bereikt wordt. Na een configureerbaar aantal lockouts kan het IP permanent gebanned worden.

Beschikbare instellingen:

  • Max failed attempts — aantal failed logins vanaf een IP voordat een lockout wordt getriggerd. Accepteert waarden van 1 tot 20. De default 5 is een zinvol startpunt.
  • Attempt window — het rolling time window, in minuten, dat gebruikt wordt om failures te tellen. Accepteert waarden van 1 tot 120.
  • Lockout duration — hoelang een locked-out IP geblokkeerd blijft, in minuten. Accepteert waarden van 1 tot 1440 (24 uur).
  • Permanent ban threshold — aantal aparte lockouts dat een IP kan accumuleren voordat het permanent gebanned wordt. Accepteert waarden van 1 tot 20.
  • Email alerts — indien ingeschakeld ontvangt de site-administrator een e-mail telkens wanneer een aanval gedetecteerd wordt en telkens wanneer een IP aan de blocklist wordt toegevoegd.
  • Hide detailed error messages — generieke errorberichten (“ongeldige credentials”) vervangen de standaard berichten van WordPress, zodat aanvallers niet leren of een gebruikersnaam bestaat.

De bescherming geldt voor zowel wp-login.php als het standaard XML-RPC authentication-endpoint, zolang XML-RPC ingeschakeld blijft.

Request-firewall

De Request-firewall inspecteert binnenkomende requests op malicious patterns en geeft een 403 Forbidden-response terug wanneer er één gevonden wordt. De detectie-patterns zijn ingebouwd en dekken:

  • SQL injection — veelvoorkomende payloads tegen query-parameters, POST-bodies en cookies.
  • Cross-site scripting (XSS) — reflected en stored attack signatures.
  • Path traversal../-style pogingen om uit de document root te ontsnappen.
  • Remote file inclusion (RFI) — verwijzingen naar externe URLs in contexten waar lokale paden verwacht worden.
  • Command injection — shell metacharacters in parameters die waarschijnlijk system-style functies bereiken.

De firewall heeft geen configuratie per rule. Hij is aan of uit. Geblokkeerde requests worden vastgelegd in het attack log dat hieronder beschreven wordt, inclusief de offending parameter en de rule die de block triggerde.

Rate Limiter (404 Flood Protection)

Sites onder brute-force probing produceren honderden 404-responses per IP per minuut op zoek naar verborgen plugin-assets of wp-config backups. De Rate Limiter capt dat verkeer per source IP door 404-hits in een rolling window bij te houden:

VeldDefaultNotities
Max 404 responses voor block25Wordt deze overschreden, dan wordt het IP toegevoegd aan de Blocked IPs-lijst.
Time window (seconden)60Rolling window waarover de teller wordt geëvalueerd.

De block wordt geforceerd door hetzelfde mechanisme dat Login-bescherming gebruikt, dus hij verschijnt in de tab Access Rules → Blocked IPs met reden 404_flood.

REST API-bescherming

WordPress exposeert standaard een grote REST API, inclusief endpoints die nuttig zijn voor site builders maar op een productie-site vaak onnodig. Security Pilot kan unauthenticated toegang tot hele endpoint- groepen blokkeren terwijl de rest van de API intact blijft.

Beschermde groepen:

  • /wp/v2/users — user enumeration via het core users-endpoint.
  • WooCommerce — store-, order- en customer-endpoints die WooCommerce exposeert wanneer geïnstalleerd.
  • Jetpack — Jetpack’s eigen REST-namespace.
  • wp-site-health — health-check-endpoints die informatie over de omgeving kunnen lekken.
  • Divi Builder — Divi’s REST-endpoints.
  • Elementor — Elementor’s REST-endpoints.

Schakel bescherming alleen in voor de groepen die je niet nodig hebt. Bijvoorbeeld: een site die geen WooCommerce draait kan de WooCommerce- endpoints veilig dichtzetten. De plugin checkt authentication op elke request en geeft een authorization error terug voor unauthenticated callers die een beschermde groep proberen te bereiken.

Form-bescherming

Beschermt contact- / comment- / login-forms over de site tegen spam, disposable email-signups en high-velocity bot-submissions:

VeldDefaultNotities
Max submissions per IP binnen cooldown1Harde cap per IP in het cooldown-window.
IP cooldown window (minuten)30Hoelang de per-IP rate gate dicht blijft na een submission.
Max totale form-mails per uur (globaal)15Site-wide plafond op gemailde form-submissions per uur.
Geblokkeerde email-TLDscomma-separatedBouncet submissions waarvan de email-TLD met de lijst matcht (bijv. mfa, xyz, top, click, link, surf, icu, gq, ml, cf, tk, ga).
Geblokkeerde email-domainscomma-separatedBouncet submissions waarvan het volledige email-domain met de lijst matcht — handig voor disposable-mail providers.

Honeypot-traps (verborgen velden die alleen door bots ingevuld worden) en een minimum time-to-fill-check draaien naast de rate gates. Geblokkeerde pogingen worden gelogd in het Attack Log.

WordPress-hardening

De hardening-module schakelt WordPress-features uit die vaak misbruikt worden of die informatie blootleggen die aanvallers kunnen gebruiken om een exploit te plannen. Elke optie is onafhankelijk.

  • Disable file editor — schakelt de in-dashboard theme- en plugin-file-editor uit (DISALLOW_FILE_EDIT). Een aanvaller die admin-credentials weet te bemachtigen kan dan geen code meer direct vanuit de WordPress UI aanpassen.
  • Disable XML-RPC — blokkeert het endpoint xmlrpc.php, dat een veelvoorkomend target is voor brute-force- en amplification-aanvallen. Schakel XML-RPC alleen uit als geen integratie op je site er op leunt.
  • Disable pingbacks and trackbacks — sluit een long-standing amplification-vector af die in DDoS-campagnes gebruikt is.
  • Hide WordPress version — verwijdert de generator-meta-tag en versie query-parameters uit ge-enqueude assets, zodat de geïnstalleerde WordPress-versie niet in de page source wordt geadverteerd.
  • Remove RSD link — laat de Really Simple Discovery-link vallen die door externe publishing-clients gebruikt wordt.
  • Remove WLW manifest — verwijdert de Windows Live Writer-manifest- link die vandaag zelden nuttig is.

Voor de meeste productie-sites is het veilig om alle hardening-opties in te schakelen. Het uitschakelen van de file editor en XML-RPC, in het bijzonder, wordt door de WordPress security community gezien als een baseline aanbeveling.

Security Check

De Security Check-pagina — Security Pilot → Security Check — draait een one-click audit en produceert een letter grade van A (“uitstekend, je security is sterk”) tot F, naast KPI-tellers voor totaal passed, failed, warning en total checks.

Security Pilot — Security Check audit pagina
Security Check — A-tot-F-cijfer plus per-check PASS / WARNING / INFO-status over hardening, REST API-exposure, debug-instellingen, plugin/theme-versheid en meer.

De Check dekt elke categorie die de plugin vanuit WordPress kan verifiëren, inclusief (maar niet beperkt tot):

  • HTTPS geconfigureerd voor de site-URL.
  • File editor uitgeschakeld (DISALLOW_FILE_EDIT).
  • XML-RPC uitgeschakeld.
  • Debug logging en debug display uit in productie.
  • wp-config.php-toegang geblokkeerd op web-server-niveau.
  • WordPress core, plugins en themes up-to-date.
  • Inactieve plugins nog steeds geïnstalleerd (attack surface).
  • Default admin-gebruikersnaam afwezig.
  • REST API-bescherming ingeschakeld.
  • HTTP security headers, login-bescherming en request-firewall actief.
  • Sterke DB prefix, PHP-exposure, server signature.

Elke rij toont een korte titel, een one-line description en een status-badge (PASS, WARNING, FAIL, INFO). De module Settings → Security Check exposeert drie opt-in toggles die diepere checks toevoegen (outdated plugins, outdated themes, plugin vulnerability lookup tegen een publieke feed) — die draaien wanneer het rapport wordt aangevraagd en vertragen het met een paar seconden, dus standaard staan ze uit. Vanuit het rapport zelf zijn fixes meestal one-clicks weg in de WordPress-admin (plugin updaten, inactieve plugin verwijderen, een hardening-toggle aanpassen).

Gebruik

Een praktische eerste doorloop van de plugin ziet er zo uit.

  1. Installeer en activeer Security Pilot.
  2. Open Security Pilot → Settings.
  3. Schakel HTTP Security Headers in met de aanbevolen defaults. Bezoek een paar pagina’s van je site en check de browser console op onverwachte Content-Security-Policy violations.
  4. Schakel Login-bescherming in. Laat Max failed attempts op 5 staan, kies een attempt window van 15 minuten en een lockout van 60 minuten voor een typische site. Zet e-mail alerts aan, zodat je het weet wanneer de site aangevallen wordt.
  5. Schakel de Request-firewall in. Er is geen verdere configuratie nodig.
  6. Schakel de Rate Limiter in om 404-floods te vangen (default 25 hits in 60 seconden → IP toegevoegd aan de blocklist).
  7. Toggle REST API-bescherming voor de endpoint-groepen die je site niet publiek gebruikt. De groep /wp/v2/users is bijna altijd veilig om dicht te zetten.
  8. Schakel Form-bescherming in op sites met contact- / comment- forms — kies een zinvolle per-IP cooldown en een TLD-blocklist.
  9. Schakel WordPress-hardening-opties in. Schakel op productie-sites minimaal de file editor en XML-RPC uit.
  10. Draai een Security Check en handel elke WARNING- en FAIL- rij af (update of verwijder de getoonde plugins en themes, klap de geflagde hardening-toggles om).

Na deze initiële doorloop kom je periodiek terug naar Security Pilot → Security Check om het cijfer boven C te houden, en naar Attack Log + Access Rules om te reviewen wat er gevangen is.

Access rules reviewen

Het scherm Access Rules (Security Pilot → Access Rules) is een gecentraliseerd drie-tab-controlepaneel voor IP- en URL- gebaseerde blocklists en whitelists:

  • Blocked IPs — elk adres dat momenteel geblokkeerd is door Login-bescherming, de Rate Limiter of de firewall. Elke rij toont het IP, de block-reden (bijv. firewall:path_traversal, 404_flood, firewall:sqli), het tijdstip waarop het is toegevoegd en een knop Unblock. Een simpel formulier bovenaan laat je handmatig een willekeurig IP blokkeren met een optionele reden, en een zoekveld filtert op IP of reden.
  • Whitelisted IPs — adressen vrijgesteld van elke check (kantoor, monitoring service, staging server, je eigen thuis-IP).
  • Whitelisted URLs — paden vrijgesteld van de 404 Rate Limiter (handig wanneer een legitiem endpoint legitiem in bursts 404 teruggeeft).
Access Rules — Blocked IPs-tab
Access Rules — Blocked IPs-tab met manueel block-formulier, search en per-rij Unblock-actie; zustertabs dekken Whitelisted IPs en Whitelisted URLs.

Gebruik dit scherm om:

  • Een adres te unblocken dat gevangen werd doordat een legitieme gebruiker zijn wachtwoord verkeerd intikte.
  • Een known-good IP te whitelisten (je kantoor, monitoring service, staging server) zodat het niet per ongeluk gelockt kan worden.
  • Een URL te whitelisten die de 404 rate limit by design raakt (bijv. een probe-pad dat door externe monitoring wordt geraadpleegd).

Het attack log reviewen

Het Attack Log (Security Pilot → Attack Log) registreert elke geblokkeerde request, inclusief brute-force lockouts, firewall hits, rate-limiter trips, form-spam bounces en REST API denials. Elke rij draagt de timestamp, source IP, Attack type (bijv. RESTRICTION, REQUEST_URI, PATH_TRAVERSAL, COMMAND_INJECTION, POST_X), de Rule listener die de block uitvaardigde en de Request URI die hem triggerde. Een bulk-actie Clear Log wist de pagina, en de toolbar toont een free-text search plus per-IP- en per-listener-filters.

Security Pilot — Attack Log
Attack Log — chronologische view met attack-type-badges, rule listeners en bulk-acties; nuttig voor zowel post-incident review als firewall-tuning.

Het log is nuttig voor zowel post-incident review als voor het tunen van de firewall: verschijnt een legitieme request naar je site in het log, dan kun je identificeren welke rule verantwoordelijk was en beslissen of je de request, het IP of de rule verfijnt.

WordPress dashboard widget

Security Pilot voegt een widget toe aan het standaard Dashboard-scherm (de pagina die WordPress bij het inloggen opent), zodat de headline-getallen zichtbaar zijn vanaf het moment dat je inlogt.

Security Pilot — WordPress dashboard widget
De Security Pilot widget op het WordPress Dashboard — huidig letter grade, blocked-IP- en attack-tellers, en de vijf meest recente aanvallen met deep links naar Attack Log en Security Check.

De widget toont:

  • Het laatste Security Check grade (A–F) en numerieke score (bijv. A 95/100), gerenderd als een gekleurde ring.
  • Een live Blocked IPs-teller, opgehaald uit de Access Rules- tabel.
  • Een lopende Attacks-teller, opgehaald uit het Attack Log.
  • De lijst Recent Attacks — laatste vijf rijen uit het Attack Log met type-badge, source IP en timestamp.
  • Footer shortcuts naar Attack Log en Full Security Report.

FAQ

Vervangt Security Pilot andere security-plugins?

Voor de meeste sites: ja. Security Pilot dekt HTTP headers, login- bescherming, request-filtering, REST API-restricties, hardening en auditing. Het is bewust lichtgewicht in plaats van een “swiss-army”- suite. Naast een andere firewall- of login-protection-plugin draaien kan technisch maar is zelden nuttig en kan overlappende rules dubbel laten vuren.

Breken de headers mijn site?

De default-waarden zijn conservatief. De twee headers die het vaakst aandacht nodig hebben zijn HSTS en Content-Security-Policy.

  • Schakel HSTS pas in nadat je site volledig bereikbaar is over HTTPS, inclusief eventuele subdomains die je wilt meenemen. De header wordt door browsers gecached en kan niet makkelijk worden ingetrokken.
  • Tune de Content-Security-Policy nadat je de browser console geobserveerd hebt op geblokkeerde resources op echte pagina’s. Custom scripts, fonts en analytics moeten vaak aan de policy worden toegevoegd.

Blokkeert de request-firewall legitiem verkeer?

De detectie-patterns richten zich op bekende attack signatures en zijn meestal specifiek. Wordt een legitieme request geblokkeerd, dan verschijnt hij in het attack log met de rule die de block triggerde. Je kunt vervolgens het IP unblocken en, als het pattern echt onvermijdelijk is, de uitzondering documenteren voor je team.

Werkt de plugin achter een CDN of reverse proxy?

Ja. De plugin leest het originating IP-adres uit de standaard request- headers en kan bezoekers achter een CDN correct identificeren, mits je hosting-omgeving de juiste X-Forwarded-For- of equivalente header doorstuurt. Zorg dat geen edge layer voor WordPress de response- headers die Security Pilot toevoegt eruit stript.

Kan ik attack logs of blocked IP-lijsten exporteren?

Het attack log en de blocked IP-tabel worden opgeslagen in je WordPress-database en kunnen direct vanuit de admin-interface worden gereviewd. Voor long-term archivering of off-site analysis maak je een database-backup zoals je dat voor elke andere WordPress-data zou doen.

Breekt het uitschakelen van XML-RPC iets?

XML-RPC wordt gebruikt door de legacy Windows Live Writer-client, de WordPress mobiele apps in bepaalde configuraties en een klein aantal third-party integraties. Gebruik je geen van deze, dan is XML-RPC uitschakelen één van de meest effectieve single-click hardening-stappen die je kunt zetten.

Blijven instellingen bewaard wanneer de plugin gedeactiveerd wordt?

Ja. Security Pilot deactiveren houdt je configuratie, attack log en blocklist in de database, zodat het opnieuw activeren van de plugin de vorige state herstelt.

Troubleshooting

Een legitieme gebruiker is buitengesloten

Open Blocked IPs, lokaliseer de entry voor het betreffende adres en verwijder de block. Wordt dezelfde gebruiker herhaaldelijk buitengesloten, overweeg dan:

  • Max failed attempts verhogen voor vergeetachtige gebruikers.
  • Het IP van de gebruiker (of het kantoor-NAT-IP) toevoegen aan de allowlist.
  • De gebruiker vragen om zijn wachtwoord te resetten in plaats van ernaar te gokken.

Browser blokkeert resources na het inschakelen van CSP

De Content-Security-Policy is by design strict. Open de browser developer tools en kijk naar de Console-tab — de browser meldt elke geblokkeerde resource samen met de directive die het afwees. Pas de CSP aan om de trusted origins (CDN, analytics-provider, font-host) op te nemen waar je site op leunt.

Pagina’s blijven laden over HTTP na het inschakelen van HSTS

HSTS wordt pas gehonoreerd nadat de browser de header minstens één keer over HTTPS heeft gezien. Bezoek de site direct via https:// om de cache te primen. Is de site nog niet bereikbaar over HTTPS voor elke URL die je adverteert, schakel HSTS dan uit tot de migratie is afgerond.

REST API-integraties werken niet meer

Stopt een integratie die op een beschermde endpoint-groep leunt met werken, schakel de bescherming voor die groep dan tijdelijk uit onder REST API-bescherming en bevestig dat de integratie correct authenticeert. Veel integraties verwachten als een authenticated WordPress-gebruiker te worden aangeroepen; authenticated requests worden door deze module niet geblokkeerd.

Headers zijn niet aanwezig in de response

Sommige hosts of reverse proxies strippen of overriden response- headers toegevoegd door PHP. Verifieer de headers met een tool zoals curl -I https://example.com/ of de network inspector van je browser. Ontbreekt een header, raadpleeg dan de documentatie van de host om te zien hoe je custom headers kunt laten doorgaan, of voeg de header aan de edge toe als de host dat vereist.

Email alerts arriveren niet

Email alerts gebruiken WordPress’ functie wp_mail(). Komt er geen e-mail aan, dan zit het probleem bijna altijd in de mail-configuratie van de site in plaats van bij Security Pilot. Installeer een transactionele mail-plugin (bijvoorbeeld een plugin die WordPress-mail via SMTP routeert) en test opnieuw door een lockout vanuit een test- browser te triggeren.

Last updated on