Denmystiskeperson Skrevet 24. april 2007 Del Skrevet 24. april 2007 (endret) Ok, jeg har gjennom tidene laget mange forskjellige login systemer, dette var et utrolig lett login system... kan tenke meg at det er noen morsomme sikkerhets hull i det. Noen som ser noen ? (Ps! Det skal egentlig være mysql database med brukere, men nå viser jeg bare data lagret i variabler ). <html> <head></head> <body> <?php //Edit glemte session_start Oo session_start(); $riktigbrukernavn = "test123"; $riktigpassord = "test123456"; if ($_POST[login]){ if ($_POST[username] == $riktigbrukernavn && $_POST[password] == $riktigpassord){ $_SESSION[loggedin] = 1; header("Location: index.php"); die; }else{ $_SESSION[loggedin] = 0; echo "Brukernavn og passord er faktisk feil! Sorry! :)))) "; } }elseif ($_SESSION[loggedin] == 1){ // Her vises da innhold som er "beskyttet". } elseif (!$_POST[login] || $_POST[loggut]){ if ($_POST[loggut]){ session_destroy(); echo "<center>Du ble logget ut!</center>"; } echo<<<EOT <b>Login</b><br /> <form action="index.php" method="POST"> <input type="text" name="username"><br /> <input type="password" name="password"><br /> <input type="submit" name="login"> </form> EOT; } ?> </body> </html> Endret 24. april 2007 av Denmystiskeperson Lenke til kommentar
magicgunnar Skrevet 24. april 2007 Del Skrevet 24. april 2007 Jeg er ikke spesielt god på sikkerhet, men har du prøvd å putte inn farlige tegn i $_POST[username] og $_POST[passord] og se hva som skjer? Hvis du har en database og du putter inn: '0; DROP TABLE ....' klarer du da å slette databasen? Eller hvis du putter inn '1 == 1 || 0' i $_POST[username] hva skjer da? Tror php skal takle akkurat dette, men du bør nok filtrere input, og bare godta de tegnene som er ok! Lenke til kommentar
Runar0 Skrevet 24. april 2007 Del Skrevet 24. april 2007 PHP kan takle dette vist magic quotes er satt på. Vist ikkje må du sjølv passe på å escape ' ved å bruke mysql_real_escape_string(). Lenke til kommentar
Denmystiskeperson Skrevet 24. april 2007 Forfatter Del Skrevet 24. april 2007 Ok takk for svar. for å være erlig så har jeg aldri brukt escape_string men det brukes sånn? : $post_pass = mysql_real_escape_string($_POST[password]); if ($post_pass == $riktigpassord){ //etc... } Lenke til kommentar
Runar0 Skrevet 24. april 2007 Del Skrevet 24. april 2007 (endret) Stemmer det, men du må hugse på at vist magic quotes er på så vil du ende opp med dobbel escaping (\\'). Følgende funksjon vil først fjerne eventuelle \' for å så bruke mysql_real_escape_string PHP <?php // Utestet function escape_string($string) { if (get_magic_quotes_gpc()) { $string = stripslashes($string); } return mysql_real_escape_string($string); } ?> Hugs at du må vere tilkobla ein database for at mysql_real_escape_string skal fungere korrekt. Edit; leif. Endret 24. april 2007 av Shadows0 Lenke til kommentar
Runar Skrevet 24. april 2007 Del Skrevet 24. april 2007 men det brukes sånn? : 8458381[/snapback] Det er riktig Lenke til kommentar
Denmystiskeperson Skrevet 24. april 2007 Forfatter Del Skrevet 24. april 2007 Takker alle sammen! Lenke til kommentar
jorgis Skrevet 24. april 2007 Del Skrevet 24. april 2007 Hm. Så hva skjer om jeg besøker din side, klarer ikke å logge inn (jeg har ikke passord/brukernavn), og oppdager at du setter en session-cookie (logged_in) = 0? Da kan jeg bare endre den sessionen på min egen maskin til å bli logged_in = 1, og vips er jeg inne. Det du burde gjøre, er å lagre en hash av brukernavn og passord i session, for så å sjekke den hashen mot det ekte brukernavn og passord for hver eneste request. Da skal du være rimelig immun mot session-hijacking. Lenke til kommentar
grimjoey Skrevet 24. april 2007 Del Skrevet 24. april 2007 syns det blir litt feil å si ja til at det brukes slik som beskrevet tidligere her. mysql_real_escape_string() brukes på ting som brukeren skriver som havner i en query til databasen. mysql_query('select passord from brukere where brukernavn="'.$_POST['brukernavn'].'";'); bør være: mysql_query('select passord from brukere where brukernavn="'.mysql_real_escape_string($_POST['brukernavn']).'";'); ...dersom magic qoutes er av. eller bytt ut med funksjonen til Shadow0 Lenke til kommentar
grimjoey Skrevet 24. april 2007 Del Skrevet 24. april 2007 (endret) jeg holder på å kode en session håndtering som benytter challenge - response. Med mindre det er noe jeg har missforstått er den umulig å hijacke. ny nøkkel genereres på begge sider hver request og sendes kun en gang. bakdelen er at hvis noen får tak i hashen i databasen kan den brukes til å generere en fungerende nøkkel. utestet og uferdig men... https://www.diskusjon.no/index.php?showtopi...dpost&p=8460711 Endret 24. april 2007 av grimjoey Lenke til kommentar
Peter Skrevet 24. april 2007 Del Skrevet 24. april 2007 Hm. Så hva skjer om jeg besøker din side, klarer ikke å logge inn (jeg har ikke passord/brukernavn), og oppdager at du setter en session-cookie (logged_in) = 0? Da kan jeg bare endre den sessionen på min egen maskin til å bli logged_in = 1, og vips er jeg inne. Det du burde gjøre, er å lagre en hash av brukernavn og passord i session, for så å sjekke den hashen mot det ekte brukernavn og passord for hver eneste request. Da skal du være rimelig immun mot session-hijacking. 8460562[/snapback] session-hijacking er vel mer når du tar over noen andres session, ettersom du ikke har tilgang til å endre session-variabler på egenhånd med mindre du har tilgang til session-filen på serveren eller dataene i databasen (dersom man bruker databasebaserte sessions)? Cookies derimot, der må man passe på endringer som dette. Av andre ting som kan nevnes burde/SKAL passord hashes før de puttes i en database. F.eks. ved hjelp av md5() eller sha1(). Derfor trenger man ikke mysql_real_escape_string på passord, fordi disse hashene kun består av tall og/eller numre. Dersom noen trenger begrunnelse for hvorfor passord skal hashes i en database, kan jeg heller legge det til senere. Assosiative arrays skal ha quotes rundt indekser som aksesseres som ikke er tall. F.eks. $_POST['login']. Dessuten burde du bruke isset() for å sjekke om variabelen er satt, for å unngå feilmeldinger som sier at indeksen ikke eksisterer i arrayet. Sammenligning av strenger burde gjøres enten ved hjelp av === (ikke ==) eller str[case]cmp()-funksjonene Lenke til kommentar
Ståle Skrevet 24. april 2007 Del Skrevet 24. april 2007 Hvis dette virker, sa ma du tenke om igjen xD http://www.securiteam.com/securityreviews/5DP0N1P76E.html Lenke til kommentar
grimjoey Skrevet 24. april 2007 Del Skrevet 24. april 2007 (endret) Av andre ting som kan nevnes burde/SKAL passord hashes før de puttes i en database. F.eks. ved hjelp av md5() eller sha1(). Derfor trenger man ikke mysql_real_escape_string på passord, fordi disse hashene kun består av tall og/eller numre.Dersom noen trenger begrunnelse for hvorfor passord skal hashes i en database, kan jeg heller legge det til senere. Assosiative arrays skal ha quotes rundt indekser som aksesseres som ikke er tall. F.eks. $_POST['login']. Dessuten burde du bruke isset() for å sjekke om variabelen er satt, for å unngå feilmeldinger som sier at indeksen ikke eksisterer i arrayet. Sammenligning av strenger burde gjøres enten ved hjelp av === (ikke ==) eller str[case]cmp()-funksjonene 8461718[/snapback] brukeren skriver inn hva han vil i passordfeltet. dersom input ikke sjekkes av javascript eller annet går strengen uchecket til scriptet. setter man inn den strengen direkte i en mysql query uten å escape blir scriptet sårbart for SQL injection attack. god ide å bruke mysql_real_escape_string(). hva man forventer fra databasen spiller ingen rolle. sammenlikne med == blir vel det samme som strcmp() slik === er det samme som strcasecmp() Endret 24. april 2007 av grimjoey Lenke til kommentar
Peter Skrevet 25. april 2007 Del Skrevet 25. april 2007 *snip* 8464989[/snapback] Prøv igjen. Sjekk hva md5 og sha1 returnerer, så kanskje du skjønner poenget. Når ble hexadesimale tall farlige å putte i en database? Lenke til kommentar
Ernie Skrevet 25. april 2007 Del Skrevet 25. april 2007 (endret) sammenlikne med == blir vel det samme som strcmp() slik === er det samme som strcasecmp() 8464989[/snapback] Nei <?php echo '1 == "1": '.(int)(1=="1")."<br />\n"; echo '1 === "1": '.(int)(1==="1")."<br />\n"; echo 'strcmp(1, "1"): '.(int)(strcmp(1, "1")===0)."<br />\n"; echo 'strcasecmp(1, "1"): '.(int)(strcasecmp(1, "1")===0)."<br />\n<br />\n"; echo '1 == "a": '.(int)(1=="a")."<br />\n"; echo '1 === "a": '.(int)(1==="a")."<br />\n"; echo 'strcmp(1, "a"): '.(int)(strcmp(1, "a")===0)."<br />\n"; echo 'strcasecmp(1, "a"): '.(int)(strcasecmp(1, "a")===0)."<br />\n<br />\n"; echo '1 == "1a": '.(int)(1=="1a")."<br />\n"; echo '1 === "1a": '.(int)(1==="1a")."<br />\n"; echo 'strcmp(1, "1a"): '.(int)(strcmp(1, "1a")===0)."<br />\n"; echo 'strcasecmp(1, "1a"): '.(int)(strcasecmp(1, "1a")===0)."<br />\n<br />\n"; echo '"A" == "a": '.(int)("A"=="a")."<br />\n"; echo '"A" === "a": '.(int)("A"==="a")."<br />\n"; echo 'strcmp("A", "a"): '.(int)(strcmp("A", "a")===0)."<br />\n"; echo 'strcasecmp("A", "a"): '.(int)(strcasecmp("A", "a")===0)."<br />\n"; ?> Output: 1 == "1": 1 1 === "1": 0 strcmp(1, "1"): 1 strcasecmp(1, "1"): 1 1 == "a": 0 1 === "a": 0 strcmp(1, "a"): 0 strcasecmp(1, "a"): 0 1 == "1a": 1 1 === "1a": 0 strcmp(1, "1a"): 0 strcasecmp(1, "1a"): 0 "A" == "a": 0 "A" === "a": 0 strcmp("A", "a"): 0 strcasecmp("A", "a"): 1 Endret 25. april 2007 av Ernie Lenke til kommentar
grimjoey Skrevet 25. april 2007 Del Skrevet 25. april 2007 (endret) nazgul: mysql_query('SELECT username FROM users WHERE password="'.sha1/md5($POST['password']).'";'); den er safe. det kan jeg være enig i. men... $res = mysql_query('SELECT password FROM users WHERE username="'.$_POST['username].'"; $row = mysql_fetch_row($res); # if(sha1(strcmp($_POST['password']), $row[0])) // edit: rettelse: if(strcmp(sha1($_POST['password']), $row[0])) { blabla logget inn; } ... er ikke å anbefalle. da hjelper det ikke så mye om passordet er hashet. det var det jeg siktet til. Ernie: Jeg antok at vi snakket om å sammenlikne strenger med == og === ettersom det er $_POST variabler som er temaet. Enig at det er forskjell på streng og integer. Og antar at strcmp() (stringcompare) gjør om int til string før sammenlikning. men det er vel strengt tatt unødig dersom man vet at man har med strenger å gjøre i utgangspunktet. men takk for rettelsen uansett. verdt å huske på. BTW: er det mulig for $_POST å returnere en int? jeg antar at det ikke er det. edit: ser at det er en forskjeld i sammenlikning av to strenger også. Endret 26. april 2007 av grimjoey Lenke til kommentar
Peter Skrevet 26. april 2007 Del Skrevet 26. april 2007 Men når du henter ut passordet fra databasen så er det vel hashet? Man legger ikke inn passord i klartekst, dermed skal du gjøre strcmp( sha1( $_POST['password'] ), row[0] ) == 0 som fortsatt er safe.(Slik som du har satt det opp vil ikke funke( bl.a fordi du har byttet om på rekkefølgen av strcmp og sha1), ettersom strcmp returnerer 0 når strengene er LIKE. Lenke til kommentar
grimjoey Skrevet 26. april 2007 Del Skrevet 26. april 2007 stemmer det. liten skrivefeil der av meg. Lenke til kommentar
Hobbyhorse73 Skrevet 21. juli 2007 Del Skrevet 21. juli 2007 Åherregud. Selv med hjelp er det fult av sikkerhetsfeil her, så mye at det eneste du kan gjøre er å skrive det på nytt...regner med at du er blitt litt flinkere på tre måneder Lenke til kommentar
magicgunnar Skrevet 23. juli 2007 Del Skrevet 23. juli 2007 Åherregud. Selv med hjelp er det fult av sikkerhetsfeil her, så mye at det eneste du kan gjøre er å skrive det på nytt...regner med at du er blitt litt flinkere på tre måneder 9112817[/snapback] Når du først bumper en gammel tråd kunne du kanskje sagt hva hullene består i slik at vi som ikke har så mye peiling kunne lært litt? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå