Ik ben bezig met een stukje beveiliging op mijn site. Nu word er heel vaak gesproken over het feit dat je een user moet identificeren met zijn IP-adres. Maar stel nu dat je een gebruiker een half uur geen toegang geeft tot je site omdat hij bijv. 20 foutieve login pogingen heeft gedaan. Wat nu als deze gebruiker in een bedrijfs/school netwerk zit? Dan word het hele netwerk geblokkeerd.
Nu vroeg ik me af of het ook mogelijk is om een soort uniek nummer van een computer of browser op te vragen, een soort MAC adres idee. Of heeft iemand een andere manier om te voorkomen dat een volledig netwerk word geblokeerd.
De bedoeling is eigenlijk een bezoeker te koppelen aan een nummer, en dit nummer bij elk nieuwe bezoek weer te gebruiken. Zodat stel er komt een hacker op de site en die begint een poging de login te hacken. Na bijv. 25x word hij geblokkeerd omdat hij tevaak verkeerd wachtwoord heeft geprobeerd. Hij switcht van IP en hij denkt er weer op te kunnen (aangezien er 9 v/d 10x word gecheckt op IP) maar door het gebruik van een gekoppeld nummer aan een gebruiker kan hij er nog steeds niet op. Zijn IP is namelijk wel gewijzigd maar zijn computer (en daardoor het nummer) zijn nog steeds gelijk.
Zodat stel er komt een hacker op de site en die begint een poging de login te hacken. Na bijv. 25x word hij geblokkeerd omdat hij tevaak verkeerd wachtwoord heeft geprobeerd.
Daarvoor kun je ook (tijdelijk) één gebruikersaccount blokkeren.
Als beveiliging zo'n groot issue is zou ik het alsvolgt beveiligen:
- Zorg voor een login systeem (username, password)
- Houd bij hoevaak iemand met 1 ip adres probeerd in te loggen
- Bij 3 maal een verkeerde poging wordt het account voor 24 uur geblokkeerd
- Bij 3 maal een verkeerde poging wordt het IP voor 24 uur geblokkeerd
- Zorg er voor dat cross site forgery niet mogelijk is
- Zorg ervoor dat hack als mysql etc niet mogelijk/geminimaliseerd is
- Een eventueel extra optie is om naar username en password een bepaalde code of token mee te geven die naast het wachtwoord ingevuld moet worden als derde veld.
Een IP adres is naar mijn idee nog steeds het enige goede 'unieke computer nummer'. En ja in een bedrijf of school zitten er meerdere op 1 IP, maar dit voorkom je niet. Dynamische IP's blijven ook lastig.
Hoe je dit echt goed moet oplossen weet ik ook niet en vraag ik mij ook af.
Hoe ik het doe is het aantal login pogingen van een IP bijhouden en zet ik in de sleep() functie (eventueel delen door 10 of 5 of 2 o.i.d. om niet heel veel vertraging te krijgen) stel dat je dit deelt door 2 dan moet de hacker naar 10 inlogpogingen 5 seconden wachten voordat het script verder gaat. Hiermee voorkom je dat hij heel veel pogingen kan doen en een bruteforce aanval wordt hier ook mee vertraagd.
Voordeel is dat het IP of gebruikersnaam niet wordt geblokkeerd.
Als de gebruiker dan op zijn account wil inloggen in het zelfde netwerk heeft hij wel wat vertraging bij het inloggen, maar het kan wel. Inlogpogingen ouder dan een uur tellen niet meer mee in de vertraging.
@Ward:
En wat als de hacker dan ipv 1 gebruiker probeert 1 wachtwoord op alle gebruikers probeert?
@Bas:
En als er dan vanuit een school netwerk word ingelogd met 300 computers? Dan is 300 pogingen helemaal niet zo gek, terwijl dat vanuit een huisnetwerk met 3 computers heel gek is.
@Michael:
Dat is inderdaad wel een goed idee. Doe je dat dan gebaseerd op het aantal pogingen op 1 account of per IP?
Ik lees inderdaad overal dat dit eigenlijk niet mogelijk is. Dus ga dan maar voor de IP gebaseerde methode
@Ward:
En wat als de hacker dan ipv 1 gebruiker probeert 1 wachtwoord op alle gebruikers probeert?
Dat werkt dan alleen als de hacker alle gebruikersnamen weet. Dit kun je dus al voor een groot deel voorkomen door ook gebruikersnamen geheim te houden: de gebruikersnaam waarmee iemand inlogt, kun je beter niet gelijk maken aan de schermnaam/alias die voor iedereen zichtbaar is.