Gå til innhold

Problemer med loginfunskjon i php/mysql


Anbefalte innlegg

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
Videoannonse
Annonse

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.

  • Liker 1
Lenke til kommentar

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

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.

  • Liker 1
Lenke til kommentar

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;
}

  • Liker 2
Lenke til kommentar

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?

  • Liker 1
Lenke til kommentar

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 :):w00t:

Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...