Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Logowanie. While powiela komunikat...
Bureau
post 10.04.2012, 01:12:01
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 18.03.2012

Ostrzeżenie: (0%)
-----


Siemanko.

Napisałem sobie prosty skrypt logowania.
Skrypt po zalogowaniu przekierowywuje na index2.php poprzez header().
Niestety gdy używam else aby wyświetlić niepowodzenie operacji, to while mi powiela komunikat.
Dzieje się chyba dlatego ponieważ sprawdzam dwie zmienne ? Nie wiem dokładnie.

Kod przedstawia się następująco:
  1. <?php
  2. if (isset($_POST['submit'])) {
  3. $conn = mysqli_connect("localhost", "", "", "test");
  4.  
  5. $login = $_POST['login'];
  6. $haslo = $_POST['haslo'];
  7.  
  8. $zapytanie = "SELECT * FROM uzytkownicy";
  9. $data = mysqli_query($conn, $zapytanie) or die("MySQL error: " . mysqli_error($conn) . "<hr>\nQuery: $zapytanie");
  10.  
  11. if ($zapytanie) {
  12. while ($row = mysqli_fetch_array($data)) {
  13. if ($login == $row['login'] || $haslo == $row['haslo']) {
  14.  
  15. $_SESSION['zalogowany'] = true;
  16. header("location:index2.php");
  17.  
  18. }
  19. else {
  20. ?>
  21. Niepoprawne dane. Zaloguj sie ponownie!
  22. <a href="logowanie.php" >Logowanie</a>
  23. <?
  24. }
  25.  
  26.  
  27. }
  28.  
  29.  
  30. }
  31.  
  32. }
  33. else {
  34. ?>
  35.  
  36. <form action="logowanie.php" method="post" />
  37. <input name="login" />
  38. <input name="haslo" />
  39. <input type="submit" name="submit" value="Zaloguj" />
  40. </form>
  41.  
  42. <?php
  43. }
  44. ?>


Komunikat:
Kod
Niepoprawne dane. Zaloguj sie ponownie!
<a href="logowanie.php" >Logowanie</a>


Zostaje powielany.
Wiem że jest on w petli, ale jak jest gdzie indziej to nie działa smile.gif
Chciałem zastosować też header(), ale wtedy nawet gdy podam poprawne dane w formularzu to przekierowuje mnie na logwanie.php bez sesji...

Da sie to jakos inaczej wyświetlić ? Próbowałem foreach, ale niestety dzialania tej instrukcji nie kumam do końca.

Dzięki za odpowiedzi smile.gif

Pozdrawiam!
Go to the top of the page
+Quote Post
kaktus283
post 10.04.2012, 02:05:23
Post #2





Grupa: Zarejestrowani
Postów: 47
Pomógł: 2
Dołączył: 26.03.2010

Ostrzeżenie: (0%)
-----


A przypadkiem linia 14 nie powinna wyglądać o tak ?
  1. if( $login == $row['login'] && $haslo == $row['haslo'] ) {
Go to the top of the page
+Quote Post
Damonsson
post 10.04.2012, 03:16:29
Post #3





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


A do czego służy Ci ten while w 13 linijce?
Go to the top of the page
+Quote Post
camikazee
post 10.04.2012, 08:43:42
Post #4





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Dziwny skrypt, podglądałeś w internecie jak "prawidłowo" wykonać skrypt logowania? Po co pobierać wszystkich userów z bazy i w pętli sprawdzać czy pasuje hasło i login do któregoś?
Przykładowo:
  1. $zapytanie = "SELECT * FROM uzytkownicy WHERE login = '".$_POST['login']."' AND haslo = '".$_POST['haslo']."'";

Oczywiście pomijam kwestię bezpieczeństwa powyższego kodu. Kolejna sprawa, koduj hasła choćby w MD5.
A teraz ostatnia kwestia, zobacz masz w bazie 100 userów, logujesz, 99 pierwszych nie pasuje do szukanego login, hasło, więc wyświetli komunikat o błędzie, setny zaś pasuje, ale przekierowania już nie zrobi, bo wyświetlił informacje o wcześniejszym błędzie.

Ten post edytował camikazee 10.04.2012, 11:54:58


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
Bureau
post 10.04.2012, 10:32:13
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 18.03.2012

Ostrzeżenie: (0%)
-----


Cytat(kaktus283 @ 10.04.2012, 03:05:23 ) *
A przypadkiem linia 14 nie powinna wyglądać o tak ?
  1. if( $login == $row['login'] && $haslo == $row['haslo'] ) {


To chyba nic nie zmienia ? smile.gif Było też && i był (tak mi sie wydaje) ten sam efekt smile.gif

Cytat
A do czego służy Ci ten while w 13 linijce?


Ten while ? Tak szczrze to chciałbym się go pozbyć, bo to takie moje przyzwyczajenie w pisaniu wyświetlania biggrin.gif
Jakim sposobem mogę inaczej to zapisać aby nie była to pętla ? Bo zdaje mi się że to ona powiela mi komunikat i są same problemy...

Cytat
Dziwny skrypt.
Oczywiście pomijam kwestię bezpieczeństwa powyższego kodu. Kolejna sprawa, koduj hasła choćby MD5.
A teraz ostatnia kwestia, zobacz masz w bazie 100 userów, logujesz, 99 pierwszych nie pasuje do szukanego login, hasło, więc wyświetli komunikat o błędzie, setny zaś pasuje, ale przekierowania już nie zrobi, bo wyświetlił informacje o wcześsiejszym błędzie.


Co do bezpieczeństwa to wiem, jest paskudnie, ale to tak na szybko pisany z pamięci kod.
Ucze sie php, wiem tez ze w md5 koduje sie hasla do bazy i odwrotnie smile.gif to na to przyjdzie czas smile.gif na razie trenuje sobie tongue.gif
Twoje zapytanie miałem wbite w kod, ale nie działało bo nie dawałem chyba średników biggrin.gif

Jak mogę to zrobić bez pętli ? Po prostu po wykonaniu zapytania zamiast while dać:

  1. if ($zapytanie) { ...


?

Pozdrawiam!

Ten post edytował Bureau 10.04.2012, 10:33:34
Go to the top of the page
+Quote Post
camikazee
post 10.04.2012, 12:01:20
Post #6





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Trzeba zacząć od analizy gotowych kodów i przyjąć pewną logikę.
Postaram się Tobie wytłumaczyć jak to powinno wyglądać.

1. Pobieram od użytkownika login oraz hasło
2. Sprawdzam jednym zapytaniem czy istnieje w bazie user o takim loginie i takim haśle
3. Istnieje, to przekierowuję, nie wyświetlam błąd

U Ciebie jest tak
1. Pobieram wszystkich użytkowników z bazy
2. Sprawdzam czy do któregoś pasuje login lub hasło (ta zasadnicza różnica pomiędzy || a && - || oznacza że obojętnie który warunek musi być spełniony czyli w Twoim przypadku wystarczy, że znajdzie uzytkownika o danym loginie lub danym haśle i nie muszą wcale one pasować do siebie, && oznacza, że szuka usera, który ma login jakiś tam i hasło przypisane i oba warunki muszą być spełnione)
3. Dla każdego użytkownika pobranego, jeżeli hasło i login nie pasują wyświetlam błąd

Widzisz różnicę?

Po co pobierać wszystkich użytkowników, jak szukasz tylko jednego?
I pamiętaj, jak coś nie działa, to nie dlatego, że jest złe w swym założeniu, tylko Ty źle to zbudowałeś.

Ten post edytował camikazee 10.04.2012, 12:03:33


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
-md5_jest_slabe-
post 10.04.2012, 13:11:02
Post #7





Goście







md5 na obecne standardy jest uznawany za słaby algorytm hashujący i ma dość rozbudowaną bazę hashy, więc nie należy go stosować

https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet

zainteresuj się raczej PHPass używanym przez wordpress, phpbb3 i inne duże skrypty
Go to the top of the page
+Quote Post
Bureau
post 10.04.2012, 13:23:56
Post #8





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 18.03.2012

Ostrzeżenie: (0%)
-----


Cytat(camikazee @ 10.04.2012, 13:01:20 ) *
Trzeba zacząć od analizy gotowych kodów i przyjąć pewną logikę.
Postaram się Tobie wytłumaczyć jak to powinno wyglądać.

1. Pobieram od użytkownika login oraz hasło
2. Sprawdzam jednym zapytaniem czy istnieje w bazie user o takim loginie i takim haśle
3. Istnieje, to przekierowuję, nie wyświetlam błąd

U Ciebie jest tak
1. Pobieram wszystkich użytkowników z bazy
2. Sprawdzam czy do któregoś pasuje login lub hasło (ta zasadnicza różnica pomiędzy || a && - || oznacza że obojętnie który warunek musi być spełniony czyli w Twoim przypadku wystarczy, że znajdzie uzytkownika o danym loginie lub danym haśle i nie muszą wcale one pasować do siebie, && oznacza, że szuka usera, który ma login jakiś tam i hasło przypisane i oba warunki muszą być spełnione)
3. Dla każdego użytkownika pobranego, jeżeli hasło i login nie pasują wyświetlam błąd

Widzisz różnicę?

Po co pobierać wszystkich użytkowników, jak szukasz tylko jednego?
I pamiętaj, jak coś nie działa, to nie dlatego, że jest złe w swym założeniu, tylko Ty źle to zbudowałeś.


Tak, widzę różnicę smile.gif
Dzięki za wytłumaczenie smile.gif

Tylko teraz jak już sprawdze czy dany user istnieje w bazie (Twoim sposobem) to co dalej ?

  1. if ($zapytanie) {
  2. przekierowanie do indexu
  3. } else {
  4. przekierowanie na formularz logowania
  5. }


EDIT ////////

Do przykładowego wyświetlania po zapytaniu użyłem:

  1. $row = mysqli_fetch_array($data);
  2. echo "Twoje id to" . $row['id'];


Chciałem sprawdzic na szybko czy dobrze czyta uzytkowników.
Teraz kwestia tego żeby wyświetlić error w przypadku podania złych danych lub gdy sa one prawidlowe uzycia header() lub innego przekierowania.
Chodzi tu chyba tylko jaki warunek dac w if, aby rozpoznawalo kiedy ma przekierowac a kiedy wyswietlic blad.

Ten post edytował Bureau 10.04.2012, 13:43:22
Go to the top of the page
+Quote Post
camikazee
post 10.04.2012, 14:21:27
Post #9





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Nie, nadal nie zrozumiałeś.

  1. <?php
  2. if (isset($_POST['submit'])) {
  3. $conn = mysqli_connect("localhost", "", "", "test");
  4.  
  5. $login = $_POST['login'];
  6. $haslo = $_POST['haslo'];
  7.  
  8. $zapytanie = "SELECT * FROM uzytkownicy WHERE login = '".$login."' AND haslo = '".$haslo."'";
  9. $data = mysqli_query($conn, $zapytanie) or die("MySQL error: " . mysqli_error($conn) . "<hr>\nQuery: $zapytanie");
  10.  
  11. if (mysql_num_rows($data)==1) { // czy znaleziono TYLKO jednego usera z pasujacym loginem i haslem
  12. $_SESSION['zalogowany'] = true;
  13. header("location:index2.php");
  14.  
  15. }
  16. else {
  17. ?>
  18. Niepoprawne dane. Zaloguj sie ponownie!
  19. <a href="logowanie.php" >Logowanie</a>
  20. <?
  21. }
  22.  
  23.  
  24. }
  25.  
  26.  
  27. }
  28.  
  29. }
  30. else {
  31. ?>
  32.  
  33. <form action="logowanie.php" method="post" />
  34. <input name="login" />
  35. <input name="haslo" />
  36. <input type="submit" name="submit" value="Zaloguj" />
  37. </form>
  38.  
  39. <?php
  40. }
  41. ?>


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.07.2025 - 05:44