webForumDet fria alternativet

Hjälp med sessioner

6 svar · 598 visningar · startad av Shaadow

ShaadowMedlem sedan apr. 200632 inlägg
#1

Hejsan!

Jag skulle behöva lite hjälp med sessioner, får inte de att fungera riktigt ihop med en admininloggning jag gjorde.

De jag försöker göra är att man ska kunna logga ut som administratör och inte kunna surfa till admin.php sedan och vara inloggad.

Överst i login.php har jag

<?php
session_start();
$_SESSION['ADMIN'] = Shadow;
?>

Sedan kommer

<p id="stycke"><form action="logincheck.php" method="post" name="login" id="stycke">Användarnamn:<br /><input name="username" type="text" /><br />
		Lösenord:<br /><input name="password" type="password" /><br /><br /><input type="submit" name="Logga in" value="Logga in" id="submit" /></form></p>

logincheck.php

<?php
	$username = "Shadow";
	$password = "test";
	if(isset($_POST['username']) == $username && ($_POST['password']) == $password) {
    echo "Välkommen <b>". $username ."</b> ,du är nu inloggad och kommer skickas vidare alldeles strax!";   	
	echo '<meta http-equiv="Refresh" content="2;url=admin.php">';
	} else {
	echo '<meta http-equiv="Refresh" content="2;url=login.php">';
	echo "Du skrev in fel användarnamn och/eller lösenord!<br />Vänligen försök igen!";
	}
	?>

logout.php

<?php
session_start();
?>

<?php
		session_destroy();
    	echo "Välkommen åter <b>". $username ."</b> ,du loggas nu ut!";   	
		echo '<meta http-equiv="Refresh" content="2;url=login.php">';
		?>

Någon som kan hjälpa mig att fixa så att efter man har tryckt på logga ut, så ska man inte kunna surfa direkt till admin.php och fortfarande vara inloggad?

Tack på förhand
Mvh
Martin

aasahMedlem sedan mars 20034 471 inlägg
#2

Du måste sätta en speciell sessionsvariabel för de inloggade i stället för att bara skicka vidare. Exempel:

//Överst på ALLA sidor du vill skydda med sessioner:
session_start();    //Sätt inget annat!

logincheck.php

$username = "Shadow";
$password = "test";
if (isset($_POST['username']) && isset($_POST['password'])) {
   //Kolla först att formulärets båda fält är ifyllda!
   if ($_POST['username'] == $username && $_POST['password'] == $password) {
      //Inloggad
      $_SESSION['sInne'] = 'tjosan'; //Sätts BARA för inloggade!!!
      echo "Välkommen <b>". $username ."</b> ,du är nu inloggad och kommer skickas vidare alldeles strax!";   	
      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=admin.php">';
   } 
   else {
      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=login.php">';
      echo "Du skrev in fel användarnamn och/eller lösenord!<br />Vänligen försök igen!";
   }
}
else {
      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=login.php">';
      echo "Du måste fylla i båda fälten!<br />Vänligen försök igen!";
}

Överst i admin.php

session_start();    //Sätt inget annat!
if (!isSet($_SESSION['sInne']) || $_SESSION['sInne'] !== 'tjosan') 
   header("Location: login.php"); //EJ inloggad skickas till login
}
else {
//Resten av koden
}

RED: Rättat parentesfelet som nämns nedan

ShaadowMedlem sedan apr. 200632 inlägg
#3

Eftersom jag gärna vill lära mig mer och ta till mig nya saker hela tiden, skulle du kunna förklara dem olika sakerna du har lagt till?
T ex

      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=admin.php">';
   }
   else {
      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=login.php">';
      echo "Du skrev in fel användarnamn och/eller lösenord!<br />Vänligen försök igen!";
   }
else {
      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=login.php">';
      echo "Du måste fylla i båda fälten!<br />Vänligen försök igen!";
}

Vad menar du med "nu kan de inte skrivas ut"?

$_SESSION['sInne'] = 'tjosan'; //Sätts BARA för inloggade!!!

Här antar jag att du sätter en session för dem som loggar in?
Så om jag vill ha en logga ut funktion så är det denna jag ska använda i session_destroy();?

Tack för ditt svar!

aasahMedlem sedan mars 20034 471 inlägg
#4

Shaadow skrev:

Vad menar du med "nu kan de inte skrivas ut"?

Det är ALDRIG bra att sätta ett lösenord hårdkodat i en skriptvariabel. Nu är det här en övningssida så visst... Men eftersom vi pratar inloggning kan det vara viktigt att tänka efter före....

Jag är ingen guru på säkra skript direkt, men ju kortare tid en hårdkodad variabel med ett lösenord i är satt, ju bättre är det. unset gör att variabeln inte längre finns. Så om någon på något sätt skulle få in en uppmaning att skriva ut variabeln $password efter if-satsen så finns ingen sådan variabel om du gjort unset på den. Det här kanske inte är ett stort problem, men det skadar inte att göra så.

$_SESSION['sInne'] = 'tjosan'; //Sätts BARA för inloggade!!!

Här antar jag att du sätter en session för dem som loggar in?
Så om jag vill ha en logga ut funktion så är det denna jag ska använda i session_destroy();?

Ja och nej. Om man loggar in, och bara om man loggar in så skapas och sätts sessionsvariabeln sInne till ett visst värde nämligen tjosan. Detta kan användas för att kolla om man är inloggad.

Utloggningen, däremot, tar bort alla sessionsvariabler. I princip tar man hela sessionsarrayen och slänger i (en icke ångringsbar) papperskorg. Detta görs med session_destroy() (som inte tar något indata).

Att se till att man verkligen förstår sessioner på djupet är en mycket bra idé när man håller på med inloggningar. För att citera mig själv för några år sedan...

aasah skrev:

För ca ett och ett halvt år sedan jag stod inför problemet med säker inloggning. För något så när säker inloggning finns det väldigt många aspekter och är inget man lär sig på fem minuter eller beskriver på tio rader. Själv angrep jag min totala okunnighet på följande sätt:

  1. Använde sökfunktionen till att söka på "inloggning" i första hand i Webbutveckling - Övrigt i andra hand här i PHP. Läste allt som var allmänt hållet.
  2. Gjorde samma sak med 'session*'.
    Det blir en hel del att läsa, men man vinner mycket på det. Efteråt kan man ställa mer konkreta frågor och får därför en mycket tydligare bild.

Det skript som hjälpte mig mest var Mattes skript, vilket fanns länkat någonstans bland sökresultaten. Det är en bra guide för att fatta hur sessioner fungerar när man är total nybörjare på sessionsområdet. Dock hade jag även god hjälp av övriga sökresultat, varför jag rekommenderar dig att läsa igenom sökresultaten du får....

Om du hellre använder cookies än sessioner bör du titta närmare på följande länkar: (citerar mig själv sedan tidigare)
tydal gav ett väldigt utförligt svar angående vad som krävs för säker inloggning med cookies för ett tag sedan. Se detta och framförallt detta inlägg. Dessutom står det en del om jämförelsen mellan cookies & databas kontra sessioner i Inloggning - bra och dåligt med olika idéer.

En del att läsa, men bra och pedagogiska svar.

ShaadowMedlem sedan apr. 200632 inlägg
#5

Får upp följande meddelande då jag använder din kod

Parse error: syntax error, unexpected T_ELSE in C:\Program\xampp\htdocs\webbdesign\logincheck.php on line 42

<?php
		$username = "Shadow";
		$password = "test";
		if (isset($_POST['username']) && isset($_POST['password'])) {
   		//Kolla först att formulärets båda fält är ifyllda!
   		if ($_POST['username'] == $username && $_POST['password'] == $password) {
      	//Inloggad
      	$_SESSION['sInne'] = 'tjosan'; //Sätts BARA för inloggade!!!
      	echo "Välkommen <b>". $username ."</b> ,du är nu inloggad och kommer skickas vidare alldeles strax!";       
      	unset($username);
      	unset($password);   //Nu kan de inte skrivas ut...
      	echo '<meta http-equiv="Refresh" content="2;url=admin.php">';
   		} else {
      	unset($username);
      	unset($password);   //Nu kan de inte skrivas ut...
      	echo '<meta http-equiv="Refresh" content="2;url=login.php">';
      	echo "Du skrev in fel användarnamn och/eller lösenord!<br />Vänligen försök igen!";
  		} else {
      	unset($username);
      	unset($password);   //Nu kan de inte skrivas ut...
      	echo '<meta http-equiv="Refresh" content="2;url=login.php">';
      	echo "Du måste fylla i båda fälten!<br />Vänligen försök igen!";
		} 
		?>

Om jag tar bort

else {
          unset($username);
          unset($password);   //Nu kan de inte skrivas ut...
          echo '<meta http-equiv="Refresh" content="2;url=login.php">';
          echo "Du måste fylla i båda fälten!<br />Vänligen försök igen!";

Kommer jag vidare till admin.php men därefter blir jag tillbaka skickad till login.php =/

aasahMedlem sedan mars 20034 471 inlägg
#6

Sorry det var en stängande parentes som försvann. Ska vara:

<?php
$username = "Shadow";
$password = "test";
if (isset($_POST['username']) && isset($_POST['password'])) {
   //Kolla först att formulärets båda fält är ifyllda!
   if ($_POST['username'] == $username && $_POST['password'] == $password) {
      //Inloggad
      $_SESSION['sInne'] = 'tjosan'; //Sätts BARA för inloggade!!!
      echo "Välkommen <b>". $username ."</b> ,du är nu inloggad och kommer skickas vidare alldeles strax!";       
      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=admin.php">';
   } 
   else { 
      unset($username);
      unset($password);   //Nu kan de inte skrivas ut...
      echo '<meta http-equiv="Refresh" content="2;url=login.php">';
      echo "Du skrev in fel användarnamn och/eller lösenord!<br />Vänligen försök igen!";
  } 
}  //<--- tidigare borttappad
else {
   unset($username);
   unset($password);   //Nu kan de inte skrivas ut...
   echo '<meta http-equiv="Refresh" content="2;url=login.php">';
   echo "Du måste fylla i båda fälten!<br />Vänligen försök igen!";
} 
?>

Ett tips när något inte funkar är att titta på indenteringen. Många gånger kan parentesfel upptäckas då.

ShaadowMedlem sedan apr. 200632 inlägg
#7

Tack så mycket för både tips och hjälp!
Mycket uppskattat!
Tusen tack!

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)