Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Szyfrowanie/hashowanie od podstaw
kropamk
post
Post #1





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


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.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 21)
Bateria
post
Post #2





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 23.11.2011

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


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.
Go to the top of the page
+Quote Post
kropamk
post
Post #3





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


Można zarejestrować użytkownika, ale przy logowaniu wyskakuje "Nie ma takiego użytkownika"
Go to the top of the page
+Quote Post
xsonic
post
Post #4





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 11.03.2010

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


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.
Go to the top of the page
+Quote Post
kropamk
post
Post #5





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


czyli mam dodać do kodu md5 ?

$query = mysql_query("SELECT * FROM users WHERE login='$username' && password='md5($password)'");
Go to the top of the page
+Quote Post
adam882
post
Post #6





Grupa: Zarejestrowani
Postów: 289
Pomógł: 1
Dołączył: 2.11.2007

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


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ę
Go to the top of the page
+Quote Post
kropamk
post
Post #7





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


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. ?>
Go to the top of the page
+Quote Post
Bateria
post
Post #8





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 23.11.2011

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


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. ?>



Ten post edytował Bateria 2.12.2011, 07:44:20
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
kropamk
post
Post #10





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


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.
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
kropamk
post
Post #12





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


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);
Go to the top of the page
+Quote Post
Bateria
post
Post #13





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 23.11.2011

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


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.

Ten post edytował Bateria 2.12.2011, 13:32:30
Go to the top of the page
+Quote Post
kropamk
post
Post #14





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


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. ?>
Go to the top of the page
+Quote Post
Bateria
post
Post #15





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 23.11.2011

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


Oczywiście że możesz a nawet było by wskazane.
Jeżeli pomogłem kliknij ikonkę 'POMÓGŁ'
Go to the top of the page
+Quote Post
kropamk
post
Post #16





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


@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)
Go to the top of the page
+Quote Post
kadlub
post
Post #17





Grupa: Zarejestrowani
Postów: 548
Pomógł: 105
Dołączył: 4.06.2010

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


jakiej wielkości masz pole w bazie danych w którym przechowujesz hasło
Go to the top of the page
+Quote Post
kropamk
post
Post #18





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


var 20
Go to the top of the page
+Quote Post
kadlub
post
Post #19





Grupa: Zarejestrowani
Postów: 548
Pomógł: 105
Dołączył: 4.06.2010

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


zmień na char (100)
Go to the top of the page
+Quote Post
kropamk
post
Post #20





Grupa: Zarejestrowani
Postów: 156
Pomógł: 12
Dołączył: 30.11.2011
Skąd: Gdańsk

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


i to bylo to (IMG:style_emoticons/default/smile.gif) wszystko działa. Dziękuję za pomoc (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #21





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
zmień na char (100)
Raczej na varchar(32) a jeszcze lepiej na char(32) - md5 zawsze zwraca 32 znaki
Go to the top of the page
+Quote Post
-Gość-
post
Post #22





Goście







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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 6.10.2025 - 22:32