Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL][PHP] Ilość zwróconych rekordów
arszawin
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 1.07.2008

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


Fragment kodu:
  1. $sql = "SELECT * FROM users WHERE login = '$_POST[login]'";
  2. $wynik = mysql_query( $sql );

Powyższy kod wyświetla oczywiście ilość rekordów, w których pole login jest równe danej wpisanej w formularzu.
W praktyce, przy założeniu, że loginy nie mogą się powtarzać - będzie to 0 (gdy nie ma takiego użytkownika) lub 1 (w przeciwnym wypadku).

Gdy np $_POST[login] = nieMaTakiegoUzytkownika to naturalnie zwracane jest 0.
Ale... w zakłopotanie wprowadziło mnie to, że gdy w formularzu zrobie kilka spacji ($_POST[login] = " ") albo nie wpisze nic ($_POST[login] = ""), zwracane jest... 1! Dlaczego ? Oczywiście w bazie nie powinno być takiego rekordu.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
pedro84
post
Post #2





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


Wiesz co to trim? Wiesz co to SQL Injection. Pierwsze Ci się przyda do pozbycia się nadmiarowych spacji, drugie to podstawa!


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
arszawin
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 1.07.2008

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


Dzięki za zwrócenie uwagi na SQL Injection.

Tak powinno być lepiej:
  1. $temp = addslashes($_POST[login]);
  2. $sql = "SELECT * FROM users WHERE login = '$temp'";
  3. $wynik = mysql_query( $sql );

Natomiast nie zrozumiałem, w jakim kontekście wspomniałeś o trim ? Dlaczego powinno zależeć mi na usunięciu nadmiarowych spacji ? W dalszym ciągu zwracany wynik to 1 i nie wiem dlaczego. Jeżeli dobrze rozumiem, to zapytanie wygląda mniej więcej tak:
  1. SELECT * FROM users WHERE login = ' '

Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


użyj mysql_real_escape_string

co do trima
  1.  
  2. $login = mysql_real_escape_string(trim($_POST['login']));
  3.  


W dodatku po co wyciągasz wszystko?
Wyciągnij tylko id tego usera. ;]

Ten post edytował fifi209 26.07.2010, 23:28:26


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
arszawin
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 1.07.2008

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


W takim razie może nieco inaczej:

  1. $login = mysql_real_escape_string(trim($_POST[login]));
  2. $sql = "SELECT * FROM users WHERE login = '$login'";
  3. $wynik = mysql_query( $sql );
  4.  
  5. $user = mysql_fetch_object( $wynik );
  6. $password = $user -> pass;
  7. $status = $user -> status;
  8.  
  9. if ( $password == md5( $_POST[pass] ) && mysql_num_rows($wynik)>0 ) {
  10. if ( $status == 1 ) {
  11. $_SESSION[login] = $_POST[login];
  12. }
  13. elseif ( $status == 0 ) {
  14. echo "<span>Konto nie zostało aktywowane.</span>";
  15. showLogin();
  16. } else {
  17. echo '<span>Konto zbanowane.</span>';
  18. showLogin();
  19. }
  20.  
  21. }
  22. else {
  23. echo '<span>Nieprawidłowy login lub/i haslo.</span>';
  24. showLogin();
  25. }

Jeżeli w formularzu podam pusty ciąg znaków, albo kilka spacji otrzymuje komunikat, iż konto nie zostało aktywowane. Wskazuje to na to, jakby znaleziono takiego użytkownika w bazie, co jest bez sensu. Zaproponowane mysql_real_escape_string nie rozwiązało tego problemu.
Go to the top of the page
+Quote Post
!*!
post
Post #6





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Przejrzyj ten temat.

Zadbaj o dane które przychodzą do Ciebie. Gdzie sprawdzasz czy login w ogóle coś zawiera, czy w ogóle istnieje, a jak istnieje to w jakiej formie?
Cytat
...Dlaczego powinno zależeć mi na usunięciu nadmiarowych spacji ...

Ponieważ powinno Ci zależeć na bezpieczeństwie. poczytaj o SQL Injection raz jeszcze.
[MYSQL] pobierz, plaintext
  1. $sql = "SELECT * FROM users WHERE login = '$login'";
[MYSQL] pobierz, plaintext

Po co pobierasz wszystko? Ogranicz się tylko do loginu i daj limit na 1.

Ten post edytował !*! 27.07.2010, 08:02:56


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Fifi209
post
Post #7





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(!*! @ 27.07.2010, 07:54:12 ) *
Przejrzyj ten temat.

Zadbaj o dane które przychodzą do Ciebie. Gdzie sprawdzasz czy login w ogóle coś zawiera, czy w ogóle istnieje, a jak istnieje to w jakiej formie?

Ponieważ powinno Ci zależeć na bezpieczeństwie. poczytaj o SQL Injection raz jeszcze.
[MYSQL] pobierz, plaintext
  1. $sql = "SELECT * FROM users WHERE login = '$login'";
[MYSQL] pobierz, plaintext

Po co pobierasz wszystko? Ogranicz się tylko do loginu i daj limit na 1.

Nie prościej do statusu? Statusu i tak potrzebuje...

co do zapytania - zwal na stronę mysql porównanie również hasła smile.gif


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
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 Aktualny czas: 19.08.2025 - 19:59