Hvordan laver man et godt (Og sikkert) loginsystem?

Tags:    php

Hej!

Jeg har nu længe villet lave en hjemmeside, med brugerfunktion, afstemninger osv.
Og jeg har jo mht. afstemninger, charts og hvad nettet nu ellers må byde på, fundet gode artikler om det her på Udvikleren.dk! :D

Men da jeg havde lavet mit brugersystem, læste jeg i de nederste kommentarer, at det ikke var helt sikkert!
Så nu vil jeg høre hvordan man laver følgende:

Et sikkert brugersystem, gerne med profil/admin sider.
En sikker gæstebog.
Bruger tilladelser, sådan at det fx. kun er registrede brugere der kan skrive kommentarer, downloade fra siden.

Hvis i også kan skrive noget af koden ville det være rart, da jeg ikke fatter særligt meget af PHP/MySQL (Kun en lille smule)

Ellers, kan i vel også bare give nogle links ;)


Håber ikke det er for meget at be om. Men jeg håber at der er en flink dansk sjæl derude der gider at forklare det, på en forståelig måde :P



Der på en måde tre svage led i sikkerhedskæden:
1) Sessionen
2) Password overførelse fra klient til server (el. lig.)
3) Data håndtering på server

pkt. 1 og 2 udspringer egentlig af samme brist: alt hvad der køre over HTTP-protekollen er i ren klar tekst, dette gælde både de session-cookies som sendes fra server til klient og de passwords som sendes fra klient til server - løsningen hedder sikker forbindelse, dvs. HTTPS. Jeg kan bare ikke hjælpe dig på det punkt, for det kan jeg heller ikke selv finde ud af. Du kan evt. overveje om dine data er så kritiske at de behøver denne beskyttelse.

Password på serveren er til gengæld nemmere: du tager bare et hash af dem inden du lægger dem ned i databasen, eks. i PHP:
$hash = md5($password);

Du skal bare være opmærksom på at du hasher password'et inden du lægger det ind i din SQL-sætning, på den måde undgår du SQL-indsættelsesangreb - som også skal har et ord med på vejen:
SQL-indsættelsesangreb er, når en hacker bruger eks. en hjemmesides html-form til at skrive kommandoer til en database.
Betrakt:
$result = mysql_query("SELECT * FROM users WHERE name=$name;");
Men hva nu hvis:
$name="''; DROP TABLE users"

så ville querien slette tabellen 'users' i stedet for at slå en bruger op!
Det er derfor meget vigtigt at du har fuldstændig kontrol over hvad du beder databasen om. Et ordsprog kunne være:
Never trust an input.
Hvis du koder efter dette, vil du nå langt med din sikkerhed og undgår mange dumme fejl.

Mht. til passwords kan du også bruge PHP's CrackLib functioner til at sikre dig at dine brugere vælger nogle stærke passwords.
link til reference: http://dk.php.net/manual/en/ref.crack.php

Det var vist alt.. Held og lykke med dine anstrengelser
- karmazilla -



Du kan lære at lave et ret så sikkert begyndersystem i Jesper Mikkelsens gode artikel om sessions:
http://www.udvikleren.dk/article.php?aid=87

Sessions er små filer du gemmer data i, og som du enten unsætter eller sletter når man logger ud. Sessions har også den smarte feature at ikke 2 sessions er ens og kan derfor heller ikke åbnes af to browsere. Dvs. at hvis du glemmer at unsætte din session så er man logget ud alligevel så snart man lukker browservinduet.

tada...



Jeg synes nu også at php_auth_user er rigtigt godt at lave brugersystem med, det er mere sikkert end sessions, dog er htaccess endnu mere sikkert.

Disse funktioner virker dog kun på en apache webserver.

Du kan tage et kig i php-manualen omkring disse funktioner:

php_auth_user
php_auth_pw



t