PHP sesje wylogowanie

0

Cześć!

Mam problem z wykorzystaniem sesjij do logowania. Chodzi o to, że wylogowaniu ze strony, na którą użytkownik się loguje za pomocą hasła można na nią wrócić po naciśnięciu przycisku wstecz w przeglądarce. Co trzeba zrobić aby wylogowanie działało tak jak powinno? Poniżej przedstawiam kody:

<?php
//skrypt :)
$pass = $_POST[pass];
if ($pass)
{
if ($pass==$haslo)
{
$_SESSION[haslo] = $haslo;
header ("Location: p3.php"); //podajesz adres, na który po zalogowaniu skrypt przekierowuje
}
else
{
echo 'Podałeś niepoprawne hasło. :(';
}
}
else
{
echo '
<form method=post>
Podaj hasło: <INPUT TYPE="PASSWORD" NAME="pass" VALUE="'.$pass.'"> 
<INPUT TYPE="SUBMIT" VALUE="Zaloguj">
</FORM>
';
}
$action = $_GET[action];
if ($action=="logout")
{

session_destroy();
header("Location: index.html"); //podajesz adres, na który po wylogowaniu skrypt przekierowuje
}
?>

Używam session_destroy ale to nie pomaga. Próbowałem z usset i destroy_array ale też nic

0

Dodam, że na operze to testuje

0
<?php
session_start(); /* nie można zniszczyć sesji która nie jest zainicjowana! */
$pass = $_POST['pass']; /* poprawiłem, przy użyciu $_POST[pass] kompilator może zrozumieć "pass" jako stałą, nie wiem jakim cudem ci łyknęło tutaj */
	if($pass) {
		if($pass == $haslo) {
			$_SESSION['haslo'] = $haslo;
			header('Location: p3.php');
			exit(); /* kończymy skrypt po każdym przekierowaniu, po co ma się dłużej przetwarzać? */
		} else {
			echo('Podałeś niepoprawne hasło. :(');
		}
	} else {
		echo('<form method="POST">Podaj hasło: <INPUT TYPE="PASSWORD" NAME="pass" VALUE="'.$pass.'"><INPUT TYPE="SUBMIT" VALUE="Zaloguj"></FORM>');
	}
	$action = $_GET['action']; /* też była "action" jako stała */
	if ($action == 'logout') {
		session_destroy();
		header('Location: index.html');
		exit(); /* tu to samo co do tego exita() w 8 linijce */
	}
?>

W tej formie będzie już działało. Oprócz tego poprawiłem formatowanie, bo aż razi. I jeszcze taka uwaga co do używania HTMLa:
Skoro grzecznie bierzesz wartości argumentów w cudzysłowy jak tutaj:

<INPUT TYPE="SUBMIT" [...]

To czemu ten biedny:

<form method=post>

... ma być gorszy?

Tutaj użyłeś 3 różnych sposobów formatowania:

header ("Location: p3.php"); /* argumenty w nawiasie, przed nawiasem spacja */
session_destroy(); /* argumenty w nawiasie, bez spacji po nazwie funkcji */
echo 'Podałeś niepoprawne hasło. :('; /* bez nawiasu, spacja po nazwie funkcji */

To wszystko skutkuje zmniejszeniem czytelności kodu, nie mówiąc o takich konstrukcjach (nie ma to jak wzbogacić się o kilka linijek kodu):

}
}
else
{

Więc na przyszłość o to też się postaraj.</php>

0

Dziekuje za wszystkie rady. Zwłaszcza ta z funkją exit(). Jednak w dalszym ciagu w Operze nie działa tak jak powinno. W IE i FF działa tak jak powinno. Czy Opera wymaga jakichs dodatkowych zabiegow?

0

Pokaż w pliku p3.php to miejsce gdzie sprawdzasz czy user jest zalogowany.
Skoro niszczysz wszystkie dane sesji na serwerze to imo agent nie ma nic do powiedzenia.

0

Tak wyglada plik p3.php

<?php
error_reporting("E_ALL");

//kod dopowiedzialny za zabezpieczenie przed nieautoryzowanym dostepem
session_start();
include "haslo.php";
if ($_SESSION['haslo'])
{
	if (!($_SESSION['haslo'] == $haslo))
	{
	header ("Location: logowanie.php");
	}
}
else
{
	header ("Location: logowanie.php");
}
//kod dopowiedzialny za zabezpieczenie przed nieautoryzowanym dostepem

?>

<a href="logowanie.php?action=logout" style="text-decoration:none;" title="Wyloguj"><span style="color: grey;">Wyloguj</span></a>


Tajna informacja
0

Hmm... No nie wygląda nic zbyt źle oprócz tego braku exitów() po headerach o których wspominałem (da się pobrać tajną informację jeśli się uprzemy, bo skrypt nie wychodzi po wysłaniu nagłówków)

Jeszcze z tym niszczeniem sesji zrób tak:

//dodaj przed: session_destroy()
$_SESSION = array();
if (isset($_COOKIE[session_name()]))
setcookie(session_name(), '', time()-42000, '/');

Pierwsza linijka to przypisanie do $_SESSION pustej tablicy = wyczyszczenie danych.
Ten kod z setcookie() jest po to żeby zmusić przeglądarkę do wywalenia ciacha sesyjnego.

0

To niestety tez nic nie daje. Dalej jest tak samo - wcisakm przycisk 'wstecz' po wylogowaniu w operze i pokazuje stronę z tajana informacja choc nie powinno.

0

Bo przeglądarka nie odświeża strony przy wciskaniu WSTECZ, tylko pokazuje ją z pamięci. Możesz jeszcze na górze każdego dokumentu wrzucić to:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

Te nagłówki wymuszają na przeglądarce ponowną weryfikację strony przy każdym jej otwarciu, warto spróbować.

0

ja od siebie zaproponowałbym takie modyfikacje:

//kod dopowiedzialny za zabezpieczenie przed nieautoryzowanym dostepem
session_start();
include "haslo.php";
if ( isset($_SESSION['haslo']) ) //<-----isset( zmienna ) sprawdza czy 'zmienna' istnieje, wiec jesli sesja jest usunieta to zwruci false
{
        if (!($_SESSION['haslo'] == $haslo))
        {
        header ("Location: logowanie.php");
        }
}
else
{
        header ("Location: logowanie.php");
}
//kod dopowiedzialny za zabezpieczenie przed nieautoryzowanym dostepem

ja zamiast session_destroy() używałem session_unset()

0

Tak na prawdę to można użyć obydwu, tylko czy jest sens jeśli przy niszczeniu sesji niszczymy wszystkie jej dane? To jest problem typowo client-sideowy akurat.

0

W dalszym ciagu jest problem w operze. Wyprobowalem wszystkie sposoby, ktore podpowiedzieliscie. Sprobuje poszukac innej metody na logowanie i wylogowanie.

0

Tylko nie rozumiem? W czym ci to przeszkadza? Taka przeglądarka, że nawet przeterminowanych stron nie oddaje do weryfikacji przy wciskaniu WSTECZ i nic z tym nie zrobisz. No chyba że użyjesz JavaScriptu, AJAXa i jeszcze nie wiem czego.

0

Aż tak mi nie przeszkadza ale do tej pory inaczej wyobrażałem sobie wylogowanie. Myślałem, że jak klikam w odnośnik wyloguj to już nikt nie podejrzy strony, z której co dopiero się wylogowałem. Okazuje się, że jest inaczej. Sprawdzałem to również na rachunku bankowym i dzieje się tak samo. Wniosek tego taki, że jeśli kończe pracę z np. bankowym kontem internetowym i klikam 'wyloguj' to najlepiej dla pewności zamknąć przeglądarkę bo jeśli tego nie zrobię a korzystam z komputera w miejscu publicznym to ktoś może podejrzec ile mam na koncie (przy zalozeniu, że korzytałem z Opery).

0

Odkopane fest. Problem tkwi jedynie w braku exit(); po session_destroy(); czyli

$action = $_GET['action'];
if($action=='logout') {
session_destroy();
exit();
header('Location: login.php'); 
0

Gratuluję odkopania, szczególnie, że Twoja rada nic nie da.
Dla potomnych: Opera domyślnie (kiedyś to pewnie zmienią) przy przechodzeniu wstecz wczytuje stronę z cache praktycznie ZAWSZE, co jest:

  1. cholernie przydatne - przechodzenie wstecz to kwestia milisekund, jak połączenie z netem padnie w międzyczasie - to wciąż możemy przechodzić pomiędzy tym, co już było oglądane w tej karcie
  2. cholernie przydatne - zapamiętują się dane z formularzy
    Za to twórcy stron niewiele tu mogą - wymusić "firefoxowego" przechodzenia wstecz nie można (można zasugerować - to się da zmieniać gdzieś w opera:config), nie bardzo też idzie coś zrobić z tymi formularzami (chyba, że javascriptem czyścić, ale raczej nie na onload tylko ciut później, bo na onload to się te dane wpisują).

I jeszcze jedno - to, że zdeaktualizowaną stronę można zobaczyć - nie znaczy, że cokolwiek jeszcze na niej zadziała ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1