Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Szyfrowanie/hashowanie od podstaw
Forum PHP.pl > Forum > Przedszkole
kropamk
Witam.
Nie za bardzo rozumiem jak mam umieścić md5 w skrypcie aby wszystko działało poprawnie.

Rejestracja wygląda tak:
  1. <?php
  2. // DEKLARACJA ZMIENNYCH Z FORMULARZA //
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5. $password_confirm = $_POST['password_confirm'];
  6. $mail = $_POST['mail'];
  7.  
  8. // sprawdzenie czy zmienne zostaly wprowadzone
  9.  
  10. if($username&&$password&&$mail)
  11. {
  12. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  13. mysql_select_db("baza", $connect) or die("Nie można znaleźć bazy danych");
  14.  
  15. $duplicate = mysql_query("SELECT * FROM USERS WHERE login='$username' || mail='$mail'");
  16. $num_rows = mysql_num_rows($duplicate);
  17.  
  18. if ($num_rows){
  19. echo "Podana nazwa użytkownika lub e-mail jest już w użyciu";
  20. return;
  21. }else
  22.  
  23. $insertquery = "INSERT INTO users (Login, Password, Mail) VALUES ('$username','$password','$mail')";
  24. if (!mysql_query($insertquery))
  25. {
  26.  
  27. die('Error: ' . mysql_error());
  28. }
  29. echo "Dodano użytkownika";
  30.  
  31. } else
  32. die("Nie można było dodać użytkownika, wypełnij pola poprawnie.");
  33.  
  34. mysql_close($connect)
  35. ?>


a logowanie tak
  1. <?php
  2. $username = $_POST['username'];
  3. $password = $_POST['password'];
  4.  
  5. if($username&&$password)
  6. {
  7. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  8. mysql_select_db("baza", $connect) or die("Nie można znaleźć bazy danych");
  9.  
  10. $query = mysql_query("SELECT * FROM users WHERE login='$username' && password='$password'");
  11.  
  12. $numrows = mysql_num_rows($query);
  13.  
  14. if ($numrows!=0)
  15. {
  16. $_SESSION['zalogowany'] = true;
  17. $_SESSION['username'] = $_POST['username'];
  18. $_SESSION['password'] = $_POST['password'];
  19.  
  20. echo '<div id="message">Witamy '. $username .'. <a href="index.php">Powrót</a></div>';
  21.  
  22. } else
  23. die("Nie ma takiego użytkownika");
  24.  
  25. } else
  26. die("Nieprawidłowy użytkownik lub hasło");
  27.  
  28. mysql_close($connect)
  29. ?>


Będę wdzięczny za jakiekolwiek inne uwagi co do kodu.
Pozdrawiam.
Bateria
rejestracja
  1. <?php
  2. // DEKLARACJA ZMIENNYCH Z FORMULARZA //
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5. $password_confirm = $_POST['password_confirm'];
  6. $password = md5($password);
  7. $mail = $_POST['mail'];
  8.  
  9. // sprawdzenie czy zmienne zostaly wprowadzone
  10.  
  11. if($username&&$password&&$mail)
  12. {
  13. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  14. mysql_select_db("baza", $connect) or die("Nie można znaleźć bazy danych");
  15.  
  16. $duplicate = mysql_query("SELECT * FROM USERS WHERE login='$username' || mail='$mail'");
  17. $num_rows = mysql_num_rows($duplicate);
  18.  
  19. if ($num_rows){
  20. echo "Podana nazwa użytkownika lub e-mail jest już w użyciu";
  21. return;
  22. }else
  23.  
  24. $insertquery = "INSERT INTO users (Login, Password, Mail) VALUES ('$username','$password','$mail')";
  25. if (!mysql_query($insertquery))
  26. {
  27.  
  28. die('Error: ' . mysql_error());
  29. }
  30. echo "Dodano użytkownika";
  31.  
  32. } else
  33. die("Nie można było dodać użytkownika, wypełnij pola poprawnie.");
  34.  
  35. mysql_close($connect)
  36. ?>
  37.  


logowanie
  1. <?php
  2. $username = $_POST['username'];
  3. $password = $_POST['password'];
  4. $password = md5($password);
  5.  
  6. if($username&&$password)
  7. {
  8. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  9. mysql_select_db("baza", $connect) or die("Nie można znaleźć bazy danych");
  10.  
  11. $query = mysql_query("SELECT * FROM users WHERE login='$username' && password='$password'");
  12.  
  13. $numrows = mysql_num_rows($query);
  14.  
  15. if ($numrows!=0)
  16. {
  17. $_SESSION['zalogowany'] = true;
  18. $_SESSION['username'] = $_POST['username'];
  19. $_SESSION['password'] = $_POST['password'];
  20.  
  21. echo '<div id="message">Witamy '. $username .'. <a href="index.php">Powrót</a></div>';
  22.  
  23. } else
  24. die("Nie ma takiego użytkownika");
  25.  
  26. } else
  27. die("Nieprawidłowy użytkownik lub hasło");
  28.  
  29. mysql_close($connect)
  30. ?>
  31.  

Powinno śmigać a jak nie to napisz, w domu zobaczę to na spokojnie.
kropamk
Można zarejestrować użytkownika, ale przy logowaniu wyskakuje "Nie ma takiego użytkownika"
xsonic
W md5 chodzi o to żeby zaszyfrować jakiś tekst w twoim przypadku hasło. Jak zaszyfrujesz hasło podczas rejestracji to w polu hasło w bazie będziesz miał hasło zapisane w md5.
Czyli nie np bolek tylko fskkb724jgfsd wiec jak się potem logujesz to bolek nie będzie równe fskkb724jgfsd tylko w logowaniu musi być podawane fskkb724jgfsd.
kropamk
czyli mam dodać do kodu md5 ?

$query = mysql_query("SELECT * FROM users WHERE login='$username' && password='md5($password)'");
adam882
brakuje też walidacji przed sql_injection (np. mysql_real_escape_string() przy zapytaniu). Sprawdzając też czy jest taki użytkownik z danym hasłem dałbym na końcu LIMIT 1, bo inaczej będzie szukać całą bazę
kropamk
Poprawiłem tak kod logowania, nie pokazuje żadnego błędu tylko komunikat że nie ma takiego użytkownika (użytkownik na 100% jest w bazie)

  1. <?php
  2. $username = $_POST['username'];
  3. $password = $_POST['password'];
  4. $password=md5($password);
  5.  
  6. if($username&&$password)
  7. {
  8. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  9. mysql_select_db("formonline", $connect) or die("Nie można znaleźć bazy danych");
  10.  
  11. $query = mysql_query('select * FROM users WHERE login="'.$username.'" AND password=md5("'.$password.'")');
  12. $numrows = mysql_num_rows($query);
  13.  
  14. if ($numrows!=0)
  15. {
  16. $_SESSION['zalogowany'] = true;
  17. $_SESSION['username'] = $_POST['username'];
  18. $_SESSION['password'] = $_POST['password'];
  19.  
  20.  
  21. echo '<div id="message">Witamy '. $username .'. <a href="index.php">Złóż zamówienie</a></div>';
  22.  
  23. } else
  24. die("Nie ma takiego użytkownika");
  25.  
  26. } else
  27. die("Nieprawidłowy użytkownik lub hasło");
  28.  
  29. mysql_close($connect)
  30.  
  31. ?>
Bateria
Najpierw zaloguj się do bazy danych przez np. phpMyAdmin i sprawdź czy hasło do danego użytkownika zostało zapisane w md5 czy normalnie takie jak podałeś w formularzu rejestracji. I jeżeli tak jest to zainspiruj się tym:
  1. <?php
  2.  
  3. $mysql = mysql_connect('dbhost','dbpass','dbuser') or die (mysql_error());
  4. $mysql = mysql_connect('dbname') or die (mysql_error());
  5.  
  6. $login = $_POST['login'];
  7. $password = $_POST['password'];
  8. $password = md5($password);
  9.  
  10. $query = ("SELECT * FROM nazwa_bazy WHERE login='$login' AND password='$password'");
  11.  
  12. if(mysql_num_rows($query) == 1){
  13. $_SESSION['zalogowany'] = 1;
  14. }
  15.  
  16. ?>

nospor
Mysl troszeczkę co robisz...
najpierw hasło hashujesz w php:
$password=md5($password);

a potem jeszcze w mysql:
password=md5("'.$password.'")'

Wywal to z mysql. Hashujesz w php i to wystarczy

@bateria zjadłeś mysql_query.
kropamk
Cytat(nospor @ 2.12.2011, 07:54:46 ) *
Mysl troszeczkę co robisz...
najpierw hasło hashujesz w php:
$password=md5($password);

a potem jeszcze w mysql:
password=md5("'.$password.'")'

Wywal to z mysql. Hashujesz w php i to wystarczy

@bateria zjadłeś mysql_query.


nie rozumiem najpierw w mysql a potem mam wywalić to z mysql.

zrobilem takie cos

kod rejestracji
  1. <?php
  2. // DEKLARACJA ZMIENNYCH Z FORMULARZA //
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5. $password_confirm = $_POST['password_confirm'];
  6. $password = md5($password);
  7. $mail = $_POST['mail'];
  8.  
  9. // sprawdzenie czy zmienne zostaly wprowadzone
  10.  
  11. if($username&&$password&&$mail)
  12. {
  13. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  14. mysql_select_db("formonline", $connect) or die("Nie można znaleźć bazy danych");
  15.  
  16. $duplicate = mysql_query("SELECT * FROM USERS WHERE login='$username' || mail='$mail'");
  17. $num_rows = mysql_num_rows($duplicate);
  18.  
  19. if ($num_rows){
  20. echo 'Podana nazwa użytkownika lub e-mail jest już w użyciu<br/>';
  21. echo '<a href="rejestracja.html">Wróc do rejestracji</a><br/>';
  22. echo '<a href="index.php">Bądź systemu logowania</a>';
  23. return;
  24. }else
  25.  
  26. $insertquery = "INSERT INTO users (Login, Password, Mail) VALUES ('$username','$password','$mail')";
  27. if (!mysql_query($insertquery))
  28. {
  29.  
  30. die('Error: ' . mysql_error());
  31. }
  32. echo 'Dodano użytkownika';
  33. echo '<a href="index.php">Wróc do systemu logowania</a>';
  34.  
  35. } else
  36. die("Nie można było dodać użytkownika, wypełnij pola poprawnie.");
  37.  
  38. mysql_close($connect)
  39. ?>


a to kod logowania
  1. <?php
  2. $username = $_POST['username'];
  3. $password = $_POST['password'];
  4. $password=md5($password);
  5.  
  6. if($username && $password)
  7. {
  8. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  9. mysql_select_db("formonline", $connect) or die("Nie można znaleźć bazy danych");
  10.  
  11. $query = mysql_query('select * FROM users WHERE login = "'.$username.'" AND password=md5("'.$password.'")');
  12. $numrows = mysql_num_rows($query);
  13.  
  14. if ($numrows!=0)
  15. {
  16. $_SESSION['zalogowany'] = true;
  17. $_SESSION['username'] = $_POST['username'];
  18. $_SESSION['password'] = $_POST['password'];
  19.  
  20.  
  21. echo '<div id="message">Witamy '. $username .'. <a href="index.php">Złóż zamówienie</a></div>';
  22.  
  23. } else
  24. die("Nie ma takiego użytkownika");
  25.  
  26. } else
  27. die("Nieprawidłowy użytkownik lub hasło");
  28.  
  29. mysql_close($connect)
  30.  
  31. ?>


W myphpadmin pokazuje juz kasło po md5

Po próbie zalogowania hasłem jak przy rejestracji pokazuje że nie ma takiego użytkownika, gdy wpisuje hasło takie jak po md5 (biore je z bazy) to sie loguje.
nospor
Cytat
nie rozumiem najpierw w mysql a potem mam wywalić to z mysql.
NIkt ci nigdzie nie kazał robić md5 na poziomie zapytania.
md5 kazano ci robić w php i tę wartość wkładać do zapytania.
kropamk
powinienem pozostawić
  1. $query = mysql_query('select * FROM users WHERE login = "'.$username.'" AND password=md5("'.$password.'")');


a w deklarowanych zmiennych powinienem mieć
  1. $username = $_POST['username'];
  2. $password = $_POST['password'];
  3. $password = md5($password);
Bateria
W rejestracji wysyłasz hasło do bazy danych ale proces kodowania do md5 nie przebiega za pomocą funkcji w bazie danych tylko w skrypcie, więc wysyłasz już zakodowane hasło. Natomiast w pliku logowania gdy wpiszesz hasło do pola $_POST zostanie ono zakodowane do md5 i porównane z zakodowanym hasłem które zostanie pobrane z bazy danych.

A więc w rejestracji zmienne deklarujesz w ten sposób:
  1. $username = $_POST['username'];
  2. $password = $_POST['password'];
  3. $password_confirm = $_POST['password_confirm'];
  4. $password = md5($password);
  5. $mail = $_POST['mail'];

Logowanie:
  1. $username = $_POST['username'];
  2. $password = $_POST['password'];
  3. $password = md5($password);


I query w logowaniu:
  1. $query = mysql_query("SELECT * FROM nazwa_bazy WHERE login='$login' AND password='$password'");

I teraz musisz sprawdzić jaka ilość wierszy zwróci to zapytanie, jeżeli 1 tworzy sesje i jesteś zalogowany.
kropamk
Poprawki naniesione i czy nie mogę w ten sposób sprawdzić czy użytkownik jest zalogowany ?

  1. <?php
  2. $username = $_POST['username'];
  3. $password = $_POST['password'];
  4. $password = md5($password);
  5.  
  6. if($username && $password)
  7. {
  8. $connect = mysql_connect("localhost","root","haslo") or die ("Nie można się połączyć");
  9. mysql_select_db("formonline", $connect) or die("Nie można znaleźć bazy danych");
  10.  
  11. $query = mysql_query("select * FROM users WHERE login='$username' AND password='$password'");
  12. $numrows = mysql_num_rows($query);
  13.  
  14. if ($numrows!=0)
  15. {
  16. $_SESSION['zalogowany'] = true;
  17. $_SESSION['username'] = $_POST['username'];
  18. $_SESSION['password'] = $_POST['password'];
  19.  
  20.  
  21. echo '<div id="message">Witamy '. $username .'. <a href="index.php">Złóż zamówienie</a></div>';
  22.  
  23. } else
  24. die("Nie ma takiego użytkownika");
  25.  
  26. } else
  27. die("Nieprawidłowy użytkownik lub hasło");
  28.  
  29. mysql_close($connect)
  30.  
  31. ?>
Bateria
Oczywiście że możesz a nawet było by wskazane.
Jeżeli pomogłem kliknij ikonkę 'POMÓGŁ'
kropamk
@Bateria coś nadal jest nie tak z kodem w loginie ponieważ rejestracji ładnie szyfruje hasło (sprawdzałem w phpmyadnim), ale podczas logowania nie znajduje użytkownika nawet po wpisanym haśle zaszyfrowanym (wyciągnietym z bazy)
kadlub
jakiej wielkości masz pole w bazie danych w którym przechowujesz hasło
kropamk
var 20
kadlub
zmień na char (100)
kropamk
i to bylo to smile.gif wszystko działa. Dziękuję za pomoc smile.gif
nospor
Cytat
zmień na char (100)
Raczej na varchar(32) a jeszcze lepiej na char(32) - md5 zawsze zwraca 32 znaki
Gość
MD5 (zwłaszcza bez soli) nie jest już bezpieczną metodą przechowywania haseł i już jej się nie powinno stosować. Najlepiej jakby hasło było przechowywane za pomocą SHA512 z solą unikalną dla każdego użytkownika. Można to zrealizować tak:

  1. hash_hmac('sha512', $password_plaintext, $salt);


ciąg ma długość 128 znaków, czyli musi być w polu char(128)

Logowanie wygląda tak, że zadajesz zapytanie select wyszukujące po nazwie użytkownika (nie możesz od razu sprawdzać hasła bo żeby je dobrze wygenerować musisz mieć salt).

1. Może się wydawać to nadmiarowe, ale jak ktoś przełamie zabezpieczenia (nawet nie poprzez Twój błąd tylko kogoś innego) i dostanie twoją bazę danych w swoje ręce to takie zabezpieczenie będzie się wydawać o wiele mniej nadmiarowe. W idealnym świecie każdy ma osobne hasło do każdego serwisu, a hasło jest złożone z losowych znaków o dużych i małych literach. W rzeczywistości hasła użytkowników są o wiele bardziej słownikowe.
2. To że hash jest taki długi, nie powoduje że jest znacząco wolniejszy.
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.