Skocz do zawartości

[PHP] Skrypt logowania


Ghost

Recommended Posts

Rozumiem, że w PHP 5 piszesz. Generalnie takie rzeczy w aplikacjach webowych rozwiążuje się podobnie niezależni od języka.

Popierwsze potrzebna jest baza użytkowników (zazwyczaj w relacyjnej bazie danych), taka uwaga hasła szyfruj algorytmem sha, a nie md5, bo md5 jest już za słaby i da się go złamać.

Po przesyłaniu danych z formularza, sprawdzamy dane czyli szukamy użytkownika i porównujemy hasło, jeśli wszystko się zgadza tworzymy zmienną w sesji (np $_SESSION['user']['id'] plus ewentualnie $_SESSION['user']['username'] i jakieś inne dane jakie są nam potrzebne, np. role użytkownika. Jeśli korzystasz z obiektów, to możesz stworzyć też obiekt klasy user i przypisać go do $_SESSION['user'].

Jeśli nie chcesz mieć podziału na role to tyle w zasadzie starczy. Później na stronach lub fragmentach wymagających zalogowania piszesz

if(isset($_SESSION['user'])&& $_SESSION['user']!='') 
{ 
// treść dostępna dla zalogowanych
} 
else 
{
// komunikat o konieczności zalogowania, formularz logowania itp.
}

Ja jednak używam frameworka jak piszę strony więc takie rzeczy jak logowanie w dużym stopniu załatwia za mnie sam szkielet, ja tylko określam metodę logowania i przechowywania danych i jakie dane chce trzymać w sesji.

Odnośnik do komentarza
Udostępnij na stronach

No dobra, do pytania pomocnicze :) Bo chyba poszedłem trochę inną ścieżką. Skrypt jest prosty i krótki, więc pozwolę sobie go tu wkleić i poproszę Cię o ocenę bezpieczeństwa.

plik login.php

<?php
	session_start();
	session_destroy();
	
	$message=""; //wiadomość
	
	$login=$_POST['login'];
	if($login){
		$uzytkownik=trim($_POST['uzytkownik']);
		$md5_haslo=md5(trim($_POST['haslo']));
		
		
		//połączenie z bazą danych
		$host="localhost";
		$db_user="root";
		$db_password="";
		$database="okb";
		mysql_connect($host, $db_user, $db_password);
		mysql_select_db($database);
		mysql_query("SET NAMES UTF8");
		
		$rezultat = mysql_query("SELECT * FROM logowanie WHERE login='$uzytkownik' AND haslo='$md5_haslo'");
		$rekord = mysql_fetch_array($rezultat);
		$imie = $rekord[imie];
		$nazwisko = $rekord[nazwisko];
		$firma = $rekord[firma];
		
		if(@mysql_num_rows($rezultat)){
			session_register("uzytkownik");
			session_register("imie");
			session_register("nazwisko");
			session_register("firma");
			
			header("location:members.php");
			exit;
		}else{
			$message="Nieprawidłowa nazwa użytkownika lub hasło";
		}
	}
?>
<html>

<head>
<title>Strona logowania.</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8">
<meta http-equiv="content-style-type" content="text/css">
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>

<div id="wrap">
<?php include("header.html"); ?>
<form id="form1" name="form1" method="post" action="<?php echo $PHP_SELF; ?>">
	<div id="content-top"><h1>Zaloguj się!</h1></div>	
	<div id="content">
		<p><font color="red"><?php echo $message; ?></font></p>
		
			<p>
			<table>
				<tr>
					<td>Użytkownik: </td>
					<td><input name="uzytkownik" type="text" id="uzytkownik" /></td>
				</tr>
				<tr>
					<td>Hasło: </td>
					<td><input name="haslo" type="password" id="haslo" /></td>
				</tr>
			</table>
			</p>
			<hr />
			<p>
			<input name="login" type="submit" id="login" value="Zaloguj" />
			</p>
	</div>
	<div id="content-bottom"></div>
</form>
</div>
<?php include("footer.html"); ?>

</body>
</html>

plik members.php

<?php 
	session_start();
	if(!session_is_registered("uzytkownik")){
		header('Location: login.php');
	}
	
?>
<html>

<head>

<title>Strona V.I.P.</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8">
<meta http-equiv="content-style-type" content="text/css">
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>

<div id="wrap">
<?php include("header.html"); ?>

	<div id="content-top"><h1>Strona V.I.P.</h1></div>	
		<div id="content">
			<p>
				Witaj, <?php echo $_SESSION['uzytkownik']; ?>! Jesteś zalogowany.<br />
				Twoje dane to: <?php echo $_SESSION['imie']." ".$_SESSION['nazwisko']; ?>.<br />
				Twoja firma to: <?php echo $_SESSION['firma']; ?><br />
				<a href="login.php">Wyloguj</a>
			</p>
			<?php echo $message; ?>
		</div>
	<div id="content-bottom"></div>
	
</div>
<?php include("footer.html"); ?>

</body>
</html>

Strona do której nie ma dostępu to members.php, ale jeżeli ktoś jest niezalogowany, to poprostu na początku przekierowuje tego kogoś do strony login.php.

Ogólnie zaciekawiło mnie szyfrowanie sho, mógłbyś napisać coś więcej na ten temat ??

Odnośnik do komentarza
Udostępnij na stronach

SHA to mocniejszy algorytm po prostu, mdp dzięki kartom graficznym można łamać metodą brutal force, jak wycieknie baza z hasłami do szyfrujesz różne kombinacje hasła i porównujesz z bazą, w końcu trafisz na taką która pasuje. I nie koniecznie to musi być nawet to hasło, które podał użytkownik. Najlepiej dodawać do haseł jakiś stały string, dzięki temu wyciek samej bazy uniemożliwia złamanie hasła, bo łamacz nie będzie wiedział, że system coś dodaje. Jednak to nie pomoże w przypadku wycieku kodu.

SHA ma dużo dłuższe klucze, przykład SHA 512

13f5d08c8dc2122249b3bb53ca05fe915bcf3643ba64fafbf01c0272054af59a3d5c4e320199396e21c6556cafb60cd4384b5278005d0d3b75332098af7114d8

a to md5

59b466fd93164953e56bdd1358dc0044

a używanie jest podobne piszesz hash("sha512", $text); ja tak uzyskuje klucz, jak chcesz krótszy klucz to możesz użyć funkcji sha1($text);

f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0

Ale generalnie jak piszesz jakąś aplikację w zasadzie od podstaw to ja Ci radzę zainteresować się framewokiem, początkowo spowolni prace, bo trzeba się go nauczyć, ale kod jest łatwiejszy w utrzymaniu.Czasem można skożystać z gotowych modułów, na przykład ja kiedyś użyłem modułu zarządzania uprawnieniami. Teraz będę pisał swój, pod własne potrzeby, ale wtedy oszczędził mi sporo pracy.

Ja korzystam z Yii, ten filmik pokaże Ci jak bardzo usprawniają one pracę

http://www.yiiframework.com/screencast/blog/

  • Like 1
Odnośnik do komentarza
Udostępnij na stronach

OK, wybrałem sha512 i... działa :) Dzięki.

Jeżeli chodzi o czasochłonną naukę php, to z przykrością muszę podziękować, bo przerobię tylko tą stronkę, zabronię dostępu do niektórych jej zasobów i wracam do JEE. Wiesz, nie chce sobie zaśmiecać głowy, bo i tak nie zamierzam nigdy zawodowo programować w php.

No i jeszcze pytanko... reszta kodu jest w porządku ?? Czy trzeba go jeszcze w jakiś sposób zabezpieczyć, na przykład przed SQL injection lub innymi atakami?

Odnośnik do komentarza
Udostępnij na stronach

Na pewno warto przed sql injection przez sprawdzanie poprawności przesyłanych danych, jest jeszcze session hijacking, ale bez połączenia szyfrowanego ciężko się przed tym bronić. Jeśli haker przejmie czyiś numer sesji to jest problem, a masakrą jest jak przejmie numer sesji administratora, ale to problem raczej większych stron internetowych. Zresztą tu też przydatne okazują się szkielety aplikacji, bo one w pewnym stopniu już się takimi problemami zajmują, no i więcej ludzi pracuje nad ewentualnym wykrywaniem i naprawianiem bugów.

Odnośnik do komentarza
Udostępnij na stronach

Gość
Ten temat jest zamknięty i nie można dodawać odpowiedzi.
×
×
  • Dodaj nową pozycję...