Vurdering af login script.

Tags:    php

<< < 12 > >>
Hej.

Jeg er forholdsvis ny inden for emnet, så derfor beder jeg jer vurdere mit lille login system jeg har lavet til en personlig side.

Jeg har først og fremmest en form, som beder om brugernavn og adgangskode:

login.php:
Fold kodeboks ind/udKode 


Som I kan se sender den brugeren videre til scr_login.php som indeholder selve koden bag formularen.
scr_login.php forbinder sig til en mysql database og sammenligner det indtastede brugernavn og pass med dem som er i mysql tabellen.
Viser det sig at de indtastede informationer stemmer med en af dem i tabellen, sender den brugeren videre til siden auth. Passer de ikke, sender den brugeren videre til login_fejl siden som indeholder en fejl meddelelse samt en ny formular.

scr_login.php:
Fold kodeboks ind/udKode 


auth:
Fold kodeboks ind/udKode 

Note: sessionen starter [session_start();] på en anden side hvor auth er inkluderet.

login_fejl:
Fold kodeboks ind/udKode 

Ikke så relavant for systemet, men nu har i den :)


Jeg håber jeg har givet nok information til i kan vurdere det. Måske der er noget som kan gøres smartere eller mere sikkert?
Hele systemet virker som det skal.

[Redigeret d. 17/09-05 00:33:10 af Tommy Jakobsen]

[Redigeret d. 17/09-05 00:34:42 af Tommy Jakobsen]



12 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Hej.

Jeg er forholdsvis ny inden for emnet, så derfor beder jeg jer vurdere mit lille login system jeg har lavet til en personlig side.

Jeg har først og fremmest en form, som beder om brugernavn og adgangskode:

login.php:
Fold kodeboks ind/udKode 


Som I kan se sender den brugeren videre til scr_login.php som indeholder selve koden bag formularen.
scr_login.php forbinder sig til en mysql database og sammenligner det indtastede brugernavn og pass med dem som er i mysql tabellen.
Viser det sig at de indtastede informationer stemmer med en af dem i tabellen, sender den brugeren videre til siden auth. Passer de ikke, sender den brugeren videre til login_fejl siden som indeholder en fejl meddelelse samt en ny formular.

scr_login.php:
Fold kodeboks ind/udKode 


auth:
Fold kodeboks ind/udKode 

Note: sessionen starter [session_start();] på en anden side hvor auth er inkluderet.

login_fejl:
Fold kodeboks ind/udKode 

Ikke så relavant for systemet, men nu har i den :)


Jeg håber jeg har givet nok information til i kan vurdere det. Måske der er noget som kan gøres smartere eller mere sikkert?
Hele systemet virker som det skal.

[Redigeret d. 17/09-05 00:33:10 af Tommy Jakobsen]

[Redigeret d. 17/09-05 00:34:42 af Tommy Jakobsen]

Der er en meget stor fejl i dit loginsystem.
Den ligger her:
"SELECT fullN FROM users WHERE userN = '$_POST[username]' AND userP = password('$_POST[password]')"

Hvis han nu indtaster i user: Bruger
Og i Password: ') or password('') = password('
Nu ved jeg ikke om password er en funktion du har lavet eller om det er en indbygget funktioni MySQL, men hvis det er sidstnævnte vil din forespørgsel:

SELECT fullN FROM users WHERE userN = 'Bruger' AND userP = password('') or password('') = password('')

På den måde vil han kunne logge ind som en hvilken som helst bruger han kender navnet på

Hilsen Mathias



Som The-Freak nævner, må du escape brugernavn og password.
Se evt. http://dk2.php.net/mysql_real_escape_string

[Redigeret d. 17/09-05 18:28:19 af Simon Jensen]



desuden bør du altid bruge addslashes() når du smider brugerinput ind i en databaseforespørgsel :)


Nej, addslashes() er den forkerte funktion at bruge. Det er mysql_escape_string() der skal bruges i denne sammenhæng. Den er nemlig beregnet til det.

Man kan også bruge prepared statements, så slipper man helt for at skulle indsætte variabler i sql-koden, og man undgår derved faren. Men det er en helt anden sag.

Nå, men sagen er den at du bør slå magic_quotes fra og proppe mysql_escape_string rundt om brugernavnet og adgangskoden i din query.



du skulle måske også overveje at kryptere dine input fra klienten. f.eks med algoritmen md5
--------------------------------------------------
[THIS IS A SIGNATURE VIRUS! PLEASE COPY IT INTO YOUR OWN SIGNATURE(S)]
--------------------------------------------------
tjeck lige http://www.udvikleren.dk/groups/?gid=18 hvis du vil hjælpe med at lave et godt spil!



Hej Mathias.

Jeg er ikke helt sikker på jeg forstår hvad det er du mener og kan ikke rigtig se logikken i det.
Men hvordan ville du så have lavet systemet, så det er mere sikkert?

Funktionen password('') er indbygget i mysql.

Mvh. Tommy

[Redigeret d. 17/09-05 13:29:21 af Tommy Jakobsen]



Jeg er ikke helt sikker på jeg forstår hvad det er du mener og kan ikke rigtig se logikken i det.


Det Mathias snakker om er et såkaldt "SQL Injection" angreb. Det betyder at en angriber ved at indtaste specielle informationer i dine formularer kan få adgang.

Fold kodeboks ind/udKode 


Mathias eksempel her er korrekt. Hvis du kigger efter står der at userN skal være 'Bruger' OG UserP skal være password('') ELLER password('') = password(''). Den sidstnævnte ting er den vigtigste, da password('') altid er det samme som password(''). Da dette står efter en OR kommando vil dette statement altid returnere sandt. Derfor skal du escape brugernavnet og passwordet!

MH.

The-Freak

Livet er for kort til at kede sig.
blog: http://laslego.frac.dk



Jeg syntes stadig ikke det giver mening.

Det i siger er, at hvis man indtaster et korrekt brugernavn, og derefter indtaster "') or password('') = password('" som adgangskode skulle man kunne komme ind?

Jeg har prøvet det og nogle flere kombinationer dog kan jeg ikke komme ind på den måde.



Og lige en ting til. Det kræver jo noget for brugeren at finde ud af at han skal indtaste dette password for at kunne hacke sig ind:

') or password('') = password('

Men her er du rigtig venlig at fortælle ham hvordan han skal gøre ved at udskrive mysql_error();

Nu kan det være du har magic_quotes = on i php.ini, og det eliminerer problemet, men det er dog stadigvæk en rigtig dårlig ide at bruge magic_quotes, da man ALDRIG må stole på hvad der er i variabler, som er defineret af klienten.



Okay tak.

Men jeg er stadig lidt på bar bund. Nogen der kan hjælpe mig med at løse problemet?



desuden bør du altid bruge addslashes() når du smider brugerinput ind i en databaseforespørgsel :)



<< < 12 > >>
t