[php] Logowanie na session i cookie. Bezpieczne?

Cześć,

napisałem sobie proste logowanie. Zależy mi na bezpieczeństwie więc wykorzystałem zarówno sesje jak i ciasteczka :slight_smile:

Chciałbym, aby sprawdziła to osoba znająca się na rzeczy. Czy escape_string jest tam gdzie trzeba, czy musi być gdzieś jeszcze, itp.

Jeśli wszystko gra to - użytkownicy forum - macie darmowego gotowca :] Ale niech ktoś wiarygodny to potwierdzi…

index.php (z formularzem logowania)

<?php

session_start();


if (isset($_POST['logowanie'])) {

	$login = mysql_escape_string($_POST['login']);

	$haslo = sha1($_POST['haslo']); //przykladowehaslo


	if ($login == 'admin' and $haslo == 'de19afa25e0ff01e4acc6a2e9d377f62417829fa') {

		$_SESSION['login'] = 1;

		$_SESSION['PHPSESSID'] = session_id();


		setcookie('login', 1);

		// PHPSESSID samo się robi


		header("Location: news_show.php");

	}

}

?>


...

formularz logowania

...

news_show.php (dostęp tutaj tylko po zalogowaniu)

<?php

session_start();


if($_SESSION['login']!=1 or $_COOKIE['login']!=1 or $_SESSION['PHPSESSID']!=$_COOKIE['PHPSESSID']) {

	header("Location: index.php");

	exit;

}

?>


...

Wywnioskowałem, że sprawdzanie warunku $_SESSION[‘PHPSESSID’]!=$_COOKIE[‘PHPSESSID’] uniemożliwia w tym przypadku dostęp komuś, komu poda się link z id sesji do danej strony. Mam rację? :slight_smile:

jeżeli ktoś sobie utworzy u siebie ciastko przypisane do Twojej domeny i wpisze mu wartość 1 to całość szlag trafi

Jednym z najpewniejszych sposobów upewnienia się, że ktoś nie wejdzie z SESSION ID zalogowanego użytkownika jest zapisanie w sesji adresu IP przy logowaniu i później sprawdzanie przy przeglądaniu strony (przynajmniej przy tych krytycznych akcjach) czy aktualne IP zgadza się z tym zapisanym.

A nie zabezpiecza mnie przed tym porównanie PHPSESSID z ciasteczka i z sesji? Sesji chyba nie da się oszukać, no przynajmniej nie słyszałem żeby można było utworzyć sobie sesję o danym id…

Z przypisywaniem IP to extra rozwiązanie, ale co w takim przypadku: internet z kablówki, całe osiedle jest za NATem (każdy ma wewnętrzne IP) i około 80 komputerów przedstawia się w necie jako ten sam ZEWnętrzny adres.

if($_SESSION[‘login’]!=1 or $_COOKIE[‘login’]!=1 or $_SESSION[‘PHPSESSID’]!=$_COOKIE[‘PHPSESSID’])

!= to znaczy że coś nie jest równe.

or to znaczy “lub”

Ten ostatni warunek z cookie to już w ogóle jest bez sensu mianowicie sprawdzasz w nim czy PHPSESSID nie jest czasem równe PHPSESSID z cookie.

Jeśli id sesji nie równa się id sesji zapisanym w cookie wtedy jest warunek spełniony…

Jednym słowem…SESSION login ma nie być równy jeden lub COOKIE login ma nie być równy jeden lub SESSION id ma nie być równy COOKIE session id.

Mówiąc prosto tam każdy może wejśc bez logowania

■■■■… Chyba czegoś tu nie rozumiem :frowning:

Gdzieś natknąłem się na pomysł porównywania id sesji z cookie i z… sesji :wink: bo w ciachu id robi się samo już podczas session_start() - nie jest ono zapisywane w $_SESSION tylko jako ciasteczko. Stąd pomysł porównywania… ale teraz już wątpiłem czy to ma jakikolwiek sens :?

Wiem, w którym miejscu jest problem ale nie mam pojęcia jak to rozwiązać - jakaś wskazówka?

– edit –

ale zaraz, zaraz… Przecież jeśli warunek, o którym piszesz, będzie spełniony to… zobacz do mojego pierwszego postu, co się stanie :smiley: Przeniesie użytkownika na stronę logowania i zakończy wykonywanie skryptu przez exit()

To chyba dobrze?

To jedno z rozwiązań. Nic nie jest idealne i uniwersalne :slight_smile: Jeśli zabezpieczasz jakieś krytyczne dane nie powinieneś polegać na jednym mechanizmie.

Sesje da się oszukać na wiele sposobów.

Tutaj masz kilka ciekawych przykładów: http://www.beldzio.com/bezpieczenstwo-mechanizmu-sesji