Malware verwijderen WordPress site zonder data te verliezen
Malware verwijderen WordPress site zonder data te verliezen: zo schoon je bestanden en database op zonder content kwijt te raken.
In dit artikel
Je ontdekt vreemde links onder je posts. Of een bezoeker meldt dat hij wordt doorgestuurd naar een gokpagina. Misschien zag je een mailtje van je hostingpartij over verdachte activiteit op je account. Voordat je in paniek bestanden gaat weggooien: stop even.
Een gehackte site is vervelend, geen ramp in hoofdletters. Malware verwijderen WordPress site is werk in een vaste volgorde. Hou je die volgorde aan, dan raak je geen content kwijt. Snel klikken is juist de manier om wel content kwijt te raken.
Dit artikel beschrijft hoe je malware verwijderen WordPress site aanpakt op een manier die je posts, media en klantdata intact laat. Zes blokken, gebaseerd op opschoningen die ik in mijn ervaring sinds 2012 heb gedaan. Werk je met Joomla of Drupal, dan zijn de principes vergelijkbaar; de bestandspaden en tools verschillen.

Eerst: stop met klikken in de admin
De grootste fout die ik tegenkom: mensen die direct in de WordPress-admin verdachte posts gaan verwijderen. Daarmee wis je bewijs en raak je de tijdlijn kwijt.
Wat je wel doet:
- Log uit op alle apparaten en wijzig je admin-wachtwoord vanaf een schoon apparaat
- Zet de site in onderhoudsmodus zodat bezoekers tijdelijk niets meer zien
- Maak een complete back-up van de huidige, gecompromitteerde staat
Die back-up klinkt tegenstrijdig. Toch is hij belangrijk. Pas als je weet welke bestanden malware bevatten, weet je of je het lek hebt dichtgezet. Een opschoning zonder forensisch beeld is gokken.
Bewaar de back-up buiten je werkomgeving. Een externe schijf is genoeg. Voor zware infecties bewaar ik twee kopieën, voor het geval er tijdens de opschoning iets schuift.
Forensische back-up en isolatie
De volgende stap is alles van de site halen, niet via een WordPress-plugin maar via FTP, SFTP of SSH. Een plug-in mist soms juist de bestanden die je wilt hebben.
Wat je nodig hebt:
- Een volledig bestandsarchief van de hele site, inclusief verborgen bestanden
- Een database-dump via phpMyAdmin of
mysqldumpop de command line - De PHP-versie, server-instellingen en serverlogs van de afgelopen weken
De database-dump is essentieel. Veel WordPress-malware nestelt zich in wp_options, in wp_users of in wp_posts als verborgen content. Een schone-bestanden-installatie zonder database-controle laat de infectie staan.
Vraag bij dezelfde stap meteen de access-logs op bij je hostingpartij. Die logs vertellen je welke verzoeken er rond het tijdstip van de infectie zijn gedaan. Vaak zie je een IP-adres dat tientallen POST-verzoeken naar wp-login.php of xmlrpc.php deed.

Bestanden opschonen zonder content kwijt te raken
Hier komt de kern. Het idee is: vervang alles wat je veilig kunt vervangen, en raak nooit aan wat unieke content bevat.
Veilig vervangen: de WordPress-core, alle plugins, alle thema’s. Download verse kopieën van wordpress.org en van de oorspronkelijke aanbieder van elke plugin. Overschrijf de bestaande bestanden. Third-party plugins en thema’s blijven juridisch de verantwoordelijkheid van de licentiehouder; ik werk nooit met gepirateerde versies, omdat die juist een veelvoorkomende bron van infecties zijn.
Met rust laten, maar wel scannen: wp-content/uploads/ (je media), wp-config.php (configuratie) en de database. Daar zit je werkelijke content in.
Voor de uploads gebruik je op de command line:
find wp-content/uploads -name "*.php"
find wp-content/uploads -name "*.html"
find wp-content/uploads -name "*.js" -newer wp-config.php
In wp-content/uploads/ horen alleen mediabestanden te staan. Elk gevonden PHP-bestand is verdacht. Open er een paar in een tekst-editor en kijk naar de eerste regels. Zie je eval(base64_decode(...)) of een lange string met willekeurige tekens? Dat is malware. Verwijderen.
Voor wp-config.php controleer je op vreemde include-regels boven of onder het standaardblok. Vergelijk met de standaard-template op wordpress.org als je twijfelt.
Database opschonen zonder posts te verliezen
De database is waar veel mensen vastlopen. Hieronder de stappen die ik aanhoud.
Maak een tweede dump. Voor je iets wijzigt, dump je de database nog een keer als werkkopie. Niet de forensische, een aparte. Daar werk je in.
Controleer wp_users. Open de tabel en zoek naar accounts die je niet kent. Hackers maken vaak een admin-account aan met een onschuldig klinkende naam. Verwijder de accounts die niet bij jouw team horen. Check daarna in wp_usermeta op verweesde rijen voor die gebruikers-ID’s.
Controleer wp_options. Zoek met SQL naar verdachte option_names:
SELECT * FROM wp_options WHERE option_value LIKE '%base64_decode%';
SELECT * FROM wp_options WHERE option_value LIKE '%eval(%';
SELECT * FROM wp_options WHERE option_name LIKE '%_transient_%' AND LENGTH(option_value) > 5000;
Lange, onleesbare base64-strings in option_value zijn vrijwel altijd malware. Documenteer wat je vindt, dan pas verwijderen.
Controleer wp_posts. Daar staat je content. Hackers voegen soms verborgen posts toe (status draft of private) met spam-links. Filter op posts die niet door jou zijn aangemaakt, of op posts met een vreemde post_author-ID. Spam-injecties zitten ook vaak in post_content van bestaande posts; zoek op script of op verdachte domeinen.
Een tip uit ervaring: wijzig nooit handmatig in de live-database. Maak een lokale kopie, schoon op, test, en upload de schone versie pas terug.

Het lek dichten
Opschonen zonder het lek te dichten geeft binnen dagen herinfectie. Dit blok overslaan is geen optie.
De meest voorkomende binnenkomstpunten in mijn ervaring:
- Een verouderde plugin met bekend lek, vaak een verlaten plugin die niemand meer update
- Zwakke admin-wachtwoorden gekraakt via brute-force
- Inloggegevens gestolen via een datalek elders (e-mail en wachtwoord-combinaties die overal werken)
- Een verouderde PHP-versie waar de hosting nog support voor geeft
- XML-RPC open laten staan terwijl je het niet gebruikt
Wat je nu doet:
- Wijzig alle wachtwoorden van WordPress, database, hosting, FTP en e-mail
- Regenereer de salt-keys in
wp-config.phpvia de WordPress secret-key generator - Zet twee-factor authenticatie aan voor alle admin-accounts
- Update PHP naar minimaal versie 8.1 of nieuwer in 2026
- Blokkeer XML-RPC of beperk de toegang via je
.htaccessof een security-plugin - Controleer in WPScan of een van je actieve plugins een bekend lek heeft in de versie die je had
Kun je niet achterhalen welke plugin het lek bevatte? Vervang dan alle plugins door alternatieven, of verwijder de plugins die je niet actief gebruikt. Een ongebruikte plugin met een bekend lek is een open deur die je niet eens zag staan.
Google opnieuw indexeren
Een schone site is mooi, maar Google weet dat nog niet. Een paar acties.
In Google Search Console kijk je onder “Beveiligingsproblemen”. Staan er issues, dan documenteer je wat er stond. Vraag daarna een review aan met een korte uitleg van wat je hebt opgeruimd. Google reageert meestal binnen drie tot zeven dagen op zulke verzoeken.
Daarnaast check je je domein op browser-blacklists via het Google Transparency Report. Bij vermoeden van een datalek met persoonsgegevens meld je dat binnen 72 uur bij de Autoriteit Persoonsgegevens.
Een korte mededeling op je site of in je nieuwsbrief over het incident herstelt vertrouwen sneller dan stilte. Geen technische details, wel duidelijkheid over of klantgegevens zijn geraakt.
Wanneer je het beter laat opschonen
Niet elke opschoning is doe-het-zelf-werk. Een paar signalen waarbij externe hulp goedkoper uitvalt:
- De infectie komt terug ondanks opschoning
- Je hebt een webshop met klantdata en de impact van fouten is groot
- De codebase bevat custom werk waarvan je de werking niet helemaal kent
- Je weet na een uur zoeken niet zeker waar het lek zit
- Tijd is een probleem (campagne, seizoen, deadline)
Voorbeeldscenario: een lokale dienstverlener belde nadat hij zelf drie verdachte bestanden had weggegooid. Twee dagen later: site weer geïnfecteerd via een backdoor in een ongebruikte plugin die hij gemist had. Eerste opschoning incompleet betekent in vrijwel alle gevallen herinfectie.
Reguliere malware-opschoning reken ik tegen €70 per uur. Heb je hulp nodig in de avond, het weekend of in de nacht, dan geldt het spoedtarief van €105 per uur. Ik heb geen 24/7-support; werken in de nacht doe ik alleen bij afgesproken spoed. Je hebt bij mij direct contact met degene die het werk uitvoert, geen tussenlaag.
Stuur me je URL en wat je ziet, dan kijk ik ernaar. Voor doorlopende beveiliging vind je meer info op de pagina diensten en in de categorie website beveiliging.
Veelgestelde vragen bij malware-opschoning
Raak ik posts of media kwijt tijdens de opschoning?
Als je de volgorde uit dit artikel volgt: nee. Je media in wp-content/uploads/ en je posts in de database blijven staan. Wat je vervangt zijn core-, plugin- en thema-bestanden. Die staan los van je content. Voor de zekerheid maak je voor elke stap een aparte back-up, zodat je terug kunt als er iets schuift.
Hoe lang ben ik offline?
Een tot drie uur in het standaardgeval. De site staat in onderhoudsmodus terwijl ik opschoon. Bij complexe infecties of als er geen schone back-up beschikbaar is, kan het oplopen tot een werkdag. Plan zo'n traject niet vlak voor een drukke campagne of een verkoopweekend.
Kan ik volstaan met alleen een Wordfence-scan?
Een scanner als Wordfence of MalCare laat zien welke bestanden afwijken van de schone versie. Dat is een goede start, niet het hele werk. Database-injecties, verborgen admin-accounts en lekkende plugins ziet zo'n scan niet altijd. Een scan zonder controle op wp_options, wp_users en wp_posts mist meestal iets.
Wat als ik geen schone back-up heb?
Veel hostings bewaren zelf back-ups van zeven tot dertig dagen, ook als je dat zelf niet hebt ingesteld. Vraag je hostingpartij om een snapshot van voor de infectie. Is die er niet, dan bouw je op de gecompromitteerde versie verder en schoon je handmatig op. Duurt langer, werkt vrijwel altijd. Daarna zet ik direct een back-up-routine op.
Wat kost een professionele opschoning?
Voor reguliere malware-opschoning reken ik op vier tot acht uur, tegen het standaardtarief van €70 per uur. Bij complexe codebase of een webshop met klantdata loopt het op tot tien tot vijftien uur. Spoedwerk in de avond of het weekend gaat tegen €105 per uur. Een maandelijks onderhoudsabonnement vanaf €58 voorkomt in vrijwel alle gevallen een tweede infectie.