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

Kurs PHP odc. 3: Formularz rejestracji. Captcha. Hashowanie haseł

Object Storage Arubacloud
0 głosów
702 wizyt
pytanie zadane 6 stycznia 2018 w PHP przez Bartłomiej Bolesta Obywatel (1,630 p.)
Witam. Pierwszy raz szukam odpowiedzi na problem, a zaczynałem od C++. Tym razem jednak kompletnie nie mogę sobie poradzić. Ostatnie 3h spędziłem na szukaniu błędów, wywalaniu całej bazy danych, a nawet reinstalacji Xaampa i nic nie pomaga.

W tym odcinku, wszystko idzie gładko do 1:06:00, gdy pokazana jest próba logowania, po zmianach w pliku zaloguj dotyczących hashowania. Gdy pliku nie ruszę (zakończę działanie na pliku rejestracji) - mogę się zalogować. Po wprowadzeniu zmian wyrzuca cały czas, że błędny login lub hasło. Plik wywalałem i wprowadzałem zmiany kilkukrotnie - tak na swoim pliku jak i pobranym z bloga.Za każdym razem to samo. Poustawiałem sobie nawet dokładnie składnie w dwóch plikach, aby zobaczyć natychmiast wszystkie różnice w dwóch plikach, nakładając na siebie dwa okna i nie ma żadnych błędów. Na koniec wrzuciłem również całą paczką z bloga i nic to nie dało. Pomimo, że to oryginalne pliki. Również nie dawało żadnego efektu, gdy pomijałem hashowanie zostawiając w bazie oryginalne hasło - qwerty.

Poszukiwania odpowiedzi dały taki rezultat, że znalazłem informację, że ktoś miał podobny problem, a rozwiązał to zmianą długości rekordu pass w bazie danych do 255 znaków. Zrobiłem tak samo, ale o dziwo nie chce mi się to tak zapisać, nawet dla dwóch znaków.. Tzn. po wykonaniu. pole pozostaje puste. Zmieniłem więc na varchar i 255 znaków się zapisało, ale nic to nie dało. Inne też nie.

Kompletnie już nie mam pomysłu co może być nie tak. Kodu nie wrzucam, bo nie ma sensu, skoro oryginał z bloga też nie działa.
komentarz 6 stycznia 2018 przez Ehlert Ekspert (212,670 p.)

To znak, że czas najwyższy złapać się za Symfony

komentarz 6 stycznia 2018 przez Bartłomiej Bolesta Obywatel (1,630 p.)
Ja szukam rozwiązania problemu, a nie jego obejścia.

1 odpowiedź

0 głosów
odpowiedź 6 stycznia 2018 przez efiku Szeryf (75,160 p.)
wybrane 9 stycznia 2018 przez Bartłomiej Bolesta
 
Najlepsza

1)

        //Bot or not? Oto jest pytanie!
        $sekret = "PODAJ WŁASNY SEKRET!";
        

Zrobione? Jeśli chodzi o capatche?

2)

Logowanie, usuń te małpy z kodu, jeśli masz włączone wyświetlanie błędów to może coś zobaczysz.

3)

https://developers.google.com/recaptcha/docs/faq
https://developers.google.com/recaptcha/docs/verify
https://developers.google.com/recaptcha/docs/domain_validation

If you would like to use "localhost" for development, you must add it to the list of domains.

Zrób edycję postu i napisz w punktach co zmieniłeś, wywal małpy z kodu, włącz w php.ini wyświetlanie błędów. Dlaczego? BO PRACUJESZ NIE NA PRODUKCJI. Na produkcji wyłączasz wyświetlanie błędów, a php loguje je do plików. I żadnych małp nie używasz. 

komentarz 6 stycznia 2018 przez Bartłomiej Bolesta Obywatel (1,630 p.)
Dziękuję za próbę pomocy, ale proszę przeczytać jeszcze raz mój pierwszy post. Problem nie leży, bo i nie może leżeć w kodzie.

Nie mniej:
1) (i w sumie 3 też) Nie bardzo rozumiem ten punkt? Generalnie w tym odcinku kursu zatrzymałem się na podanym czasie i nie szedłem dalej, skoro mam błąd, więc jeśli to będzie robione dalej to jeszcze tego nie zrobiłem, a nie mam okodowanej captchy. Jest to jednak kwestia rejestracji, a ja mam problem z logowaniem.. Dwa różne pliki. W dodatku jak napisałem w pierwszym poście - wszystko działa, dopóki nie przeprowadzę zmian w pliku logowania.

2) Koduje bez małp cały czas (dodawałem je tylko, gdy porównywałem kod 1 do 1). W tym rzecz, że nie wywala żadnych błędów (w konsoli również). Jedyne co to mój własny komunikat o tym, że login lub hasło sa niepoprawne.

Hmy. Teraz nie mam zbytnio możliwości, ale później spróbuję jeszcze zrobić zmiany w pliku logowania krok po kroku, o ile się da i zobaczę, po której linijce konkretnie, znika możliwość zalogowania.
komentarz 6 stycznia 2018 przez efiku Szeryf (75,160 p.)
fajnie by było jakbyś takie swoje zmiany też tu wrzucał. Trochę tak nie za bardzo rozumiem. Raz działa, potem nie działa. Nie wiem co ty tam zmieniasz, ale mam nadzieję, że rozumiesz jak działa password_hash i password_verify.
komentarz 6 stycznia 2018 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Problem się rozwiązał. Dosłownie, bo sam. Jak? Nie wiem. Nie mniej jednak, pozostawiam co napisałem. Można to ominąć i od razu przeczytać podsumowanie.
====================================================
Wszystko jest w pierwszym poście opisane. Ale powtarzam - i tak nie ma znaczenia co zmieniam względem niepoprawności kodu, bo jest on poprawny. Jeszcze raz:

1) Mam wszystko jak w odcinku kursu.
2) Czas kursu około : 1:04:00 - wszystko działa.
3) Pan Mirosław kończy zmiany w pliku rejestracji dotyczące hasowania i przechodzi do zmian w pliku dotyczącym logowania.
4) Dokonuję tych samych zmian w części o hashowaniu hasła (do 1:06:00). Sprawdzając kod 1 do 1.
5 Przestaje działać - czy zmienię ręcznie hasło na zahashowane w bazie czy nie to wyświetła "Nieprawidłowy login lub hasło!".

6) Dla weryfikacji - wrzucam cały content ściągnięty z bloga (wyrzucam swój folder osadnicy, wrzucam ten z bloga), odpalam i też nie działa. Więc problem nie jest kodzie, ani w błędach w bazie - bo również ją zastępuje tą z bloga.

A teraz, w którym momencie logowanie przestaje być możliwe:

1) Usuwam swój plik zaloguj.php
2) Wrzucam ten z odcinka trzeciego z bloga z folderu - "stan po 2 odcinku" (sprawdzam w tym momencie enty raz żeby nie było - udaje się zalogować).
Jego kod:
 

<?php

	session_start();
	
	if ((!isset($_POST['login'])) || (!isset($_POST['haslo'])))
	{
		header('Location: index.php');
		exit();
	}

	require_once "connect.php";

	$polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
	
	if ($polaczenie->connect_errno!=0)
	{
		echo "Error: ".$polaczenie->connect_errno;
	}
	else
	{
		$login = $_POST['login'];
		$haslo = $_POST['haslo'];
		
		$login = htmlentities($login, ENT_QUOTES, "UTF-8");
		$haslo = htmlentities($haslo, ENT_QUOTES, "UTF-8");
	
		if ($rezultat = @$polaczenie->query(
		sprintf("SELECT * FROM uzytkownicy WHERE user='%s' AND pass='%s'",
		mysqli_real_escape_string($polaczenie,$login),
		mysqli_real_escape_string($polaczenie,$haslo))))
		{
			$ilu_userow = $rezultat->num_rows;
			if($ilu_userow>0)
			{
				$_SESSION['zalogowany'] = true;
				
				$wiersz = $rezultat->fetch_assoc();
				$_SESSION['id'] = $wiersz['id'];
				$_SESSION['user'] = $wiersz['user'];
				$_SESSION['drewno'] = $wiersz['drewno'];
				$_SESSION['kamien'] = $wiersz['kamien'];
				$_SESSION['zboze'] = $wiersz['zboze'];
				$_SESSION['email'] = $wiersz['email'];
				$_SESSION['dnipremium'] = $wiersz['dnipremium'];
				
				unset($_SESSION['blad']);
				$rezultat->free_result();
				header('Location: gra.php');
				
			} else {
				
				$_SESSION['blad'] = '<span style="color:red">Nieprawidłowy login lub hasło!</span>';
				header('Location: index.php');
				
			}
			
		}
		
		$polaczenie->close();
	}
	
?>

2.1) Na podstronie rejestracji, tak jak w odcinku, zazwyczaj hashuje hasło qwerty123 i robię podmiankę w bazie. A teraz zahashowuje inne : 12345678, co daje: $2y$10$fx39TDy.zf5dgtE0cRMvce3sDBCCQKBOns4DOtKQPjHImQ3FlF23O . Phpmyadmin zwraca informację, że dokonano zmiany, a w odpowiednim miejscu rzeczywiście tą zmianę widać.
2.2) Na potrzeby poniższych testów, przywracam hasło qwerty

3) Dokonuje zmian w pliku zaloguj.php jak w odcinku:
a) Usuwam linijkę $haslo = htmlentities($haslo, ENT_QUOTES, "UTF-8"); - wciąż mogę się zalogować.
b) Zmieniam IFa: - wciąż mogę się zalogować.
 

if ($rezultat = @$polaczenie->query(
		sprintf("SELECT * FROM uzytkownicy WHERE user='%s' AND pass='%s'",
		mysqli_real_escape_string($polaczenie,$login),
		mysqli_real_escape_string($polaczenie,$haslo))))

na:

 

if ($rezultat = @$polaczenie->query(
		sprintf("SELECT * FROM uzytkownicy WHERE user='%s'",
		mysqli_real_escape_string($polaczenie,$login))))

c) Przenoszę linijkę $wiersz = $rezultat->fetch_assoc(); na początek IFa (aby nie dawać dwóch kodów w tak prostym punkcie po prostu ustawiam komentarz). - Logiczne, że dalej działa.

 

if ($rezultat = @$polaczenie->query(
		sprintf("SELECT * FROM uzytkownicy WHERE user='%s'",
		mysqli_real_escape_string($polaczenie,$login))))
		{
			$ilu_userow = $rezultat->num_rows;
			if($ilu_userow>0)
			{
				$wiersz = $rezultat->fetch_assoc();
				$_SESSION['zalogowany'] = true;
				//$wiersz = $rezultat->fetch_assoc();
				$_SESSION['id'] = $wiersz['id'];
				$_SESSION['user'] = $wiersz['user'];
				$_SESSION['drewno'] = $wiersz['drewno'];
				$_SESSION['kamien'] = $wiersz['kamien'];
				$_SESSION['zboze'] = $wiersz['zboze'];
				$_SESSION['email'] = $wiersz['email'];
				$_SESSION['dnipremium'] = $wiersz['dnipremium'];
				
				unset($_SESSION['blad']);
				$rezultat->free_result();
				header('Location: gra.php');
				
			}

d) Dopisuję weryfikację hasha pod linijką z poprzedniego punktu:
if (password_verify($haslo, $wiersz['pass'])) - w tym momencie nie mogę się już zalogować, więc wracam do punktu 2.1 i wpisuje hashowane hasło, w efekcie - nadal mogę się zalogować.

e) Do powyższego IFa dodaje klamry (+ wcięcie) co daje: - logowanie nadal działa.

				if (password_verify($haslo, $wiersz['pass']))
				{
					$_SESSION['zalogowany'] = true;
					//$wiersz = $rezultat->fetch_assoc();
					$_SESSION['id'] = $wiersz['id'];
					$_SESSION['user'] = $wiersz['user'];
					$_SESSION['drewno'] = $wiersz['drewno'];
					$_SESSION['kamien'] = $wiersz['kamien'];
					$_SESSION['zboze'] = $wiersz['zboze'];
					$_SESSION['email'] = $wiersz['email'];
					$_SESSION['dnipremium'] = $wiersz['dnipremium'];
					
					unset($_SESSION['blad']);
					$rezultat->free_result();
					header('Location: glowna.php');
				}


f) Dodaje else do powyższego IFa, kopiując już istniejący, a dodatkowo w wyświetlanym tekście dodaje literkę A, żeby było widać, który else będzie się pojawiał na ekranie. - Nadal działa.

 

					unset($_SESSION['blad']);
					$rezultat->free_result();
					header('Location: glowna.php');
				}
				
				else 
				{
					$_SESSION['blad'] = '<span style="color:red">A : Nieprawidłowy login lub hasło!</span>';
					header('Location: index.php');
				}

====================================================
KONIEC. Po sprawdzaniu krok po kroku wszystko działa. W stosunku do wszystkich poprzednich testów, w tym zrobiłem jedną rzecz inaczej. Zahashowałem inne hasło. Zmieniłem teraz znów na zahashowane qwerty123 i też działa.

Wywaliłem plik zaloguj.php i po kolei wrzucałem wszystkie wcześniejsze próby (każdą zachowałem). Wszystkie działają, pomimo, że wcześniej nie. Nie wiem co się wydarzyło, bo przecież nic nie zmieniłem. Czy baza danych mogła się jakoś zafiksować z powodu mieszanego hasła qwerty123 i "przeczyściła" się po ustanowieniu tylko liczbowego?

W stosunku do poprzednich prób zaszła jeszcze jedna zmiana - w międzyczasie przerobiłem odcinek drugi MySQLa, gdzie dodałem nową bazę - księgarnia. Nie mniej jednak, wcześniej wywalałem wszystko, jak i również reinstalowałem Xamppa, więc nie powinno być to żadnym istotnym czynnikiem.

komentarz 7 stycznia 2018 przez efiku Szeryf (75,160 p.)
edycja 7 stycznia 2018 przez efiku

Możliwe, że miałeś jakiś dodatkowy znak w haśle, lub problem leżał po prostu w password_verify, gdzie nie mógł sprawdzić hash'a. Zdaj sobie sprawę, że php się fiksuje na Windowsach, dlatego zawsze się stawia na linuxie ;) 

W następnych odcinkach na szczęście Zelent przechodzi do PDO, co bardzo ułatwi Ci pracę. Nie myśl, że po tych odcinkach już będziesz umiał, przeczytaj uważnie moją propozycję. 

Jeśli się uczysz i jesteś studentem, to zostaw Notepad++ i sięgnij po to: https://www.jetbrains.com/shop/eform/students
Skan karty / legitymacji szkolnej  lub mail na x.edu.pl da Ci dostęp do wszystkich narzędzi JetBrains z których do PHP pobierz PHPStorm. Kilka odcinków na yt, trochę własnej inicjatywy i do nauki PHP'a będziesz miał idealnie, bo inteligentne skanowanie tego co naskrobałeś ładnie pokazuje gdzie są błędy.  (PS: Program oferuje full trial na 30 dni, warto wykorzystać zanim się zrobi zgłoszenie o licencje EDU)
Na początku nauki poprowadzi Cię za rączkę, z czasem jak opanujesz to nie będzie Ci potrzebna myszka ;)

 

 

Moja propozycja:

> Zacznij czytać manual, skup się na tym do czego jest dana funkcja, co zwraca i zerkaj na przykłady.

> zrób sobie sam system zaloguj i zarejestruj w oparciu o PDO. password hash przy rejestracji i password_verify przy logowaniu. Logowanie zrób za pomocą email, który dasz w bazie unikalny a w zaloguj.php daj sobie SELEC login,password from customers WHERE login = :login,  zobacz, jest bindowanie. 
> wykorzystaj do filtrowania danych przekazanych przez użytkownika filter_input. Tak, sięgaj po manual i przykłady.

> Pamiętaj, błędy u siebie na lokalnym miej włączone w php.ini i nie używaj małp. To nie produkcja byś się musiał głowić i dodawać sobie problemów :P 

> tylko i wyłącznie prosty system logowania i rejestracji, potem dorzucisz sobie sesje, później jeszcze coś.

> To wszystko zrób już na zainstalowanym PHPStormie. Wskaż mu interpreter (php.exe) i wybierz odpowiednią wersję. Jeśli nie lubisz dłubać w php + html  czyli tzw spagetti to PHPStorm oferuje tam pobranie composer.phar, możesz pooglądać jak używać composera i pobrać twiga. (  php composer.phar require twig/twig ) 

https://www.youtube.com/watch?v=TejBj_N-3rI

Piszę z własnego doświadczenia ;)

komentarz 7 stycznia 2018 przez Bartłomiej Bolesta Obywatel (1,630 p.)
Tyle ile razy ustanawiałem hasło i je hashowałem, że to nie możliwe, żebym za każdym razem jakiś błąd przy nim zrobił. A i tak mocno się upewniałem czy dobrze wpisuje. Musiało się coś zafiksować.
Przeraża mnie lekko, że będę się musiał w końcu przeprosić z linuksami. Dwa razy kiedyś podchodziłem i nie mogłem się przemóc ;D.

Generalnie się już zastanawiałem jak to dalej obrobić, jak się skończą odcinki, bo zdaje sobie sprawę, że może za 5 lat to wyjdzie ich wystarczająco :D. Ale póki co, to od htmla 1 robię sobie na boku projekt z tego co się nauczę (chociaż ostatnio to częściej zostawiam, bo zdaje sobie sprawę, że pewne rzeczy to już nie to co powinno się stosować) i tak brnę sobie powoli do przodu.

 

Wiem, młodo wyglądam, ale ja już dawno po czasie, kiedy nawet legitkę mógłbym wykorzystać do zniżek ;D.
komentarz 8 stycznia 2018 przez efiku Szeryf (75,160 p.)
. Ale póki co, to od htmla 1 robię sobie na boku projekt z tego co się nauczę (chociaż ostatnio to częściej zostawiam, bo zdaje sobie sprawę, że pewne rzeczy to już nie to co powinno się stosować) i tak brnę sobie powoli do przodu.

To już zdecydowanie nie to co powinno się stosować ;P

http://www.phptherightway.com/

Podobne pytania

0 głosów
1 odpowiedź 553 wizyt
pytanie zadane 30 listopada 2018 w PHP przez marcolo Obywatel (1,530 p.)
0 głosów
0 odpowiedzi 278 wizyt
pytanie zadane 11 marca 2018 w PHP przez PolYGlok Pasjonat (19,450 p.)
+1 głos
0 odpowiedzi 245 wizyt
pytanie zadane 3 marca 2019 w PHP przez polonez11212 Początkujący (350 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...