• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Co powiecie o tym systemie rejestracji i logowania? [ankieta]

VPS Starter Arubacloud
+1 głos
789 wizyt
pytanie zadane 3 czerwca 2015 w Nasze projekty przez makoso Mądrala (7,380 p.)
<?
    $host     ="localhost";
    $user     ="root";
	$db        ="test";
	$pass     ="";
	try
	{
		$polacz  = NEW PDO("mysql:host=" . $host . ";dbname=" . $db, $user, $pass);
        if($polacz)
		{
			$polaczenie=1;
		}
        else
		{
			$polaczenie=0;
		}			
	}
	catch (PDOException $e)
	{
		Echo 'wystąił błąd';
	}	
?>
<!DOCTYPE html>
  <html>
       <head>
	   <meta charset="utf-8"/>
	   </head>
	<body>
	    <form method="post" action="#">
            Imie:<input type="text" name="imie"/><br/>	
            haslo:<input type="password" name="haslo"/><br/>	
            wiek:<input type="text" name="wiek"/><br/>	
        	<input type="submit" value="dodaj"/>
	    </form>
	    <br/>
	    Wyniki:<br/>
	    <table>
<?
	if($polaczenie==1)
	{
	    $q=$polacz->query("SELECT * FROM test");
		while($r=$q->fetch(PDO::FETCH_OBJ))
		{
			echo '<tr><td>'.$r->imie.'</td><td>'.$r->wiek.'</td></tr>';
		}
	}
?>
    	</table>
    	</br>
    	ZALOGUJ się
    	<form method="post" action="#">
            Imie:<input type="text" name="login"/><br/>	
            haslo:<input type="password" name="pass"/><br/>	
        	<input type="submit" value="zaloguj"/>
    	</form>
	</body>
</html>	
<?
	if($polaczenie==1)
	{	
	    if(isset($_POST['imie']))
		{
			$imie        =$_POST['imie'];
			$wiek       =$_POST['wiek'];
			$haslo      =$_POST['haslo'];
			$haslo      =md5($haslo);
			$qu          ="INSERT INTO test(imie, wiek, haslo) VALUES(:imie, :wiek, :haslo)";
			$query     =$polacz->prepare($qu);
			$wykoncz =$query->execute(array(
			":imie"      =>$imie,
			":wiek"     =>$wiek,
			":haslo"    =>$haslo
			));
		}
		if(isset($_POST['login']))
		{
			$login   =$_POST['login'];
			$pass   =$_POST['pass'];
			$pass   =md5($pass);			
			 $q       =$polacz->query("SELECT haslo FROM test WHERE imie='$login' ");
		        while($r=$q->fetch(PDO::FETCH_OBJ))
		        {
			    $haslo=$r->haslo;
				    if($haslo == $pass)
				    {
					    $wynik=1;
					    break;
				    }
					else
					{
					    $wynik=0;	
					}
		        }
				if($wynik == 0 OR !isset($wynik))
				{
					$wynik=0;
				}
				if($wynik==1)
				{
				echo 'Zostałeś zalogowany';				
				}
				if($wynik==0)
				{
					echo 'Podałeś błędne dane do logowania';
				}
				
        }
	}
?>
	

 

Możliwe odpowiedzi:
Dobrze zrobione (0 głosów)
Źle zrobione (1 głos, 33%)
Bardzo źle zrobione (2 głosów, 67%)
Ankieta zamknięta

1 odpowiedź

+6 głosów
odpowiedź 3 czerwca 2015 przez Comandeer Guru (604,400 p.)
wybrane 3 czerwca 2015 przez makoso
 
Najlepsza

Niestety, ale ten skrypt jest bardzo źle zrobiony. 

  • Obecnie w PHP powinno się zawsze stosować <?php, nie <? (wyjątkiem jest konstrukcja <?=$zmienna;?>) - od wersji bodaj 5.4 styl krótki znaczników otwierających został po prostu usunięty z PHP; tym samym na moim serwerze wgl tego kodu nie odpalę
  • Połączenie z bazą danych to nie jest część skryptu logowania. To jest… połączenie z bazą danych ;) W Twoim wypadku wydzieliłbym to do osobnego pliku
  • if($polacz)
            {
                $polaczenie=1;
            }
            else
            {
                $polaczenie=0;
            }

    Ta konstrukcja jest niepotrzebna. Jeśli połączenia nie ma, to przecież PDO rzuci Ci wyjątkiem

  • Inna rzecz, że nie ustawiasz sobie obsługi błędów na wyjątki - tu masz IMO najlepszą możliwą konfigurację startową PDO: http://stackoverflow.com/a/60496

  • HTML wywaliłbym jako szablon do oddzielnego pliku. Wgl poczytałbym o podziale warstw aplikacji. Warto zacząć od modelu MVC, bo jest najpopularniejszy: http://www.forumweb.pl/viewtopic.php?t=56527http://www.forumweb.pl/porady-i-tutoriale-www/php-php-light-mvc,56553
    Oczywiście, żeby ogarnąć MVC trzeba mieć wiedzę o OOP w PHP, więc być może to jeszcze zbyt wiele. Ale warto mieć świadomość, że aplikację należy rozdzielać na warstwy

  • Jeśli już jesteśmy przy HTML: label to podstawa! Każde pole (oprócz przycisku) powinno mieć etykietkę. I to jest de facto wymóg - https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label

  • No i do wieku to warto może pole typu number wykorzystać ;)

  • Co do tabelek - warto mieć świadomość istnienia thead i th. Tu masz ABSOLUTNIE WSZYSTKO o tabelach, co kiedykolwiek może Ci się przydać ;) https://css-tricks.com/complete-guide-table-element/

  • if(isset($_POST['imie']))

    Raczej dodałbym nowe pole [type=hidden] o nazwie akcja i na podstawie jego wartości sprawdzał co trza zrobić. A sam fakt wysłania formularza sprawdzałbym przez sprawdzenie wartości $_SERVER['REQUEST_METHOD']. Ale IMO to już bardziej preferencja - dla mnie jest tak czytelniej.

  • Bardzo dobrze, że korzystasz z prepared statements! Jak je poprawić, to sprawdź w linku do SO, który rzuciłem na początku ;)

  • Bardzo źle, że hasła hashujesz przez md5! Obecnie to kilka sekund łamania (patrz: tablice tęczowe). Od PHP 5.5 powinno się stosować duet password_hash + password_verify, które korzystają z bcrypt jako algorytmu (inny polecany i AFAIK nawet silniejszy to scrypt). W starszych PHP (od 5.3 - reszta to trupy) należy korzystać z password_compat: https://github.com/ircmaxell/password_compat

  • No i brakuje jakiegokolwiek działania po zalogowaniu - tutaj trza by pomyśleć o zapisaniu czegoś do sesji itd ;)

komentarz 3 czerwca 2015 przez efiku Szeryf (75,160 p.)
Moze chodzi mu o register error handler? :-)
komentarz 3 czerwca 2015 przez Comandeer Guru (604,400 p.)

Jeśli już to w tym wypadku bardziej nam się przyda: http://php.net/set_exception_handler ;) Z tym, że filozofia działania jest taka sama, jak w wypadku bloku try/catch

komentarz 6 czerwca 2015 przez makoso Mądrala (7,380 p.)

Poprawiłem troche (tak mi się najwyzej wydaję:) )
nie zmieniałem html-a bu chcę zrobić skrypt php potem się html zajmę nie kumam mvc więc robię "po swojemu"

jak możecie oceńcie to:

rejestracja.php

<?php include('baza.php'); ?>
<?php //REJESTRACJA UŻYTKOWNIKA
        if(!empty($_POST['nick']) AND !empty($_POST['haslo'])  AND !empty($_POST['email']) )
        {
            $nick                 =$_POST['nick'];
            $email               =$_POST['email'];
            $qu     ="SELECT * FROM uzytkownik WHERE nick= :nick ";
            $stmt = $polacz->prepare($qu);
            $stmt->bindParam(':nick', $nick, PDO::PARAM_STR);
            $stmt->execute();
            $ln = $stmt->rowCount();
            $qua    ="SELECT * FROM uzytkownik WHERE email= :email ";
            $stmta = $polacz->prepare($qua);
            $stmta->bindParam(':email', $email, PDO::PARAM_STR);
            $stmta->execute();
            $lm = $stmta->rowCount();			
            if($ln==0 AND $lm==0)
			{				
                $haslo               =password_hash($_POST['haslo'], PASSWORD_DEFAULT);
		    	$S                     ='0123456789abcdef0123456789ghijklmno0123456789pqrstuvwxyz0123456789';
                $klucz                =str_shuffle($S);
		    	$weryfikacja       =0;
                $qu                    ="INSERT INTO uzytkownik(nick, email, haslo, klucz, weryfikacja) VALUES(:nick, :email, :haslo, :klucz, :weryfikacja)";
                $query               =$polacz->prepare($qu);
                $wykoncz           =$query->execute(array(
                ":nick"                =>$nick,
                ":email"              =>$email,
                ":haslo"              =>$haslo,
		    	":klucz"              =>$klucz,
                ":weryfikacja"     =>$weryfikacja
                ));				
		        $qub    ="SELECT * FROM uzytkownik where nick= ? AND email= ? ";
                $q = $polacz->prepare($qub);
                $q->bindParam(1, $nick, PDO::PARAM_STR);
                $q->bindParam(2, $email, PDO::PARAM_STR);
                $q->execute();				
		    		while($r=$q->fetch(PDO::FETCH_OBJ))
		    		{$id=$r->id_gracz;}
                $email=$_POST['email'];
                $tytul         = "Potwierdź swoją rejstrację w gra-wieków.pl"; 
                $tresc        = 'Aby potwierdzić rejestrację w gra-wiekow.pl kliknij poniższy link:'.PHP_EOL.'http://www.moja-gra.esy.es/index.php?pl='.$id.'&k='.$klucz;
                $naglowki  = "From: rejestracja@gra-wiekow.pl <rejestracja@gra-wiekow.pl>".PHP_EOL."Reply-To: rejestracja@gra-wiekow.pl <rejestracja@gra-wiekow.pl>".PHP_EOL; 
                mail($email, $tytul, $tresc, $naglowki);
				header('Location: http://www.moja-gra.esy.es/index.php?blad=brak');
	        }
			elseif($ln > 0)
			{
				header('Location: http://www.moja-gra.esy.es/index.php?blad=nick');
			}
			elseif($lm > 0)
			{
				header('Location: http://www.moja-gra.esy.es/index.php?blad=mail');
			}
		}		
		elseif(empty($_POST['email']))
		{
			header('Location: http://www.moja-gra.esy.es/index.php?blad=email');
		}
		elseif(empty($_POST['haslo']))
		{
			header('Location: http://www.moja-gra.esy.es/index.php?blad=haslo');
		}		
		elseif(empty($_POST['nick']))
		{
			header('Location: http://www.moja-gra.esy.es/index.php?blad=login');
		}	
		
?>

 

index.php

<?php include('baza.php'); ?>
<?php
        if(isset($_GET['blad']))
		{
			$blad=htmlspecialchars(htmlentities($_GET['blad']));
			if($blad == 'mail')
			{
				echo 'Podany przez Ciebie adres e-mail jest już zajęty';
			}
			elseif($blad=='nick')
			{
				echo 'Podany przez Ciebie nick jest już używany w grze';
			}
			elseif($blad=='email')
			{
				echo 'Nie podałeś adresu e-mail proces rejestracji nie mógł zostać ukończony';
			}
			elseif($blad=='login')
			{
				echo 'Nie podałes nicku w jaki sposób inni rozpoznają Cię w grze?';
			}
			elseif($blad=='haslo')
			{
				echo 'Podaj hasło aby kolega nie skasował Ci konta';
			}
			elseif($blad=='brak')
			{
				echo 'Pomyślnie zarejestrowano!</br>Sprawdź swój e-mail aby potwierdzić rejestrację!';
			}
		}
	echo '<form method="post" action="rejestracja.php">
            nick:<input type="text" name="nick"/><br/>  
            haslo:<input type="password" name="haslo"/><br/>    
            email:<input type="text" name="email"/><br/>  
            <input type="submit" value="Zarejestruj się"/>
            </form>';
?>
<?php //WERYFIKACJA KONTA
if(isset($_GET['pl']) AND isset($_GET['k']))
		{
			$gracz=htmlspecialchars(htmlentities($_GET['pl']));
			$klucz=htmlspecialchars(htmlentities($_GET['k']));
			$weryfikacja=1;
            $polacz->query("UPDATE uzytkownik SET weryfikacja = '$weryfikacja' WHERE id_gracz = '$gracz' AND klucz = '$klucz' LIMIT 1");
		}
?>

 

komentarz 6 czerwca 2015 przez Comandeer Guru (604,400 p.)

Jest zdecydowanie lepiej!

  • Zamiast zapytań sprawdzających czy user o danym nicku i haśle istnieje w bazie można po prostu zastosować na tych polach klucze UNIQUE (ale na każdym osobno; w phpmyadmin jak się zaznaczy dwa pola naraz i zrobi klucz to nałoży klucz na parę, a nie o to chodzi) - wówczas baza rzuci błąd, gdy będziemy chcieli dodać usera, którego nazwa czy e-mail jest już w bazie. Nawet jeśli wolisz zapytania, to warto tak ustawić te klucze.
  • Jak wstawisz usera do bazy to nie pobieraj tego rekordu tylko po to, by wyciągnąć id. Od tego jest dedykowana funkcja: http://php.net/manual/en/pdo.lastinsertid.php
  • Obsługę formularza zrobiłbym całą w jednym pliku, błędy pokazując obok pól formularza. O wiele większa wygoda niż obecnie
  • label dalej nie ma ;)
  • Czemu weryfikacja konta nie jest już na prepared statements? htmlspecialchars (które robi to samo, co htmlentities, więc nie ma sensu tych funkcji łączyć) nie zabezpiecza przed SQLi. Wszędzie, gdzie do bazy wkłada się dane pochodzące od usera, powinny być prepared statements
komentarz 7 czerwca 2015 przez makoso Mądrala (7,380 p.)
1- pomyślę o tym ale chyba zostanę przy tym co mam ma dużo ifów od tego ;)

2-zapomniałem o tym

3-tak zrobię :)

4-mówiłem tylko skrypt html będzie później :)

5-mały kruczek bo edytowałem zapytania a tutaj zapomniałe mzmienić ale będzie tak jak powinno :)

wielkie dzięki za pomoc :)

Podobne pytania

+1 głos
4 odpowiedzi 2,271 wizyt
pytanie zadane 25 kwietnia 2015 w C i C++ przez Marcin Szczodry Nowicjusz (210 p.)
–4 głosów
1 odpowiedź 900 wizyt
pytanie zadane 21 października 2016 w PHP przez Warzywo Gaming Początkujący (320 p.)
0 głosów
2 odpowiedzi 230 wizyt
pytanie zadane 7 lutego 2018 w SQL, bazy danych przez Hardwell Dyskutant (8,980 p.)

92,843 zapytań

141,782 odpowiedzi

320,858 komentarzy

62,174 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...