Als u een map-URL op uw site bezoekt, bijvoorbeeld https://uwdomein.nl/wp-content/uploads/2024/, gebeurt er een van drie dingen. U ziet een schone witte WordPress-pagina (omdat index.php het overneemt), u ziet een "403 Forbidden"-pagina, of u ziet iets dat eruitziet als een FTP-browser: een lijst van elk bestand in die map, met formaten en tijdstempels. Het derde geval is het probleem waar deze gids over gaat.
Directory listing (ook wel "directory browsing" of "directory indexing" genoemd) is een webserverfunctie die automatisch een HTML-index weergeeft wanneer er geen index.html of index.php in een map wordt gevonden. Op een statische site is dat af en toe handig. Op een WordPress-site is het bijna altijd een lek. Deze gids legt uit wat er specifiek lekt, waarom dat uitmaakt, en hoe u de functie correct uitschakelt op Apache, nginx en de verschillende beheerde WordPress-hosts.
Wat lekt er werkelijk wanneer directory listing is ingeschakeld?
De meeste WordPress-mappen bevatten ten minste één bestand dat interessant is voor een aanvaller, een concurrent of gewoon een nieuwsgierige bezoeker. De realistische worstcasescenario's:
/wp-content/uploads/bevat elk mediabestand dat ooit is geüpload, georganiseerd per jaar en maand. Met listing ingeschakeld kan iedereen PDF's zien die zijn "ontkoppeld" maar nooit verwijderd, schetsen van afbeeldingen, klantdocumenten en alle privébestanden die een redacteur heeft geüpload in de veronderstelling dat een "obscure URL" voldoende bescherming was./wp-content/plugins/onthult de exacte lijst van geïnstalleerde plug-ins op de site, inclusief degene die zijn gedeactiveerd maar niet verwijderd. Dat is een precieze winkellijst van kwetsbaarheden voor elke scanner./wp-content/backup/,/backups/,/wp-content/uploads/backups/en vergelijkbare mappen zijn typische bestemmingen voor back-upplug-ins. Als listing aan staat, worden volledige databasedumps en gezipte siteback-ups direct downloadbaar.- Themamappen bevatten vaak oude versies van
style.css, achtergebleven SCSS-bestanden, verborgen testpagina's en ontwikkelaarsnotities die nooit publiek bedoeld waren. - Site-rootmappen kunnen
wp-config.php.bak, swap-bestanden van editors (.swp),.git/-mappen van een mislukte deploy, en vergelijkbare opruimresten tonen.
De gevoelige bestanden in die mappen staan er meestal omdat iemand ze snel heeft geüpload, ze later wilde verwijderen en het is vergeten. Zolang de map de inhoud niet vermeldt, vindt niemand ze. Op het moment dat listing wordt ingeschakeld, ligt elke URL in die mappen op één klik afstand om te worden geïndexeerd door een zoekmachine of geoogst door een scanner.
Hoe controleert u of directory listing op uw site is ingeschakeld
De snelste test duurt tien seconden. Open deze URL's in een privévenster:
https://uwdomein.nl/wp-content/https://uwdomein.nl/wp-content/uploads/https://uwdomein.nl/wp-content/plugins/https://uwdomein.nl/wp-includes/
Wat u wilt zien, is een 403 Forbidden-pagina of, in het geval van /wp-content/, een blanco witte pagina (dat is de lege index.php van WordPress die zijn werk doet). Wat u niet wilt zien, is een lijst met bestanden. Als u die ziet, staat listing aan voor die map. InspectWP voert deze controle ook uit bij elke scan en markeert de getroffen mappen in het beveiligingsgedeelte.
Optie 1: Directory listing uitschakelen op Apache (en LiteSpeed)
De Apache-richtlijn die dit gedrag regelt, heet Options, met de waarde Indexes die listing inschakelt en Options Indexes wordt ontkend door het zonder voorloop-plus te schrijven, plus een minteken in de richtlijn zelf. Voeg het volgende toe aan het bestand .htaccess in uw WordPress-rootmap, boven de markering # BEGIN WordPress:
Options -IndexesDeze ene regel schakelt listing in één keer uit voor de hele WordPress-installatie. Het geldt voor elke map onder de documentroot, tenzij een specifiekere regel dieper in de boomstructuur dit overschrijft.
Als uw host Options in .htaccess volledig blokkeert (sommige gedeelde hosters doen dit om prestatieredenen), hebt u twee alternatieven:
- Plaats een lege
index.phpofindex.htmlin elke map die u wilt afsluiten. WordPress doet dit al voor/wp-content/,/wp-content/plugins/en een paar andere, maar niet voor/wp-content/uploads/. Het lege bestand zorgt ervoor dat Apache dat bestand serveert in plaats van de map te listen. - Vraag uw host om de
Options-richtlijn voor uw account in te schakelen. De meeste beheerde hosts doen dit op verzoek.
De index.php-truc is eenvoudig maar gemakkelijk verkeerd te doen: u moet eraan denken om het bestand toe te voegen aan elke nieuw aangemaakte map, inclusief de jaar/maandmappen die WordPress automatisch aanmaakt voor nieuwe uploads. Een webserverregel heeft dat probleem niet.
Optie 2: Directory listing uitschakelen op nginx
Op nginx wordt directory listing geregeld door de autoindex-richtlijn. Standaard staat deze op off in de meeste installaties, dus op een standaard nginx-setup bestaat het probleem niet. De mappen die u bezoekt, vallen door naar een 403 wanneer er geen indexbestand aanwezig is.
Als listing aan staat, heeft iemand het op een bepaald moment expliciet ingeschakeld. Zoek naar autoindex on; in uw nginx.conf, in het server-blok van de site, of in eventuele meegeladen conf.d-bestanden. Verwijder de regel of wijzig deze in:
autoindex off;Herlaad nginx met sudo nginx -t && sudo systemctl reload nginx. Het volgende mapverzoek zal een 403 krijgen in plaats van een bestandslijst.
Als u nginx niet kunt herladen (afgeschermde beheerde hosting), werkt dezelfde index.php-truc uit het Apache-gedeelte ook op nginx, omdat nginx graag een bestaand indexbestand serveert voordat het terugvalt op autoindex.
Optie 3: Beheerde WordPress-hosting
Beheerde hosts (Raidboxes, Kinsta, WP Engine, Cloudways, Pressable, etc.) schakelen directory listing meestal standaard uit op serverniveau. Als u merkt dat een van deze hosts listing op uw account toch heeft ingeschakeld, is een snel supportticket de juiste actie. Zij hebben toegang tot de centrale nginx-configuratie en kunnen het in minuten oplossen. Proberen het vanuit WordPress op een beheerde host te omzeilen, is zelden de moeite waard.
Merk op dat sommige hosts een CDN-laag gebruiken (Cloudflare, KeyCDN, Bunny) die mapverzoeken cachet. Als u de serverconfiguratie wijzigt en nog steeds een bestandslijst ziet, kan het CDN een gecachete versie serveren. Leeg de cache voor de getroffen paden en test opnieuw.
Veelgemaakte fout: wp-content/uploads beschermen met .htaccess
Een patroon dat opduikt in oudere gidsen is een aparte .htaccess direct in wp-content/uploads/ plaatsen met een lange lijst regels. De intentie is goed, maar de bijwerkingen zijn rommelig: afhankelijk van wat de regels bevatten, kunnen afbeeldingsuploads stoppen met laden, kan lazy loading breken, of kunnen PDF's onbereikbaar worden. Als u alleen listing wilt uitschakelen, is de enkele regel Options -Indexes in de hoofd-.htaccess voldoende. Het werkt recursief. Aparte bestanden per map zijn niet nodig, tenzij u daar een specifieke reden voor hebt.
Hoe zit het met bestanden ook verbergen voor zoekmachines?
Het uitschakelen van directory listing voorkomt dat de mapindex wordt geserveerd, maar het stopt een zoekmachine niet om individuele bestanden in de map te indexeren als ze ergens vanaf het openbare web worden gelinkt. Als u gevoelige bestanden in wp-content/uploads/ hebt die u niet in Google wilt zien verschijnen, is het verwijderen van het bestand het enige betrouwbare antwoord. noindex-metatags, X-Robots-Tag-koptekstregels en robots.txt-vermeldingen helpen bij ontdekking, maar alleen het verwijderen van bestanden garandeert dat de inhoud weg is.
De algemene regel die altijd geldt voor de uploadsmap: upload daar niets dat u niet comfortabel zou vinden om op de voorpagina van uw site te zien. De map is per ontwerp een openbare webmap.
Hoe u uw configuratie verifieert
- Open
https://uwdomein.nl/wp-content/uploads/in een privévenster. Verwacht resultaat: een403 Forbidden-pagina of een blanco pagina (afhankelijk van of er een legeindex.htmlaanwezig is). - Herhaal voor elke andere map die u eerder hebt gevonden (
/wp-content/plugins/, themamappen, aangepaste uploadmappen). - Als u een bestandslijst ziet, is de wijziging niet doorgevoerd. Controleer of u de juiste
.htaccesshebt bewerkt (de versie in de WordPress-root, niet die in de bovenliggende map van de WordPress-installatie) en leeg eventuele cachelagen. - Voer een nieuwe InspectWP-scan uit. De controle "directory listing ingeschakeld" in het beveiligingsgedeelte zou groen moeten zijn.
De hele wijziging is een enkele regel in .htaccess op Apache, of één configuratie-instelling op nginx. Vijf seconden werk, en een hele klasse van onbedoelde bestandsblootstelling verdwijnt. De moeite waard om op elke site te doen, ook als alles in uw uploadsmap momenteel in orde is. De bescherming is voor het volgende bestand dat iemand in haast uploadt, niet alleen voor de bestanden die er al staan.