Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] problem z md5
Forum PHP.pl > Forum > Przedszkole
sokole_oko
Mam taki kod który sprawdza login i hasło z tabela user z mysql
  1. <?php
  2. include("dbinfo.inc.php");
  3. $tb="user";
  4.  
  5. $login=$_POST['login'];
  6. $haslo=$_POST['haslo'];
  7.  
  8. $login = stripslashes($login);
  9. $haslo = stripslashes($haslo);
  10. $login = mysql_real_escape_string($login);
  11. $haslo = mysql_real_escape_string($haslo);
  12.  
  13. $query="SELECT * FROM $tb WHERE login='$login' and haslo=md5('$haslo')";
  14. $wynik=mysql_query($query);
  15.  
  16. $count=mysql_num_rows($wynik);
  17.  
  18. if($count==1){
  19.  
  20. header("location:login_success.php");
  21. }
  22. else {
  23. echo "$login $haslo";
  24. echo "Błędne hasło";
  25. }
  26.  
  27. ?>

a rejestracja użytkowników wygląda w ten sposób
  1. <?php
  2. $login = $_POST['login'];
  3. $haslo = $_POST['haslo'];
  4. $haslo2 = $_POST['haslo2'];
  5. $email = $_POST['email'];
  6. if ($_POST){
  7. if(!empty($login) AND !empty($haslo) AND !empty($haslo2) AND !empty($email)){
  8. if($haslo != $haslo2){
  9. $info .=  'podane hasła są różne<br />';
  10. }else{
  11. if(!ereg("^.+@.+..+$", $email)){
  12. $info .=  'niepoprawny adres e-mail<br />';
  13. }else{
  14. include("dbinfo.inc.php");
  15. $login = $login;
  16. $haslo2 = $haslo;
  17. $email = $email;
  18. $query = "SELECT Login FROM user WHERE Login=$login";
  19. $result = mysql_query($query);
  20. if(@mysql_num_rows($result) > 0){
  21. $info .=  "wybrana nazwa użytkownika($login) jest już zajęta<br />";
  22. }else{
  23. $query = "INSERT INTO user (login,haslo) VALUES ('$login',md5('$haslo2'))";
  24. mysql_query($query);
  25. $info .=  'rejestracja zakończyła się sukcesem<br />';
  26. }
  27. }
  28. }
  29. }else{
  30. $info .= 'uzupełnij wszystkie pola<br />';
  31. }
  32. }
  33. ?>


Gdy wpisuje login i hasło krzyczy że login i hasło są złe (wpisuje w postaci normalnej jak i w postaci md5).
Cóż robię źle ?
Pawel_W
  1. <?php
  2. $login = $login;
  3. $haslo2 = $haslo;
  4. $email = $email;
  5. $query = "SELECT Login FROM user WHERE Login=$login";
  6. ?>

po co ci $login = $login
a po drugie, stringi bierzemy w ' ', czyli
  1. <?php
  2. $query = "SELECT Login FROM user WHERE Login='$login'";
  3. ?>
sokole_oko
Dziękuje pięknie to rozwiązało problem którego jeszcze nie widziałem.
Ale dalej zostaje problem z logowaniem.
Gdy zmieniam
  1. <?php
  2. $query="SELECT * FROM $tb WHERE login='$login' and haslo=md5('$haslo')";
  3. ?>

na
  1. <?php
  2. $query="SELECT * FROM $tb WHERE login='$login' and haslo='$haslo'";
  3. ?>

i wpiszę hasło w postaci md5 jest ok.
Cóż dalej myśle.
Pawel_W
zasugerowałbym tworzenie md5 po stronie php, i przycinanie go do odpowiedniej długości, np. 20 znaków, ponieważ może to jest problemem

powiedz jaki masz typ pola z hasłem

EDIT:
a może to:
  1. <?php
  2. $query="SELECT * FROM $tb WHERE login='$login' and haslo=\"md5('$haslo')\"";
  3. ?>
pawelpaciorek
Cytat(Pawel_W @ 8.07.2009, 14:25:18 ) *
zasugerowałbym tworzenie md5 po stronie php, i przycinanie go do odpowiedniej długości, np. 20 znaków, ponieważ może to jest problemem


Dokładnie, może w bazie jest za krótkie pole, pamiętaj, że MD5 to standardowo 32 znaki
nmts
Cytat
md5('$haslo')


Oznacza, że wysyłasz md5 ciągu '$haslo', a Ty chcesz wysłać to co się kryje pod zmienną więc powinno wyglądać tak:

Cytat
md5($haslo)
sokole_oko
pole w tabeli mysql wyglada tak

Haslo varchar(25)

Zmieniłem jak zasugerowałeś ale też nie działa.
Pawel_W
no to przerabiaj na md5 po stronie php, daj sobie potem echo tego co powstanie i dopiero wzuc do bazy, nie powinno byc wiecej problemow
pawelpaciorek
Cytat(sokole_oko @ 8.07.2009, 14:32:47 ) *
pole w tabeli mysql wyglada tak

Haslo varchar(25)

Zmieniłem jak zasugerowałeś ale też nie działa.


W takim razie rób MD5 po stronie php i tnij hasha do 25 znaków albo zwiększ w bazie pole na 32 znaki
sokole_oko
Dziękuje pięknie zmieniłem na 32 znaki i działa przepięknie.
#luq
Sorry ale muszę skomentować, mam nadzieję, że moderatorzy wybaczą

Cytat(Pawel_W @ 8.07.2009, 14:25:18 ) *
zasugerowałbym tworzenie md5 po stronie php, i przycinanie go do odpowiedniej długości, np. 20 znaków, ponieważ może to jest problemem

Cytat(pawelpaciorek)
W takim razie rób MD5 po stronie php i tnij hasha do 25 znaków albo zwiększ w bazie pole na 32 znaki

Piękna rada ale nie wiem co ona miała dać. Wiecie, że zmniejszacie bezpieczeństwo takim przycinaniem hasha? A tak btw. przycinać można też w zapytaniach SQL`a.
pawelpaciorek
Cytat(#luq @ 8.07.2009, 15:08:34 ) *
Sorry ale muszę skomentować, mam nadzieję, że moderatorzy wybaczą
Piękna rada ale nie wiem co ona miała dać. Wiecie, że zmniejszacie bezpieczeństwo takim przycinaniem hasha? A tak btw. przycinać można też w zapytaniach SQL`a.


To żeby skrypt zaczął działać winksmiley.jpg
Poważnie, to masz rację. W tym wypadku powinno się zwiększy ilość znaków dla danego pola w bazie.
erix
Cytat
A tak btw. przycinać można też w zapytaniach SQL`a.

Owszem, ale zważ na to, że jeśli przycinasz w zapytaniu, to AFAIR treść zapytania leci do serwera w całości, a nie po obrobieniu. [;

Więc lepiej przetransportować samego 32-bajtowego hasha niż np. 1000 bajtów i dopiero po stronie DBMS hashować. Totalna głupota zarówno przy demonie działającym w ramach jednego hosta (najczęściej przecież łączy się przez TCP/IP, a z racji ramek protokołu wychodzi więcej danych) jak i na podzielonych - niepotrzebne marnowanie przepustowości sieci wewnętrznej.
#luq
Edit: Hm... teraz dopiero zczaiłem o co Ci chodziło, w sumie nie pomyślałem o tym.
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.