Avatar billede Mik2000 Professor
29. december 2010 - 03:07 Der er 11 kommentarer og
4 løsninger

Sikkert login

Hej

Vil høre om hvormeget der skal til at lave et sikkert login. Er dette f.eks. sikkert:

1: Brugernavn og password udfyldes (password ligger md5 krypoteret i database)
2: Der tjekkes først på om begge felter er udfyldt og ellers sendes man væk
3: Der tjekkes så på om der kun hentes én der matcher fra databasen
4: Hvis der kun hentes en fra databasen, så gemmes der en session med username, og hvis denne findes er man logget ind

Er det nok til at gøre det helt sikkert?

Eller skal man gemme username og password i session variabler og så på hver side tjekke i databasen om de stadig matcher?

Eller skal man gemme en sessionstring i en tabel, og en session med samme værdi og så tjekke de matcher

Eller hvad skal man gøre for at sikre man får et helt sikkert login
Avatar billede moddi100 Seniormester
29. december 2010 - 05:46 #1
1) Jeg vil ikke mene at det er nogen god ide at gemme en bruges password i en session. Gem i stedet et nyt session_id for hvert login og brugernavn i en session. Tjek så på hver side om de 2 eksistere i en database. Tjek også om ip'en er den samme. Sæt eventuelt en tidsgrænse.

2) Har du styr på SQL-injektioner (http://dk.php.net/mysql_real_escape_string)?
Avatar billede jakobdo Ekspert
29. december 2010 - 09:02 #2
Brug også gerne lidt salt til din md5 hash.

Så du ikke blot laver:

$hash = md5($password);
men i stedet bruger:

$salt = 'eksperten.dk';
$hash = md5($salt . $password);
eller lign.

Der findes store md5 tabeller, hvor man kan slå md5 hash op.
Avatar billede repox Seniormester
29. december 2010 - 09:05 #3
Dit spørgsmål er noget diffust og kræver et bredt svar.

MD5 anses ikke længere som værende en tilstrækkelig hashing for at gemme kodeord; rainbow tables har gjort at MD5 (alene) ikke er svært at 'dekryptere'. Som minimum anses det også for at være god/sikker praksis at salte sine kodeord. En anden hashing (såsom SHA1/SHA256/SHA512) er også bedre at anvende som hash til saltede kodeord.

Med hensyn dine punkter fra 2 til 4, så kan jeg ikke se hvad det har med spørgsmålet om sikkerhed at gøre - du beskriver egentlig bare en fremgangsmåde du ønsker at anvende. Om du vil 'sende folk væk' fordi begge felter ikke er udfyldt eller om du vil vise en fejlbesked højner ikke dit sikkerhedsniveau - det er udelukkende et spørgsmål om brugervenlighed. Og det undrer mig du rent faktisk bliver nød til at tage højde for, i login processen, om der hentes et eller flere match i databasen på det forespurgte brugernavn og kodeord; du lægger her op til at man godt kan oprette to (eller flere) identiske brugere, men du kan kun logge ind, hvis der kun findes en?

Personligt ser jeg ikke nogen grund til at gemme andet end brugerens ID i en session. Jo flere oplysninger du gemmer i din session, jo mere sårbar er dine data ved session hijacking (som i praksis er sværere at udføre end diverse guides og tutorials på nettet fremstiller det som).

Og som #1 er inde på er dit login ikke stærkere end det du bygger udenom det - du skal vide hvordan du beskytter dig mod SQL injections, da det er et ret hyppigt og endda nemt udførligt angreb.

Jeg har udviklet et simpelt brugersystem som egentlig er til brug for simpel implementering.

Beskrivelse af projektet kan ses her:
http://cc.err0r.dk/ss/
Dokumentation for objektets metoder og medlemmer kan ses her:
http://cc.err0r.dk/ss/reference.html

Hvis projektet har interesse kan det downloades her:
http://cc.err0r.dk/ss/simpleusers.zip

Det kan eventuelt lede dig i en retning som du kan udvikle efter.
Avatar billede intenz Novice
29. december 2010 - 10:44 #4
Hvis du opretter sessionen inden de logger ind, og så bare gemmer 'logget in' oplysningerne i samme session, er det også en god ide at regenerere session_id når brugeren logger på.
http://php.net/manual/en/function.session-regenerate-id.php
Avatar billede Mik2000 Professor
29. december 2010 - 11:39 #5
Mange tak for alle jeres står

Jeg gør sådan med variabler inden de benyttes
$var = mysql_real_escape_string($_POST["navn"])
Er det nok mod injections?

Tjek på antal er ikke fordi man skal kunne have flere med samme brugernavn. Det er blot til hvis der er sket en fejl feks fordi man har glemt at slette noget testeata eller lign

Dvs for at gøre det helt sikkert skal man:
- tilsætte noget salt til hash og evt benytte andet end md5
- lave en session tabel og gemme session id og ip og på hver side kontrollere dem
- sikre session slettes ved log ud

1: er det hvad der skal til eller er der mere?
2: er den måde jeg beskytter mod sql injections nok?
3: bliver det ikke tungt hvis den skal tjekke i database hver gang en side loades? ... hvilken metode er mindst ressource krævende?
Avatar billede intenz Novice
29. december 2010 - 11:56 #6
Nr. 1
Det er nok. Næste skridt er at bruge SSL for at kryptere forbindelsen.

Nr. 2
Hvis du husker at gøre det hver gang, vil det være nok. Den mere nutidige metode er, at bruge prepared statements.
Google: "php mysql prepared statement"

Nr. 3
Der er ingen grund til at tjekke det hver gang. Det er rigeligt at gemme det i en session. Du skal så beskytte den mod session hijacking, hvor det typisk er nok at gøre som jeg skrev i #4.
Avatar billede Mik2000 Professor
29. december 2010 - 20:21 #7
Takker for hjælpen

Der er jo flere der har svaret, så skriv blot et svar og så giver jeg point ud :)

Er der flere kommentarer til det med sikkerhed så kom endelig også med dem :)
Avatar billede jakobdo Ekspert
29. december 2010 - 20:32 #8
Svar!
Avatar billede repox Seniormester
29. december 2010 - 21:45 #9
Svar fra mig
Avatar billede moddi100 Seniormester
30. december 2010 - 12:47 #10
Og et svar fra mig
Avatar billede intenz Novice
30. december 2010 - 13:05 #11
svar
Avatar billede Mik2000 Professor
31. december 2010 - 02:47 #12
Tak for svarene :)
Godt nytår
Avatar billede Mik2000 Professor
31. december 2010 - 09:10 #13
Hej

Jeg har nu:
- Tilføjet salt og benyttet md5 på det til password
- Lavet en session med brugerens ip ($_SERVER['REMOTE_ADDR'])
- Lavet et tjek på hver side der:
  - Tjekker om IP matcher Session
  - Kører session_regenerate_id(); som så vidt jeg forstår ændre alle ens sessions id'er

1: Lyder det fornuftigt, og som I skrev?

Der er lige dukket to små ekstra spørgsmål op:
2: Kan man blot gemme id på brugeren i en session også, så jeg ved hvem der er logget ind, eller og hvordan sikrer jeg dette, så jeg stadig kan få fat i det (kan jo ikke bruge md5 eller lign. da jeg skal kende id)?

3: Kan man gemme andre oplysninger også som navn mv. så man ikke skal hente fra database hver gang?
Avatar billede intenz Novice
01. januar 2011 - 16:42 #14
1. Jeg ville droppe IP adressen fra din session. Den giver kun marginalt mere sikkerhed (det er i forvejen svært at 'hijacke' en session). Samtidigt kan en besøgendes IP adresse ændre sig løbende, så du risikerer at smide folk af som egentlig er den samme bruger, hvilket kan forringe brugervenligheden.

2. Du kan gemme hvad du vil i session, brugeren har ikke adgang til den, da den ligger på serveren. Det eneste brugeren har er session id'et. Det er ingen problemer i at gemme brugerens ID i session.

3. Samme svar som nr. 2.
Avatar billede Mik2000 Professor
03. januar 2011 - 00:15 #15
Mange tak for svaret :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester