Beveiligingslekken in wp-config.php: WordPress beter beveiligen

Terwijl wp-config.php in vi openstond, was de swapkopie (.swp) die in dezelfde map ontstond gewoon via een webadres te openen. Ik heb dit op 2026-09-13 op mijn eigen server vastgesteld, en die kopie bevatte het databasewachtwoord en alle beveiligingssleutels.
Voor de beveiliging van wp-config.php loop je de zes punten hieronder van boven naar beneden na.
1️⃣ Wat er gebeurt als wp-config.php openbaar wordt
In wp-config.php staan de naam, gebruiker en het wachtwoord van de database, plus de 8 beveiligingssleutels die inlogcookies versleutelen.

Raakt dit bestand openbaar, dan kan een aanvaller rechtstreeks met de database verbinden of met de beveiligingssleutels inlogsessies vervalsen en zo beheerrechten overnemen.
2️⃣ Bestandsrechten beperken tot 600
WordPress zet mappen meestal op 755 en bestanden op 644, maar wp-config.php beperk je tot 600, zodat alleen de eigenaar het kan lezen en schrijven. Dit commando is uitgevoerd op de testsite testpilotweb.com.
chmod 600 /home/testpilotweb/www/wp-config.php
stat -c '%a %U' /home/testpilotweb/www/wp-config.php
600 testpilotwebOp servers waar PHP onder een ander account draait dan de eigenaar van het bestand, kan WordPress het bij 600 niet lezen en opent de site niet. Op testpilotweb.com draait PHP-FPM onder hetzelfde account als de eigenaar, dus de site opende na de wijziging gewoon.
Bij shared hosting zonder SSH zet je dezelfde waarde via het rechtenmenu van een FTP-programma of van het bestandsbeheer in cPanel.
3️⃣ Toegang blokkeren op de webserver
Kun je de rechten niet wijzigen of wil je een extra laag, laat de webserver dan verzoeken om wp-config.php gewoon weigeren.
🔲 Apache (.htaccess)
<Files wp-config.php>
Require all denied
</Files>De regels [order allow,deny] en [deny from all] die je vaak in oudere artikelen ziet, zijn Apache 2.2-syntaxis. In Apache 2.4 werken ze alleen als de compatibiliteitsmodule (mod_access_compat) aanstaat.
🔲 nginx
nginx leest .htaccess niet, dus zet je een [location]-regel in het serverconfiguratiebestand; mijn server geeft op dezelfde manier 403 terug.
location ~* /wp-config(-sample)?\.php$ {
deny all;
}Escape de punt in de reguliere expressie als [\.]. Laat je de punt staan, dan worden ook artikeladressen zoals [/wp-config-php-basisinstellingen/] geblokkeerd; door precies die fout gaf ook bij mij ooit een artikel 403.
4️⃣ Tijdelijke editorbestanden en back-upbestanden blokkeren
De [.swp]-kopie die ontstaat terwijl een bestand in vi openstaat en de [.bak]-kopie die je vóór het bewerken bewaart, worden niet als PHP uitgevoerd maar als platte tekst verstuurd.
In nginx blokkeer je beide soorten tegelijk; [444] is een code die alleen nginx kent en die de verbinding sluit zonder antwoord.
location ~ \.sw[opx]$ { return 444; }
location ~* (\.(bak|orig|old|save)|_ori|\.bak\.[0-9]+)$ { return 444; }5️⃣ Eén niveau boven de webroot zetten
WordPress zoekt wp-config.php eerst in de installatiemap en laadt het, als het daar niet staat, uit de map direct erboven. Zet je het bestand één niveau boven [public_html], dan is het via geen enkel webadres meer bereikbaar.
Staat er in de map erboven echter de [wp-settings.php] van een andere WordPress-installatie, dan leest WordPress de wp-config.php in die map niet. Controleer na het verplaatsen meteen of de site en het beheerscherm nog openen.
6️⃣ Bestandsbewerking uitschakelen
Hiermee schakel je in het WordPress-dashboard de menu's ‘Thema-bestandseditor’ en ‘Plugin-bestandseditor’ uit. Zelfs als een aanvaller beheerrechten buitmaakt, is dit een van de sterkste verdedigingen tegen het via het web invoegen van schadelijke code.
define('DISALLOW_FILE_EDIT', true); 7️⃣ wp-config-sample.php verwijderen
wp-config-sample.php is een voorbeeldbestand voor de installatie, dus je mag het verwijderen zodra die klaar is. Er staat niets gevoeligs in, maar aanvallers zoeken het op het standaardpad, dus er is geen reden om het te laten staan.
De echte regels van het voorbeeldbestand en de betekenis van elk onderdeel staan in het artikel wp-config.php: basisinstellingen uitgelegd. Laat je het bestand staan, dan blokkeert het deel [(-sample)?] van de nginx-regel hierboven ook dit bestand.
ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.