Endnu et emne om Brugersystem

Tags:    databaser

Hej med jer! :D

Jeg har fulgt guiden http://udvikleren.dk/Article.aspx?tech=6&id=80 for at lave et brugersystem til en webside, jeg er igang med at lave.
Det hele virker uden problemer men jeg kan se at der er nogle små-problemer med sikkerheden osv.

Jeg har kun arbejdet med PHP i 3-4 måneder og SQL i 1 måned og har derfor ikke det helt vilde kundskab endnu men jeg vil virkelig gerne lære det.

Er der nogle af jer der kan hjælpe mig med følgende:

1. At kryptere passwords

2. At gøre så man ikke kan logge ind med en anden brugers password

3. Evt. andre sikkerhedsfejl.

Jeg vil virkelig sætte pris på, hvis i vil tage jer tid til at hjælpe mig :)



3 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
1. som kristian skriver så er det meget normalt ikke at kryptere kodeord, men derimod at hashe dem. hashing betyder meget simpelt at man smider dem igennem en kværn og de drysser ud med præcis det samme mønster hvergang man gør dette :)

så f.eks. smider man 123 igennem kværnen bliver det hver gang til f.eks. 321 (dette er et meget basalt eksempelt og er her for at hjælpe med forståelsen, en normal hashing er langt mere kompliceret og som kristian næsten umulig at knække) (se note 1)

Det du gør er at når du indsætter data'en ind i databasen så smider du denne igennem en hashing funktion. Der findes flere forskellige i PHP men brug md5() funktionen til at starte med :)

2.

Når du skal kontrollere om der findes en bruger ved dette navn i databasen laver du en
Fold kodeboks ind/udKode 


lav så en mysql_num_rows (er ikke sikker på navnet men slå den op i manualen hvis du er i tvivl) på $result og hvis den returnere præcis 1 bruger så ved du at bruger eksistere og at passwordet er indtastet korrekt.


3.
Det bedste sikkerhedråd man kan få er stol aldrig på data en bruger indtaster! :)
Det næste er lav aldrig en blacklist, men altid en whitelist. altså lav aldrig en liste over forbudte ting men lav derimod en liste over ting der er tilladte. Du ved aldrig om du har taget højde for alle ting og det er derfor nemmest at lave en whiteliste ;)


note 1. Der findes idag noget man kalder rainbow tabeller som tillader at man kan lave et opslag der gør at man kan se hvilken værdi der hasher til den given hashværdi, man kan derfor ikke længere føle sig 100% sikker på md5() hashing, dette samme er gældende for SHA1 og nogle andre alternativer.



Du kunne også gøre sådan her:
Fold kodeboks ind/udKode 




Jeg tror, at det er vigtigt, at man er god til scripting, inden man begynder at bekymre sig om sikkerhed. Men det er kun en forestilling.

En god måde at lære på er at se, hvordan andre gør. Men netop med sikkerhed er det et problem, for mange vil ikke publicere deres arbejde, fordi det netop udgør huller i sikkerheden.

1. At kryptere passwords


Krypter dem ikke - hash dem i stedet for. En kryptering kan regnes tilbage, det kan en hash ikke, og derfor kan man ikke få en adgangskode ud af en hash. Læs evt. om hash/checksum på Wikipedia.

2. At gøre så man ikke kan logge ind med en anden brugers password


Man skal bare sikre sig, at brugernavn og adgangskode hører sammen. Det kan man bl.a. gøre ved at sikre sig, at de kommer fra samme række i databasen.

3. Evt. andre sikkerhedsfejl.


Læs guiden eller artikler på http://phpsec.org/



t