Gå til innhold

Problem med login script


Anbefalte innlegg

Hei.

Har problemer med et login script.

Det virker som scriptet ikke skjønner at brukeren er logget inn.

 

Er det noen som kan være skikkelig greie å se hva jeg har gjort feil?

 

 

<?php
$run_login_while=true;
session_start();
include 'db-info.php';
echo $_SESSION['id'];
echo $_SESSION['username'];
echo $_SESSION['permission'];
echo $_SESSION['lastlogin'];
echo $_SESSION['ip'];
echo $_SESSION['login'];

//FUNCTIONS
function check_already_loggedin() {
//Printer ut greier i topp.php
$fourhours=3600*4;
$twoweeks=86400*14;
if($_SESSION['login']==true) {
 //Vis under 
 if($_SESSION['lastlogin']+$fourhours > time() && $_SESSION['ip']==$_SERVER['REMOTE_ADDR']) {
 	$session_loggedin=true; //Printer ut i topp.php
 	echo 'Check logged inn 1';
 	echo '<br />';
 }
 elseif($_SESSION['lastlogin']+$twoweeks > time() && $_SESSION['remember']==true) {
 	$session_loggedin=true; //Printer ut i topp.php
 	echo 'Check logged inn 2';
 	echo '<br />';
 } //end elseif
 else { //kun til feilsøking. Skal vises vis ip ikke riktig eller dato er utgått
 	$_SESSION['login']=false;
 	$login_display_login='Login ikke valid';
 }
} //end if
unset($fourhours);
unset($twoweeks);
} //end function




while($run_login_while==true) {
if(isset($_GET['logout'])) {
session_destroy();
$login_display_login='Du er nå logget ut.';
break;
}

//Alrady logged in?
check_already_loggedin();
if($session_loggedin==true) {
echo 'Break if already logged inn';
break;
}
echo 'Break funket ikke etter første checkloggedin()';

//Vis brukeren ikke er logget inn, skjer alt som er nedenfor.
session_destroy();

//Vis ikke bruker sendt brukernavn og passord
if(!$_POST['username']) {
$login_display_login='Bruker har ikke sendt noen input informasjon.';
break;
}

//Skjekker om Brukernavn og passord er skrevet inn riktig
if($_POST['username']=="" || $_POST['password']=="") {
$login_display_login='Du har ikke skrevet inn brukernavn og passord.';
break;
}
if(preg_match("/[^a-z0-9]/i", $_POST['username']) || preg_match("/[^a-z0-9]/i", $_POST['password'])) {
$login_display_login='Brukernavn eller passord inneholder tegn som ikke er lov.';
break;
}


//Velger database
$mysql_selected = mysql_select_db($mysql_database, $mysql_connect);
if (!$mysql_selected) {
  $login_display_login="Kunne ikke kontakte databasen.<br />Vennligst prøv igjen en annen gang.";
  break;
}

//Skjekker om riktig login i database
$_POST['password']=md5($_POST['password']);
$query="SELECT id,username,permission FROM users WHERE username='$_POST[username]' AND password='$_POST[password]'"; //string til DB
$result=mysql_query($query,$mysql_connect);

if(mysql_num_rows($result)==0) {
mysql_close($mysql_connect);
$login_display_login="Brukernavn og/eller passord er feil.<br />$password";
//$login_display_login='Brukernavn og/eller passord er feil.<br />';
break;
}

$mysql_row=mysql_fetch_row($result);
$_SESSION['id']=$mysql_row['id'];
$_SESSION['username']=$mysql_row['username'];
$_SESSION['permission']=$mysql_row['permission'];
$_SESSION['lastlogin']=time();
$_SESSION['ip']=$_SERVER['REMOTE_ADDR'];
$_SESSION['login']=true;

//If input fra brukeren sier husk passord lagrer det i en session variable
if($_POST['remember']==true) {
$_SESSION['remember']=true;
}
elseif($_POST['remember']==false) {
$_SESSION['remember']=false;
}

echo 'Break funket ikke etter siste checkloggedin()';

//Vis ikke innlogget
$login_display_login='Det har skjedd en feil.';

//Kutter løkken
break;
} //end while($run_login_while==true)


//IN TOPP.php
//PRINTER UT LOGIN FORM
if($login_display_login) {
echo '<div id="login">';
echo "\n";
echo '<h2>Logg inn!</h2>';
echo "\n";
if($login_display_login!='no') {echo "<p>$login_display_login</p>";}
echo "\n";
if($_GET['logout']) {echo '<form action="',$_SERVER['PHP_SELF'],'" method="post">';}
else {echo '<form action="" method="post">';}

echo '
<p>
Brukernavn: 
<input type="text" name="username" /><br />
Passord: 
<input type="password" name="password" /><br />
Husk passord: 
<input type="checkbox" name="remember" /><br />
<a href="glemt_passord.php">Glemt passordet</a><br />
<input type="submit" value="Logg inn" /></p>
</form>';

echo "\n";
echo '</div>';
} //end if($login_display_login)
elseif($session_loggedin==true) {
echo '<div id="login">';
echo "Hei $_SESSION[username].";
echo '<br />';
echo '<a href="',$_SERVER['PHP_SELF'],'?logout=true">Logg ut</a>';
echo '</div>';
}
?>

 

 

Endret av JonT
Lenke til kommentar
Videoannonse
Annonse

må ha "return $session_loggedin;" i funksjonen.

 

Bytt ut

check_already_loggedin();

if($session_loggedin==true) {

med

if (check_already_loggedin()===true) {

 

Har ikke studert så nøye, så kan være mer feil. ;)

 

Edit:

Hvorfor "break;" i hver if?

 

Edit 2:

Hvorfor "while ($run_login_while==true)"?

Endret av ZoRaC
Lenke til kommentar

Takk for svar, men det funket ikke.

 

EDIT: Fordi det er ikke vits i at hele scriptet kjøres vis brukeren f.eks. skal logget ut. Og i steden for å bruke masse if setninger bruker jeg heller en while setning med break.

Men fordi scriptet må kjøre det som står nederst kan jeg ikke kutte hele scriptet med å bruke exit();

Endret av JonT
Lenke til kommentar

Du har jo masse if'er likevel, hva med å bruke if og elseif istede?

 

Ser noe annet rart... alle $_SESSION-variabler "forsvinner" når brukeren logger ut (session_destroy) eller nettleseren lukkes. Derfor vil $_SESSION['lastlogin'] aldri være så mye som 2 uker og sjeldent så mye som 4 timer gammel.

 

I tillegg sjekker du i praksis om $_SERVER['REMOTE_ADDR'] er like seg selv...

 

Tror ikke jeg helt skjønner hva du vil med deler av scriptet:P

Lenke til kommentar
Ser noe annet rart... alle $_SESSION-variabler "forsvinner" når brukeren logger ut (session_destroy) eller nettleseren lukkes. Derfor vil $_SESSION['lastlogin'] aldri være så mye som 2 uker og sjeldent så mye som 4 timer gammel.

 

I tillegg sjekker du i praksis om $_SERVER['REMOTE_ADDR'] er like seg selv...

 

Tror ikke jeg helt skjønner hva du vil med deler av scriptet:P

6301234[/snapback]

Når brukeren trykker loggut.

Skal han logge ut. Skal de ikke være mulig å logge inn igjen.

Derimot når brukeren lokker vindu og har trykket "husk passord" skal man ikke trenge å logge inn. Dette funker ikke fordi man må ende hvor lenge session cocien skal være aktiv i php.ini

 

Får å få ekstra sikkerhet tar jeg å skjekker om IP adressen fra den gangen personen logget inn er den samme som det den er nå. (Vis det ikke har gått mer enn 4 timer og brukeren har krysset av for "husk passord")

Dermed unngår jeg at noen kan bare rappe cocien og så få tilgang til siden.

 

Vis det er noe feil med dette bare si ifra.

 

Har gjørt som du sa med while løkken og gjørt det om til if/ifelse.

Endringen gjorde at jeg oppdaget at jeg hadde glemt å skjekke $_POST.

 

Har endret litt på scriptet, men har fortsatt en feil.

Etter at jeg har printet ut brukernavnet fra MySQL serveren er username variabelen tom.

Er det noen som vet hva som er feil med det?

 

ZoRaC: Tusen takk for all hjelpen.

 

EDIT: OPS! Glemte å legge ut scriptet:

 

 

<?php
$run_login_while=true;
session_start();
include 'db-info.php';
echo $_SESSION['id'];
echo $_SESSION['username'];
echo $_SESSION['permission'];
echo $_SESSION['lastlogin'];
echo $_SESSION['ip'];
echo $_SESSION['login'];

//FUNCTIONS
function check_already_loggedin() {
//Printer ut greier i topp.php
$fourhours=3600*4;
$twoweeks=86400*14;
if($_SESSION['login']==true) {
 if($_SESSION['lastlogin']+$fourhours > time() && $_SESSION['ip']==$_SERVER['REMOTE_ADDR']) {
 	$session_loggedin=true; //Printer ut i topp.php
 }
 elseif($_SESSION['lastlogin']+$twoweeks > time() && $_SESSION['remember']==true) {
 	$session_loggedin=true; //Printer ut i topp.php
 } //end elseif
} //end if
unset($fourhours);
unset($twoweeks);
return $session_loggedin;
} //end function



if(isset($_GET['logout'])) {
session_destroy();
$login_display_login='Du er nå logget ut.';
}

//Alrady logged in?
elseif(check_already_loggedin()===true) {
echo 'Du er allerede logget inn';
$session_loggedin=true;
}

//Vis brukeren ikke er logget inn, skjer alt som er nedenfor.
elseif($_POST) {
session_destroy();

//Vis ikke bruker sendt brukernavn og passord
if(!$_POST['username']) {
$login_display_login='Bruker har ikke sendt noen input informasjon.';
}

//Skjekker om Brukernavn og passord er skrevet inn riktig
elseif($_POST['username']=="" || $_POST['password']=="") {
$login_display_login='Du har ikke skrevet inn brukernavn og passord.';
}
elseif(preg_match("/[^a-z0-9]/i", $_POST['username']) || preg_match("/[^a-z0-9]/i", $_POST['password'])) {
$login_display_login='Brukernavn eller passord inneholder tegn som ikke er lov.';
}


else {
//Velger database
$mysql_selected = mysql_select_db($mysql_database, $mysql_connect);
if (!$mysql_selected) {
  $login_display_login="Kunne ikke kontakte databasen.<br />Vennligst prøv igjen en annen gang.";
}

//Skjekker om riktig login i database
$_POST['password']=md5($_POST['password']);
$query="SELECT id,username,permission FROM users WHERE username='$_POST[username]' AND password='$_POST[password]'"; //string til DB
$result=mysql_query($query,$mysql_connect);

if(mysql_num_rows($result)==0) {
mysql_close($mysql_connect);
$login_display_login="Brukernavn og/eller passord er feil.<br />$password";
//$login_display_login='Brukernavn og/eller passord er feil.<br />';
}

$mysql_row=mysql_fetch_row($result);
$_SESSION['id']=$mysql_row['id'];
$_SESSION['username']=$mysql_row['username'];
if(empty($mysql_row['username'])) {echo 'Username er tomt';}
$_SESSION['permission']=$mysql_row['permission'];
$_SESSION['lastlogin']=time();
$_SESSION['ip']=$_SERVER['REMOTE_ADDR'];
$_SESSION['login']=true;

//If input fra brukeren sier husk passord lagrer det i en session variable
if($_POST['remember']==true) {
$_SESSION['remember']=true;
}
elseif($_POST['remember']==false) {
$_SESSION['remember']=false;
}
//Skjekker om innlogget
if(check_already_loggedin()===true) {
$session_loggedin=true;
}
else { //Vis ikke innlogget
$login_display_login="Det har skjedd en feil";
}
} //end else
} //end elseif($_POST)
else {
$login_display_login='';
}

//IN TOPP.php
//PRINTER UT LOGIN FORM
if($login_display_login) {
echo '<div id="login">';
echo "\n";
echo '<h2>Logg inn!</h2>';
echo "\n";
if($login_display_login!='no') {echo "<p>$login_display_login</p>";}
echo "\n";
if($_GET['logout']) {echo '<form action="',$_SERVER['PHP_SELF'],'" method="post">';}
else {echo '<form action="" method="post">';}

echo '
<p>
Brukernavn: 
<input type="text" name="username" /><br />
Passord: 
<input type="password" name="password" /><br />
Husk passord: 
<input type="checkbox" name="remember" /><br />
<a href="glemt_passord.php">Glemt passordet</a><br />
<input type="submit" value="Logg inn" /></p>
</form>';

echo "\n";
echo '</div>';
} //end if($login_display_login)
elseif($session_loggedin===true) {
echo '<div id="login">';
echo "Hei $_SESSION[username].";
echo '<br />';
echo '<a href="',$_SERVER['PHP_SELF'],'?logout=true">Logg ut</a>';
echo '</div>';
}
?>

 

 

Endret av JonT
Lenke til kommentar

Har ikke tid til å se mer på det akkurat nå, men du blander begrepene COOKIES og SESSION. En session lagres på serveren med en SID (Session ID) i en cookie på klienten. Når du lukker browseren vil session bli slettet og ingenting ligger igjen på klienten (annet enn en ubukelig cookie med bare en SID lagret).

 

Om du vil "huske" ting mellom hvert besøk må du lagre dette i en cookie, se litt på php.net/setcookie.

Lenke til kommentar

1. Man _MÅ_ ikke ha MySQL, men det er jo mye lettere å jobbe med enn flatfil.

2. Eneste måte å "huske" noe mellom 2 besøk fra samme PC er cookies. Ellers kan man lagre IP i databasen og sjekke dette, men IP'er endres jo, så det er kanskje ikke å anbefale. :p

2. Bytt ut "mysql_fetch_row" med "mysql_fetch_assoc"... ;)

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å
×
×
  • Opprett ny...