Permalänk
Medlem

Utloggning [PHP]

Har precis skrivit klart ett administrationssystem, och vill nu ha en utloggningsfunktion. Men sessionen ligger kvar, hur jag än gör, så när jag går tillbaka till admin.php så är jag automatiskt inloggad. Läste lite på php.net om session_destroy(); och gjorde ett par försök. Men det ville sig inte.

admin_logout.php

<?PHP session_start(); $_SESSION["uid"] == ""; session_destroy(); header("Location: http://www.swedenmetal.info"); ?>

admin.php

<?PHP session_start(); require_once("modules/functions.php"); if (isset($_SERVER["PHP_AUTH_USER"]) && isset($_SERVER["PHP_AUTH_PW"])) { $chk_auth_usr = mysql_query(sprintf(" SELECT id, user, pass FROM sm_admin WHERE user = '%s' LIMIT 1 ", magicquotes($_SERVER["PHP_AUTH_USER"]))); if ($chk_auth_usr && (mysql_num_rows($chk_auth_usr) > 0)) { if (mysql_result($chk_auth_usr, 0, "pass") == md5($_SERVER["PHP_AUTH_PW"])) { $_SESSION["uid"] = (int)mysql_result($chk_auth_usr, 0, "id"); } } } if (isset($_SESSION["uid"]) && ($_SESSION["uid"] > 0)) { //INLOGGAD echo '<a href="admin_logout.php">Logga ut</a>'; } else { send_headers("Verifiering krävs."); } ?>

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

alltså inloggningen ska ju ske vid det tillfället då du har user och password i post, och det stämmer, och att du inte redan är inloggad, inte vid något annat tillfälle. Då sätter du ju info i sessionen också, och ser till att databasen fattar att du är inloggad. När utloggningen är gjord, t.ex. när du går till logout.php så tar du ju bort just de inloggningsspecfika raderna, i mina projekt så kör jag unset på session s_id och session s_uname, samt att jag berättar för databasen att jag inte längre är inloggad.

På det sättet kan jag inte se att något kan gå fel.

Permalänk
Medlem

Kan tillägga att jag alltid kör die() efter jag skickar headers ifall nån skum typ använder en webbläsare som inte accepterar modifierade headers. Men jag kanske bara är dum och/eller paranoid..

Permalänk
Medlem

Så i mitt fall, vilken session är det jag ska unsetta? Jag har provat med både $_SESSION, $_SESSION["uid"] och även provat med att sätta

$_SERVER["PHP_AUTH_USER"] == "";
$_SERVER["PHP_AUTH_PW"] == "";

Men jag blir fortfarande inte utloggad. =/

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

alltså, vid utloggningen så ska du ju ha sönder allt det du skapar när man loggar in.

Är du säker på att du inte blir utloggad?

Alltså, så att du inte går i den vanliga "back-fällan" (jag döpte den nu), alltså att du loggar ut, sedan trycker du "back" i webbläsaren, för då kommer du ju tillbaka till en cachad sida, där det ser ut som du fortfarande är inloggad, men du kan inte göra något, eftersom du faktiskt inte är inloggad.

Permalänk
Medlem

Jag antar du kör med HTTP AUTH och ingen egen inloggningsmekanism, dvs du använder dig av rutan som din webbläsare skickar upp? Vad jag vet så finns det ingen utloggningsmetod för det, men vet att det går att lösa iaf, du kan ju t.ex. titta på hur phpMyAdmin har gjort det.

Du har dock vissa andra fel i din kod som kan ställa till det för dig.

Antar du försöker sätta $_SESSION['uID'] till ingenting här, använd = istället för == , använder du == så tittar du bara om uID redan är noll, = använder du när du ska ge den ett nytt värde.

$_SESSION["uid"] == "";

samma sak med...

$_SERVER["PHP_AUTH_USER"] == ""; $_SERVER["PHP_AUTH_PW"] == "";

Men du kan ju även använda dig av unset också så slipper du skriva värdet till ingenting.

unset($_SESSION['uID']);

Permalänk
Medlem

Japp, jag är säker på att jag inte blir utloggad. Och nej, jag går inte i "back-fällan" (vilket ord )

Jag vet inte riktigt varför jag inte blir utloggad, är det någonting jag har missat att förstöra som finns i admin.php?

Edit
Rosenson: Jag ska testa och se ifall det funkar.

Edit igen
Hela koden för admin_logout.php ser nu ut så här:

<?PHP unset($_SESSION['uid']); header("Location: http://www.swedenmetal.info"); ?>

Är jag bara dum/för trött, eller ska detta fungera?

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

Det är lite svårt att veta om det ska fungera, det beror ju på hur du avgör om en användare är inloggad eller inte på dina andra sidor, spelar $_SESSION['uID'] en avgörande roll? Hur blir man inloggad på dina sidor?

Permalänk
Medlem

rosenson hittade ju i alla fall ett fel där, kul att jag missade det, det ska alltså inte vara dubbla "=", för så sätter man som sagt inte ett värde.

Sedan är det sant det här med definitionen av "inloggad".
Vi säger att man räknas som inloggad om $_SESSION['id'] är större eller lika med noll. Om du sätter detta värde till noll och kör en header replace så är du ju utloggad om värdet blev ändrat. Om du fortfarande är "inloggad" så blev ju inte värdet förändrat, i så fall så har vi ju satt fingret på prbolemet, det är din tilldelning av värde på din session som inte fungerar som den ska.

Du får debugga lite å printa ut lite värden så att du ser statusen på dina variabler.

Permalänk
Medlem

Jag brukar köra

unset($_SESSION['asdf']; session_destroy(); header('Location: asdf.php');

i den ordningen.

Permalänk
Medlem

du kan även prova med att sätta

$_SESSION = array();

istället för att köra med session_destroy(); Om du inte har annat sparat i $_SESSION - arrayen förståss...

Visa signatur

Jorden är rund, det är jag säker på.
Kolla min blogg vettja. http://eboberg.blogspot.com

Permalänk
Medlem

Hur ber du om inloggningsinformationen från den som loggar in? Använder du dig av headers och skickar upp en ruta? (frågade förut, men inget svar).

Isåfall är ditt problem att webbläsaren skickar ju inloggningsuppgifterna varje gång, det hjälper inte att unsetta $_SERVER['PHP_AUTH_USER'] den sätts igen nästa gång sidan laddas vilket gör att besökaren loggas in igen (och $_SESSSION[uID] populeras igen med ett ID)

Permalänk
Medlem

Ja, det är en sån här popup-inloggning eller vad man ska kalla det. Inloggad blir man om följande

if ($chk_auth_usr && (mysql_num_rows($chk_auth_usr) > 0)) { if (mysql_result($chk_auth_usr, 0, "pass") == md5($_SERVER["PHP_AUTH_PW"])) { $_SESSION["uid"] = (int)mysql_result($chk_auth_usr, 0, "id");

bobitt: Jag har testat $_SESSION = array(); och det funkade inte heller =/

Rosenson: Men hur ska jag rensa $_SESSION["uid"] för att det inte ska ligga kvar nästa gång jag vill in i administrationen? För som det är nu måste man starta om webbläsaren..

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

Ja, jag vet inte, men det jag kan råda dig till är att titta hur phpMyAdmin har gjort det, dom är de enda jag vet har en utloggningsfunktion med en sådan inloggning.

Jag är inte säker nu men jag har för mig att de sätter ett extra session värde, t.ex. $_SESSION['logged_out'] = true; eller liknande. Det kan du ju testa, vid utloggning, sätt ett extra värde, och sen får du göra om din if sats till att kanske se ut så här.

if (isset($_SERVER["PHP_AUTH_USER"]) && isset($_SERVER["PHP_AUTH_PW"]) && ( !isset($_SESSION['logged_out']) || !$_SESSION['logged_out'] ) ) {

Permalänk
Medlem

Jag testade följande i admin.php

if (isset($_SESSION["uid"]) && ($_SESSION["uid"] > 0) && (! isset($_SESSION['logout'])) || !$_SESSION['logout'] ) {

Nu funkar det. Men nu kan jag istället inte logga in, eftersom $_SESSION['logout'] verkar ligga kvar. Jag la session_destroy($_SESSION['logout']); precis ovanför, men det funkar inte heller. =/

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

Jo, precis, det blir ju ett problem som dyker upp istället, du får väl göra en egen login sida och där skicka upp inloggningsrutan och sen titta om något login värde är satt eller liknande, vet faktiskt inte, testa lite, jag känner att det hade varit enklare att göra en egen inloggning om man ska ha utloggning...

Permalänk
Medlem

Fast när man tänker efter, är egentligen en utloggning nödvändig? Nu har jag suttit hela morgonen och försökt göra den här utloggningen, men när utloggningen väl funkar så funkar inte inloggningen. =/

Visa signatur

What is your spaghetti policy around here?

Permalänk
Medlem

Jag använder mig utav:

if (isset($_GET['logout'])){ session_unset(); session_destroy(); header("Location: index.php"); exit; }

Funkar hur bra som helst, alla sessions försvinner.
Anropar det med index.php?logout bara, och har förstås session_start(); längst upp!

Visa signatur

Stationär » Amd Athlon64 X2 4800+ | Asus M2N-Sli Deluxe | 2048mb ram | BFG 8800GTS OC 320mb | Hiper Type-R Modular 580w Black | WD Raptor 74gb + 200gb + 250gb + 250gb + 500gb

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av T.D!
Fast när man tänker efter, är egentligen en utloggning nödvändig? Nu har jag suttit hela morgonen och försökt göra den här utloggningen, men när utloggningen väl funkar så funkar inte inloggningen. =/

Nej, det är sant, om det endå bara är du som ska använda det så är ju en utloggning inte så nödvändig, kom även på att jag hade lite fel när jag sa att du skulle kolla på hur phpMyAdmin har löst det, dom har löst det, men inte fullständigt, när du loggar ut från phpMyAdmin så kan du inte logga in med samma användare igen direkt efter, så det är nackdel också.

Bra att alla skriver hur dom löser sina in och utloggningar när det inte är relevant...

Permalänk
Medlem

Rosenson: Jo precis, det var så jag tänkte också. Det är bara jag och crewet som ska ha tillgång till administrationen, så det känns lite onödigt med utloggning. Anledningen till att jag ville ha det var för att de kanske satt vid en dator på typ ett bibliotek eller nån annan allmän plats, då skulle det vara bra med en utloggning.

Inte för att jag har särskilt höga förväntningar, men jag ska testa det som McMoj skrev.

Edit
Ahh, jag fick det att funka. Jag gjorde så här:

admin.php

<?php session_start(); if ($_SESSION['logout'] == true){ $_SESSION['logout'] = false; session_unset($_SESSION['logout']); session_destroy($_SESSION['logout']); $_SERVER["PHP_AUTH_USER"] = ""; $_SERVER["PHP_AUTH_PW"] = ""; } if (isset($_SERVER["PHP_AUTH_USER"]) && isset($_SERVER["PHP_AUTH_PW"]) && $_SESSION['logout'] != true) { //resten }

admin_logout.php

<?PHP session_start(); $_SESSION['logout'] = true; header("Location: http://www.swedenmetal.info"); ?>

Visa signatur

What is your spaghetti policy around here?