Een poosje geleden schreef ik een bericht over websites die aangeven of een account wel of niet bestaat na het klikken op de “wachtwoord vergeten” link. Ik ben van mening dat een website nooit moet melden of het opgegeven e-mailadres wel of niet bestaat maar gewoon moet melden dat er een mail is verzonden naar het opgegeven e-mailadres. Onafhankelijk of dit e-mailadres bij hun geregistreerd is. Ik kreeg daar best wat vragen en reacties over (via reacties onder het bericht maar ook via e-mail en LinkedIn InMail). Wat is precies enumeratie van gebruikersnamen?
In dit artikel wil ik in een aantal punten opsommen wat het mogelijke gevaar is van het tonen van dit soort berichten en waarom je dit als developer/webbouwer/website/platform/content manager/etc/ niet zou moeten tonen.
1. De casus: je bent je wachtwoord vergeten. Je wilt je account resetten.
Probleem: Je wilt inloggen op een website maar je bent je wachtwoord vergeten dus klik je op de link “Wachtwoord vergeten?” (Afbeelding 1).
Afbeelding 1 – Wachtwoord vergeten?
Je vult het e-mailadres in het daarvoor bestemde veld (Afbeelding 2) en gaat voor de knop “Nieuw wachtwoord aanmaken”.
Afbeelding 2 – Vul een geldig e-mailadres in.
Als alles goed is gegaan (en je hebt een geldig e-mailadres ingevuld en deze staat in de database van de website) wordt de volgende melding gegeven (Afbeelding 3):
Afbeelding 3 – Er is een e-mail verstuurd naar het adres dat bekend is bij de website.
Je krijgt nu een e-mail waarmee het wachtwoord gereset kan worden. Wanneer je dit doet kun je dus weer zonder problemen inloggen met het nieuwe wachtwoord. Klaar. Geen problemen toch?
2. Het voordeel
Geen wachtende klanten. Je klant ziet direct, na het invoeren van een juist mailadres, resultaat. De klant krijgt een e-mailt met daarin een link om het wachtwoord te resetten. De klant kan deze vervolgens gebruiken om een nieuw wachtwoord aan te maken.
Laten we ook eens kijken wat er zou zijn gebeurd als de klant een onbekend e-mailadres zou hebben ingevoerd in het “Wachtwoord vergeten?” veld. Dan ziet de klant het de volgende meldingen op zijn scherm (Afbeeldingen 4 en 5):
Afbeelding 4 – Een onbekend e-mailadres wordt ingevuld.
Afbeelding 5 – Er wordt melding gemaakt dat het e-mailadres niet voorkomt in de database van de website.
Ja, dat is heel vriendelijk van de website. De klant weet direct dat het ingevoerde e-mailadres niet bekend is en kan een ander adres proberen. Best netjes maar niet veilig.
3. Het grote nadeel
Het is mogelijk enumeratie op de website uit te voeren. In het kort: een hacker (of wie dan ook) kan door het invoeren van verschillende e-mailadressen een lijst samenstellen van adressen die bekend zijn op de website.
Stel je voor: er is een lijst met e-mailadressen met wachtwoorden gelekt van bijvoorbeeld LinkedIn. Deze lijst kan een hacker als basis laten dienen om te zien of op een andere website deze e-mailadressen ook voorkomen. Wanneer de site een duidelijk antwoord laat zien zoals in de bovengenoemde voorbeelden weet de hacker dus dat het e-mailadres (en dus het account) geldig is.
Natuurlijk gaat een hacker dit niet handmatig doen. Dit kan de hacker geheel geautomatiseerd doen. Je voert de lijst in een programma in en deze doet het werk voor je en test dus of het adres bestaat. Krijgt het programma een e-mail terug? Dan bestaat het adres. Zo niet, dan kan het onbekende e-mailadres verwijderd worden en doorgegaan worden met de volgende.
4. Een ander groot nadeel
Privacy. Waarom privacy? Je weet dus dat een iemand een account heeft op een bepaalde site. De website geeft immers aan of het e-mailadres wel of niet gevonden is. Wellicht maakt dit je niets uit. Immers, wat maakt het je uit dat iemand weet dat je een account hebt bij supermarktketen of een kledingzaak?
Maar je kunt je vast voorstellen dat dit voor bepaalde sites interessant kan zijn. Een website voor vacatures? Even een e-mailadres gebruiken om te controleren of een werknemer aan het solliciteren is. Want: een account betekent misschien wel dat hij zoekende is naar een nieuwe baan. Een forum waar bepaalde politieke standpunten worden genoemd waar niet iedereen het mee eens is? E-mailadres invoeren en je weet of iemand zich op het forum wel of niet heeft geregistreerd.
En wat dacht je van datingsites (of de zogenaamde “adult” sites)? Het is vrij eenvoudig te achterhalen of iemand zich er op een dergelijke site heeft geregistreerd waar er met verschillende meldingen wordt gewerkt. Interessant om te zien of je buurman wellicht vreemdgaat…
Veel van deze sites doen het overigens prima qua meldingen. Ze geven niet aan of het e-mailadres wel of niet gevonden is. Ze geven enkel aan dat er e-mail verzonden is naar het opgegeven adres. Of die nu wel of niet bekend is op de website (Afbeeldingen 6 en 7). Zoals het hoort zou ik zeggen.
Afbeelding 6 – een e-mailadres wordt ingevoerd op de datingsite.
Afbeelding 7 – Een melding zonder aan te geven of het e-mailadres gevonden is of niet.
5. Waarmee rekening houden (klant/bezoeker)
Als klant/bezoeker moet je je bezig houden met het feit dat je gegevens op deze manier op te vragen zijn. Heb je hier geen problemen mee dan kun je er voor kiezen om, wat zo veel mensen doen, een enkel e-mailadres te gebruiken voor registratie. Wil je je privacy (en je account) toch meer beschermen? Maak dan voor sites waar je liever niet direct mee in relatie gebracht wilt worden een nieuw e-mailadres aan. Lekt de website je gegevens toch, dan is is het lastiger je gegevens in relatie te brengen met je. Bedenk ook welke informatie je wel en niet prijsgeeft.
6. Waarmee rekening houden (developer)
Jij bent in control. Je site “vriendelijk” maken door te tonen of een e-mailadres wel of niet bestaat resulteert uiteindelijk in een kwetsbare site die daarnaast ook de privacy van je klant in gevaar brengt. Natuurlijk wil je de klant tegemoet komen. En misschien moet het wel van een manager onder de noemer “gebruiksvriendelijkheid” of “beter user experience”. Maar wil je echt dit soort kwetsbaarheden tonen?
Daarnaast wil je ook geen berg e-mail versturen aan niet bestaande e-mailadressen. Ga blacklisten: is er meer dan drie keer vanaf een bepaald IP-adres een fake mail adres ingevuld? Blacklisten. Time-outs instellen kan natuurlijk ook. Drie keer een niet voorkomend adres? Dan is het tien minuten onmogelijk om in te loggen. En dat verlengen met xx-aantal minuten en uiteindelijk bannen. Testen op geautomatiseerd hacks? Zet de “Ik ben geen robot” check aan (Afbeelding 8). Daarnaast bestaan er voor de grotere CMS’en zoals WordPress verschillende plugins om enumeratie tegen te gaan of het aanpassen van .htaccess file.
Afbeelding 8 – I’m not a robot Captcha.
Conclusie – Enumeratie van gebruikersnamen
Als developer zit je in constante spagaat tussen wat je klant (of manager) wil, de gebruiksvriendelijkheid/usability/user experience en de veiligheid van je product. Je zult, in overleg, naar een guldenmiddenweg moeten gaan. Wat verwacht je klant? Informeer hem over mogelijke gevaren. Bespreek dit altijd. Dat de klant koning is, is prima maar bedenk je wel dat als het mis is gegaan (en er dus een datalek is) de developer verantwoordelijk wordt gehouden. De klant komt altijd weer terug bij jou. Jij hebt product immers gebouwd.
En er zijn veel meer manieren mogelijk dan hierboven beschreven om je site beter te maken. Naast het bouwen van nieuwe producten is het verbeteren van bestaande producten nog altijd een issue. Nieuwe features bouwen is wordt nog altijd vóór het verbeteren van huidige functionaliteit geplaatst wat vaak niet de veiligheid van een product ten goede komt. Luister naar de klant, weeg af en verbeter. Wil je weten hoe je enumeratie van gebruikersnamen kunt voorkomen? Wij helpen je graag, neem hiervoor contact met ons op.