Inlogsysteem met unieke logins door pietje puk
Dit artikel is erg verouderd en bevat misschien onjuiste informatie.
Kijk op de wiki voor nieuwere artikelen.
Een van de eerste op te lossen problemen bij het schrijven van een webapplicatie is het maken van een authenticatiesysteem: Hoe zorg je ervoor dat je gebruikers veilig kunnen inloggen? Dat hangt natuurlijk af van de gevoeligheid van de gegevens waarmee je werkt. Bouw je een applicatie waarbij creditcard of andere gevoelige gegevens gebruikt worden, dan gebruik je SSL(secure sockets layer) met eventueel certificaten om er zeker van te zijn met wie je zaken doet. Als je dat allemaal niet nodig hebt en van plan bent om een webapplicatie te bouwen met een simpel inlogsysteem dat iets veiliger is als gemiddeld, lees dan verder.
2. Opzet
Er staan hier op PHPFreakz al meerdere inlogscripts. Wat is er nou zo speciaal aan dit systeem? Het speciale is dat bij het inloggen het wachtwoord niet 'clear text' over het internet gaat en dat elke login er anders uitziet zodat het sniffen naar wachtwoorden zinloos is. Om te beginnen hebben we een versleutelingsmethode op de client nodig. Ik heb gekozen voor een in javascript uitgevoerd MD5 hashing algoritme. Een link naar de code staat in het hoofdstuk “Voorbeeldcode”. Het versleutelen van het wachtwoord is echter niet genoeg. Immers, als de server telkens dezelfde hash verwacht dan is dat niet veel veiliger dan het wachtwoord clear text te verzenden. Om dit op te lossen stuurt de server met het inlogformulier een unieke sleutel mee. Deze is elke loginsessie anders. De client stuurt niet de hash van het wachtwoord naar de server maar de hash van de hash van het wachtwoord met de unieke sleutel. Dus: hash(hash(wachtwoord)+sleutel). Hoe dit globaal werkt staat in het volgende hoofdstuk beschreven. Het is simpeler om ( hash(wachtwoord+sleutel) ) te verzenden, maar dan zou het wachtwoord clear text in de database moeten worden opgeslagen. De zogenaamde unieke sleutel is in dit systeem geen gegenereerde willekeurige waarde, maar de timestamp waarop het inlogformulier wordt gegenereerd. Bij het inloggen wordt door de server gecontroleerd of de meegezonden timestamp nieuwer is dan de timestamp waarmee de vorige keer is ingelogd. Bijkomend voordeel is dat je altjid kunt zien wanneer een gebruiker voor het laatst heeft ingelogd.
Een tekortkoming in het systeem is nog het aamaken van een account. Daarbij kan de MD5 hash van het wachtwoord worden afgeluisterd(ge-snift) en met die hash kun je weer een 'geldige' inlogsessie uitvoeren. De beste manier om dit op te lossen is door gebruik te maken van een 'public key' algoritme, zoals het RSA public key algoritme. Onderaan dit artikel staan een aantal links met de code voor dit algoritme voor zowel javascript als PHP script. Ik heb de twee echter nog niet met elkaar samen kunnen laten werken. Ik nodig iedereen uit dit voor elkaar te krijgen en, als het lukt, er een artikel van te schrijven.
Verder wordt in het systeem constant het IP adres in de sessievariabelen vergeleken met het IP adres dat zich met de sessiesleutel meldt om sessie-kapen te voorkomen en wordt de door de gebruiker ingevoerde data ge-escaped voordat het in een sql sessie naar de database gaat.
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Volgende »
|