stian28 Skrevet 23. april 2013 Del Skrevet 23. april 2013 Hei. Jeg holder på med en skoleoppgave og har møtt på et lite problem. Jeg prøver å lage en login funksjon men koden vil ikke fungere. Noen som har tid til å ta en titt på den ? <?php session_start(); $bruker= $_REQUEST["brukernavn"]; $pass = $_REQUEST["passord"]; //tester // echo "$bruker<br/>"; //echo "$pass<br/>"; $db = new mysqli("localhost","root",""); $sql = "SELECT * FROM admin WHERE (brukernavn = '$bruker') AND (passord = PASSWORD('$pass'))"; $resultat = $db->query($sql); if($db->affected_rows == 1) { echo "Du er logget inn !"; $_SESSION["loggetInn"]= true; } else { echo "noe gikk galt igjen.."; $_SESSION["loggetInn"] = false; } Tabellen min heter admin, og kollonnene brukernavn og passord. Jeg har lagt inn et brukernavn og passord i den allerede. Passordet er beskyttet med sql funksjonen PASSWORD(). Hver gang jeg kjører koden så får jeg bare "noe gikk galt igjen.." beskjeden. Samme beskjeden kommer opp om jeg bruker riktig eller galt brukernavn/passord. ?> Lenke til kommentar
MikkelRev Skrevet 23. april 2013 Del Skrevet 23. april 2013 Noen ting: 1. Bruk code BBCoden. 2. Bruk POST eller GET istedetfor REQUEST. 3. Ikke bruk variablene som kommer utenfra rett i spørringen uten å sanitize de først. 4. Har du bekreftet at PASSWORD('$pass') faktisk er det samme som er lagret i databasen? 5. Har du prøvd å kjøre den genererte spørringen i f.eks. phpMyAdmin? 6. Ikke bruk PHP-avslutningstag (?>) med mindre du har HTML under. 1 Lenke til kommentar
stian28 Skrevet 24. april 2013 Forfatter Del Skrevet 24. april 2013 Noen ting: 1. Bruk code BBCoden. 2. Bruk POST eller GET istedetfor REQUEST. 3. Ikke bruk variablene som kommer utenfra rett i spørringen uten å sanitize de først. 4. Har du bekreftet at PASSWORD('$pass') faktisk er det samme som er lagret i databasen? 5. Har du prøvd å kjøre den genererte spørringen i f.eks. phpMyAdmin? 6. Ikke bruk PHP-avslutningstag (?>) med mindre du har HTML under. Hei Mikkel og takk for svar. Leste kjapt om BBcode på nett. Hva er fordelen med det i forhånd til html ? Jeg byttet REQUEST til POST men det hjalp meg desverre ikke. Anngående sanitize. Leste kjapt om det og på nett. Kunne du kanskje gitt et eksempel på bruk av sanitize i min kode? Jeg har ikke fått bekreftet passordet fullstendig siden jeg er usikker på hvordan jeg har gjør det. Men er sikker på at jeg bruker riktig brukernavn og passord. Jeg har slettet og lagt dem inn på nytt i tabellen, men det hjalp ikke. Jeg prøvde å kjøre SELECT setningen i phpmyadmin. Der fungerte den fint. Takk for tipset med avslutningstaggen. Jeg har litt html under phpkoden så den er vel riktig. Lenke til kommentar
burger1 Skrevet 24. april 2013 Del Skrevet 24. april 2013 Nå er ikke jeg så inne i denne PHP språket, men vil ikke dette være feil? (passord = PASSWORD('$pass'))"; I f.eks C# så vil en tekst i en funksjon som ligger inne som 'tekst' i (c# "tekst"). bli oppfattet som teksten som står. Dvs i din kode så vil PASSWORD generere hashen av '$pass' og ikke av variablen $pass. Det blir ihvertfall min forståelse av php koden du har gitt. 1 Lenke til kommentar
stian28 Skrevet 24. april 2013 Forfatter Del Skrevet 24. april 2013 ok jeg forstår. Noen forslag til en løsning burger1 ? Lenke til kommentar
burger1 Skrevet 24. april 2013 Del Skrevet 24. april 2013 Jeg vet ikke om det er rett, koder selv bare i C#, men prøv bare å ta vekk '' foran og bak $pass og se hvordan det går, for da vil den jo bruke variablen ogg ikke teksten '$pass'. Var min tolkning av dette 1 Lenke til kommentar
Crowly Skrevet 24. april 2013 Del Skrevet 24. april 2013 Han mener du skal bruke BBCode i forum innleggene her bruke code eller php taggen [php] // legg php eller annen kode her slik at den blir mer lesbar f.eks. $test=1; echo $test; [/php] Sanitize er ymse metoder for å sørge for at input fra bruker er trygg og har verdier som forventet. ALDRI stol på brukeren. Ta en titt på f.eks. filter_input() og/eller filter_var(). mysqli_real_escape_string() (eller tilsvarende) er også veldig viktig i denne sammenhengen. Ta også en titt på "type casting": http://php.net/manua...pe-juggling.php Hva tror du skjer her når man legger inn aaa'; DROP TABLE admin; i brukernavnet? $bruker=$_POST['bruker']; $pass=$_POST['passord']; $sql = "SELECT * FROM admin WHERE brukernavn = '$bruker' AND passord = PASSWORD($pass)"; Dette er kalt sql injection, og vil slette admin tabellen din. Du har også unødvendige parenteser rundt brukernavn og passord i sql'en. Ikke bruk SELECT * med mindre du skal ha alle feltene fra tabellen, spesifiser hvilke felter du trenger. Skal du legge inn variabler i en streng, så sett krøll parentes rundt slik at php vet helt nøyaktig hvor variabelen begynner og slutter $bruker=$db->real_escape_string($bruker); $pass=$db->real_escape_string($pass); $sql = "SELECT * FROM admin WHERE brukernavn = '{$bruker}' AND passord = PASSWORD({$pass})"; evt gjør slik $bruker=$db->real_escape_string($bruker); $pass=$db->real_escape_string($pass); $sql = "SELECT * FROM admin WHERE brukernavn = '" . $bruker . "' AND passord = PASSWORD(" . $pass . ")"; eller bruk f.eks. sprintf() $sql = sprintf("SELECT * FROM admin WHERE brukernavn = '%s' AND passord = PASSWORD(%s)", $db->real_escape_string($bruker), $db->real_escape_string($pass)); Liten fiks på koden din, den så grei nok ut bare for å sjekke at login fungerer (men var ikke så sikker, denne er noe bedre) <?php session_start(); $bruker= $_POST["brukernavn"]; $pass = $_POST["passord"]; $db = new mysqli("localhost","root",""); $sql = sprintf("SELECT * FROM admin WHERE brukernavn = '%s' AND passord = PASSWORD(%s)", $db->real_escape_string($bruker), $db->real_escape_string($pass) ); // debugg echo $sql; // kjør output av denne i phpmyadmin for å kontrollere at den fungerer, kommenter ut eller slett hvis den fungerer if ($db->query($sql) !== false) { if ($db->affected_rows == 1) { echo "Du er logget inn !"; $_SESSION["loggetInn"]= true; } else { echo "noe gikk galt igjen.."; $_SESSION["loggetInn"] = false; } } else { echo $db->error; } 2 Lenke til kommentar
MikkelRev Skrevet 24. april 2013 Del Skrevet 24. april 2013 BBcode er noe du bruker i forumer, som her. Fordelen med å bruke code-BBcoden, er at da blir koden din mye ryddigere å lese for oss <?php session_start(); $bruker= $_REQUEST["brukernavn"]; $pass = $_REQUEST["passord"]; //tester // echo "$bruker<br/>"; //echo "$pass<br/>"; $db = new mysqli("localhost","root",""); $sql = "SELECT * FROM admin WHERE (brukernavn = '$bruker') AND (passord = PASSWORD('$pass'))"; $resultat = $db->query($sql); if($db->affected_rows == 1) { echo "Du er logget inn !"; $_SESSION["loggetInn"]= true; } else { echo "noe gikk galt igjen.."; $_SESSION["loggetInn"] = false; } Å ikke bruke REQUEST hadde jeg ikke regnet med skulle fikse problemene dine, men det er et generelt råd å unngå det. Eksempel på sanitering: $bruker=mysql_real_escape_string($_POST["brukernavn"]);. Det er for at det ikke skal være for lett å "hacke" siden din. Hvordan ser den genererte spørringen din ut som du kjørte i phpMyAdmin, og hva fikk du opp der? 1 Lenke til kommentar
stian28 Skrevet 25. april 2013 Forfatter Del Skrevet 25. april 2013 Halloen igjen og der ja! Jeg brukte Crowley's forslag og det fungerte. Takk for tipsene alle sammen. Jeg endte opp med å lære mye mer enn det jeg håpet på. Vi har så vidt begynt med sql injection, så dette kommer nok godt med. Jeg er stygt redd for at jeg kommer til å trenge mer hjelp i framtiden. Jeg skal huske BBcode da. Takk igjen alle sammen Lenke til kommentar
TheClown Skrevet 25. april 2013 Del Skrevet 25. april 2013 [snip] Hvis du først skal bort fra mysql burde du kanskje tipse om pdo istede for mysqli. mysqli er også en mye svakere løsning enn pdo. Lenke til kommentar
Crowly Skrevet 25. april 2013 Del Skrevet 25. april 2013 Har ikke spesifikt tipset om mysqli i denne tråden. TS benyttet mysqli, så jeg fortsatte med det. Men siden man først nevner PDO, her er den samme koden med pdo <?php session_start(); $bruker= filter_input(INPUT_POST,'brukernavn',FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_LOW); $pass = filter_input(INPUT_POST,'passord',FILTER_SANITIZE_STRING); // ;port= er kun nødvendig hvis man ikke bruker standard porten 3306 $dns='mysql:host=localhost;port=3306;dbname=database'; try { $pdo=new pdo($dns, 'brukernavn', 'passord'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // prepared statement $sql="SELECT COUNT(*) ant FROM admin WHERE brukernavn = :bruker AND passord = PASSWORD(:pass)"; $rs=$pdo->prepare($sql); $rs->bindValue(':bruker',$bruker,PDO::PARAM_STR); $rs->bindValue(':pass',$pass,PDO::PARAM_STR); if ($rs->execute()) { if ($data = $rs->fetch(PDO::FETCH_OBJ)) { // er kun en rad/forekomst if ($data->ant == 1) { echo "Du er logget inn !"; $_SESSION["loggetInn"]= true; } else { echo "noe gikk galt igjen.."; $_SESSION["loggetInn"] = false; } } } } catch (PDOException $e) { echo 'Feil: ' . $e->getMessage(); } 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å