Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Warunek IF w warunku
Forum PHP.pl > Forum > Przedszkole
pitu
Witam

Mam problem z zagnieżdżeniem warunków. Wydaje mi się, że wszystko jest dobrze lecz nie działa jak trzeba.
  1. <?php
  2.  
  3. $loglogin = $_POST["login"];
  4. $loghaslo = sha1($_POST["haslo"]);
  5.  
  6. $logowanie = mysql_query("SELECT * FROM UZYTKOWNICY WHERE Uzytkownik='" .$loglogin. "' and Haslo='" .$loghaslo. "'");
  7. $loginspr = mysql_query("SELECT * FROM UZYTKOWNICY WHERE Uzytkownik='" .$loglogin. "'");
  8.  
  9.  
  10. if (mysql_num_rows($logowanie) != 1) {
  11.  
  12. if (mysql_num_rows($loginspr) == 1) {
  13. $bladhaslo = 1;
  14.  
  15. } else
  16. {
  17. $bladlogowanie = 1;
  18.  
  19. }
  20.  
  21. } else
  22. {
  23. $logowanieok = 1;
  24. }
  25. ?>


Nie działa mi część z $logowanieok = 1, pomimo niespełnienia warunku pierwszego kod nie jest wykonywany.
vermis
Nie widzę połączenia z bazą, nie masz czy nie wkleiłeś?
pitu
Połączenie mam, nie wrzucałem tutaj ponieważ działa na pewno. Inne warunki działają poprawnie.
NEO.pl
Straszny ten kod. Raz ze prosisz sie sqlinjection, dwa ze hasla masz plaintextowe, trzy ze jesli to nie Twoj serwer to wystarczy wlaczyc logowanie zapytan i wszystkie hasla sa jak na dloni. A 2 zapytania to juz super pomysl - zeby sie zalogowac user musi podac poprawny login *i* haslo. Po co chcesz mowic dokladnie ze login zly czy haslo zle? nie wyszlo logowanie - "Dane uzyte do logowania nie sa poprawne. Wpisz poprawne dane.". Koniec komunikatu. No chyba ze koniecznie chcesz ulatwic komus odkrycie loginow do istniejacych w systemie kont.
pitu
OK, wykonałem jak napisałeś, czyli udane lub nieudane logowanie. Cod o SQLi to mógłbyś podpowiedzieć jak zabezpieczyć taki panel logowania?
NEO.pl
SQL Injection:
http://en.wikipedia.org/wiki/SQL_injection
http://pl2.php.net/mysql_real_escape_string
Google

Co do zapytania i hasla -> jesli juz musisz trzymac plain textowo (99,99% nie musisz) to np. wyjmij haslo z bazy dla danego usera i porownaj sobie w kodzie. Poza tym robienie "SELECT *" jest srednio sensowne jesli interesuje Cie jedynie informacja czy dany rekord istnieje czy nie. Albo wyciagaj to co faktycznie potrzebujesz (np. "SELECT `id`, `haslo` ....) albo tylko zliczaj "SELECT COUNT(id) AS count..." (tylko wtedy mysql_num_rows() nie mozesz uzyc tak jak masz wyzej.
pitu
Dzięki za wskazówki.

Przerobiony kod wygląda następująco:
  1. <?php
  2. require('includes/includes.php');
  3.  
  4. $loglogin = mysql_real_escape_string($_POST["login"]);
  5. $loghaslo = mysql_real_escape_string(sha1($_POST["haslo"]));
  6.  
  7. $logowanie = @mysql_query("SELECT COUNT(Id_uzytkownika) AS ILE FROM UZYTKOWNICY WHERE Uzytkownik='" .$loglogin. "' and Haslo='" .$loghaslo. "'");
  8. $logowaniedane = mysql_fetch_array($logowanie);
  9.  
  10. //sprawdzanie czy pola nie sa puste
  11. if (empty($_POST["login"]) or empty($_POST["haslo"])) {
  12.  
  13. $braklogowanie = "Nie wpisałeś loginu lub hasła";
  14. echo "brak";
  15. exit();
  16. }
  17. //sprawdzenie czy dane się zgadzają
  18. if ($logowaniedane["ILE"] != 1) {
  19.  
  20. $bladlogowanie = "Podane dane są nieprawidłowe";
  21. echo "blad";
  22.  
  23. } else
  24. {
  25. $oklogowanie = "ok";
  26. echo "ok";
  27. }
  28.  
  29. ?>


Czy należało by coś jeszcze do niego dodać aby był bezpieczny?
NEO.pl
Tak. Poprawna obsluge bledow mysql_query zamiast nieszczesnego @ (bo to i tak zle uzyte masz). A, jeszcze najpierw robisz zapytanie a potem sprawdzasz czy masz do niego "komponenty"? herbate tez najpierw nalewasz a potem wyjmujesz szklanke z szafki? smile.gif
pitu
Dziękuję za podpowiedzi i porady.

OK zmieniłem kolejność
1. sprawdzam pola
2. jeżeli nie są puste wykonuje zapytanie itp.

Czy coś jeszcze można zmienić, dodać?
  1. <?php
  2. require('includes/includes.php');
  3.  
  4. //sprawdzanie czy pola nie sa puste
  5. if (empty($_POST["login"]) or empty($_POST["haslo"])) {
  6.  
  7. $braklogowanie = "Nie wpisałeś loginu lub hasła";
  8. echo "brak";
  9. exit();
  10. }
  11.  
  12. $loglogin = mysql_real_escape_string($_POST["login"]);
  13. $loghaslo = mysql_real_escape_string(sha1($_POST["haslo"]));
  14.  
  15. $logowanie = mysql_query("SELECT COUNT(Id_uzytkownika) AS ILE FROM UZYTKOWNICY WHERE Uzytkownik='" .$loglogin. "' and Haslo='" .$loghaslo. "'");
  16. if (!$logowanie) {
  17. die('Bledne zapytanie');
  18. exit();
  19. }
  20. $logowaniedane = mysql_fetch_array($logowanie);
  21.  
  22.  
  23. //sprawdzenie czy dane się zgadzają
  24. if ($logowaniedane["ILE"] != 1) {
  25.  
  26. $bladlogowanie = "Podane dane są nieprawidłowe";
  27. echo "blad";
  28.  
  29. } else
  30. {
  31. $oklogowanie = "ok";
  32. echo "ok";
  33. }
  34.  
  35. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.