Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][PHP]System logowania
Forum PHP.pl > Forum > Przedszkole
viamarimar
1. Skrypt z jakiegos powodu gdy dodalem hash przestal dzialac?
2. Co mozna dodac jeszcze aby logowanie bylo bezpieczniejsze
3. Komunikat o zlym hasle nigdy nie wystepuje?
Nawet jak login jest ok a haslo bledne wywala ze odrazu konta nie ma w bazie czyli komunikat =1
  1. echo "Złe hasło, proszę spróbować ponownie";
  2. header("location: index.php?komunikat=2");


Jak rozwiazac kwestie tego zeby wgl zaczelo logowac, rejestracja uzywa tego samego hasha, no i punkt drugi tu juz inwencja i pomysly.

  1. ...
  2. <?php
  3. if(isset($_POST['loguj']) && ($_POST['loguj'])==1) {
  4.  
  5. //filtrowanie
  6. $_POST['login']=mysql_real_escape_string(addslashes(htmlspecialchars(trim($_POST['login']))));
  7. $_POST['haslo']=mysql_real_escape_string(addslashes(htmlspecialchars(trim($_POST['haslo']))));
  8.  
  9.  
  10. $sol = md5("abc"); //sól użytkownika pobierana z bazy
  11. $sol2 = sha1("def"); //sól dodatkowa
  12. $hash = hash('sha512', $_POST['haslo'] . $sol . $sol2);
  13.  
  14.  
  15. $userExists = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM users WHERE login = '".$_POST['login']."' AND pass = '$hash'"));
  16.  
  17. if ($userExists[0] == 0) {
  18. // Użytkownik nie istnieje w bazie
  19. header("location: index.php?komunikat=1");
  20. }
  21. else {
  22. // Użytkownik istnieje
  23. $_SESSION['zalogowany'] = true;
  24. $_SESSION['login'] = $_POST['login'];
  25.  
  26. $user = $_SESSION['login'];
  27. mysql_query("UPDATE `users` SET `logowanie`=NOW(),`online`='1' WHERE login='$user'") or die(mysql_error());
  28.  
  29. header('Location: index.php');
  30.  
  31. echo '<p class="success">Zostałeś zalogowany. Możesz przejść na <a href="index.php">stronę główną</a></p>';
  32. }
  33. }
  34. else{
  35.  
  36. ?>
  37. <form class="form-signin" action="s_logowanie.php" method="POST">
  38. <div class="form-group">
  39. <label>Login</label><input class="form-control" name="login" type="text" required />
  40. </div>
  41. <div class="form-group">
  42. <label>Haslo</label><input class="form-control" name="haslo" type="password" required />
  43. </div>
  44. <div class="row">
  45. <div class="col-xs-6 col-md-6"><input type="reset" value="Wyczyść" class="btn btn-warning btn-block btn-sm" ></div>
  46. <div class="col-xs-6 col-md-6">
  47. <input type="hidden" name="loguj" value="1" />
  48. <input type="submit" value="Zaloguj" class="btn btn-success btn-block btn-sm">
  49. </div>
  50. </div>
  51. </form>
  52.  
  53.  
  54.  
  55.  
  56.  
  57. <?php
  58. }
  59. ...
  60. ?>
Daimos
1. To jakbyś zadał pytanie w serwisie typu: internet przestał działać. Błędy? Problemy? Cokolwiek?
2. Jedna sól Ci wystarczy, ewentualnie jedną trzymaj w bazie, a drugą gdzieś w pliku. Poczytaj też o zabezpieczeniach, generowaniu soli.
3. Nie zapomniałeś o tym?:
  1. if(isset($_GET['komunikat']) && $_GET['komunikat'] == 1)
  2. {
  3. echo 'komunikat błędu';
  4. }

htmlspecialchars na hasło to tragiczny pomysł. Masz świadomość, że jeśli użytkownik będzie miał hasło typu <> to nie zadziała? Chyba, że będziesz to też zamieniał przy rejestracji, ale nie ma to sensu.
Dodatkowo:
  1. $_SESSION['login'] = $_POST['login'];

Wiesz jak będzie wyglądał Twój login w zmiennej session? Będzie zmodyfikowany o addslashes i htmlspecialchars. Zamiast liczyć użytkowników zapytaniem z COUNT, po prostu spróbuj go pobrać i dane z bazy, podstawiaj do sesji.
viamarimar
Wyglada to tak w tej chwili ale teraz przepuszcza wszystko oO.. mamsakra:<

  1. if(isset($_POST['loguj']) && ($_POST['loguj'])==1) {
  2.  
  3. //filtrowanie
  4. $_POST['login']=mysql_real_escape_string(addslashes(trim($_POST['login'])));
  5. $_POST['haslo']=mysql_real_escape_string(addslashes(trim($_POST['haslo'])));
  6.  
  7.  
  8. //solenie hasla na podstawie bazy i soli ze skryptu
  9. $zap1 = mysql_query("SELECT token FROM users WHERE login = '".$_POST['login']."' AND aktywny='1' ") or die(mysql_error());
  10. $wiersz=mysql_fetch_array($zap1);
  11.  
  12. $sol = $wiersz['token']; //sól użytkownika pobierana z bazy
  13. $sol2 = sha1("abcdef"); //sól dodatkowa
  14. $hash = hash('sha512', $_POST['haslo'] . $sol . $sol2);
  15.  
  16.  
  17. $zap2 = mysql_query("SELECT login, haslo FROM users WHERE login = '".$_POST['login']."' AND haslo = '$hash' AND aktywny='1' ") or die(mysql_error());
  18.  
  19. if(mysql_fetch_array($zap2)>0) {
  20. // Użytkownik nie istnieje w bazie
  21. header("location: index.php?komunikat=1");
  22. }
  23. else {
  24. // Użytkownik istnieje
  25. $_SESSION['zalogowany'] = true;
  26. $_SESSION['login'] = $_POST['login'];
  27.  
  28. $user = $_SESSION['login'];
  29. mysql_query("UPDATE `users` SET `logowanie`=NOW(),`online`='1' WHERE login='$user'") or die(mysql_error());
  30.  
  31. header("location: index.php?komunikat=2");
  32.  
  33. }
  34. }



O komunikatach nie zapomnialem sa one tez:

  1. //1
  2. if (isset($_GET['komunikat']) && mysql_escape_string($_GET['komunikat'] == '1') && (int)($_GET['komunikat'])) {
  3. echo '<div class="alert alert-danger" alert-dismissible" role="alert">
  4. <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
  5. <strong>Błąd!</strong> Podałeś błędne dane, spróbuj ponownie!
  6. </div>';
  7. }
  8. //2
  9. if (isset($_GET['komunikat']) && mysql_escape_string($_GET['komunikat'] == '2') && (int)($_GET['komunikat'])) {
  10. echo '<div class="alert alert-success" alert-dismissible" role="alert">
  11. <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
  12. <strong>Sukces!</strong> Zostałeś zalogowany!
  13. </div>';
  14. }
  15. //3
  16. if (isset($_GET['komunikat']) && mysql_escape_string($_GET['komunikat'] == '3') && (int)($_GET['komunikat'])) {
  17. echo '<div class="alert alert-success" alert-dismissible" role="alert">
  18. <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
  19. <strong>Sukces!</strong> Konto zostało utworzone!
  20. </div>';
  21. }


pomoze ktos zrobic "cos" z tym tak zeby dzialalo to jak normalne logowanie a nie "otwarte drzwi" z napisem wejdz i bierdz co chcesz..
borabora
  1. if(mysql_fetch_array($zap2)>0) {

na
  1. if(mysql_num_rows($zap2)== 0){
viamarimar
po zmianie nie lapie nic ;/

  1. $sql = mysql_num_rows(mysql_query("SELECT * FROM `user` WHERE `login` = '".$_POST['login']."' AND `haslo` = '$hash'"));
  2. if ($sql == 1) {


nawet tak nic nie zweraca ;/

cos z tym haszowaniem jest nie tak? bo odkad zaczolem w tym mieszac to cos nie dziala?
------
Czy to dobrze dziala?
  1. //solenie hasla na podstawie bazy i soli ze skryptu
  2. $zap1 = mysql_query("SELECT token FROM users WHERE login = '".$_POST['login']."' AND aktywny='1' ") or die(mysql_error());
  3. $wiersz=mysql_fetch_array($zap1);
  4.  
  5. $sol = $wiersz['token']; //sól użytkownika pobierana z bazy
  6. $sol2 = sha1("abcdef"); //sól dodatkowa
  7. $hash = hash('sha512', $_POST['haslo'] . $sol . $sol2);


w rejestracji jest zapisywany losowy ciaf w pole token , tu jest to pobierane i zapisywane pod $sol , zmienna $sol2 to takjaby sol skryptowa dodatkowa, calosc czyli funkcjie hash wynalazlem gdzies w zabezpieczeniach netowych, ale czy to dobra konstrukcja? Moze w tym jest problem?
Bynajmniej tak mi sie wydaje ze to tak powinno dzialac.

  1. $md5 = md5($_POST['haslo']);
  2. $zapytanie = "SELECT * FROM users WHERE login='".$_POST['login']."' AND haslo='$md5';";
  3. $wykonaj = mysql_query($zapytanie) or die(mysql_error());


czemu gdy dokladam jakakolwiek blokade hasla to sypie sie cale logowanie i poprostu nie da sie logowac:< najprostsze md5 nie dziala
juz nawet szyfrowalem z bazy a nei z poziomu rejestracji i tez logowanie nie dziala..? wtf?
Daimos
Nie wiemy jak wyglądają Twoje konta użytkowników, żeby sprawdzić poprawność danych. Ogólnie odpuść sobie zabezpieczenie z użyciem soli. Zrób normalne logowanie, działające, a później to zmodyfikujesz krok po kroku. Możesz od razu sprawdzić jednym zapytaniem, czy hasło się zgadza, doklejając do tego sól (CONCAT).

Wracając do problemu z samym md5. Pokaż bazę, konto użytkownika. Może za mało znaków masz na hashe w kolumnie? Zrób sobie prostą aplikację, gdzie nie przyjmujesz nic postem. Wstaw wszystko na sztywno, sprawdź co robisz nie tak
viamarimar
...............................

DZIEKUJE Daimos nie wpadlem na tak banalna rzecz, meczylem i stalem nad tym x czasu! Chodzilo o miejsce na haslo, toz to takie glupie ze az mi sie teraz smiac chce ..

Kwestia tylko tego ile potrzebuje miejsca +- okolo zeby za duzo nie dac bo moze lepiej nie
kodowane mniejwiecej w ten sposob:
  1. $sol = md5("abc"); //sól użytkownika pobierana z bazy
  2. $sol2 = sha1("def"); //sól dodatkowa
  3. $hash = hash('sha512', $_POST['haslo'] . $sol . $sol2);
Daimos
To wcale nie takie głupie, każdemu się może zdarzyć smile.gif ostatnio też się na tym zatrzymałem, zwykła literówka, jeden znak mniej na kolumnie i może być problem. Jeśli stosujesz sha512 to daj kolumnie char 128
viamarimar
Co stosuje bo 128 wydaje sie za malo:


1. "sol1" Napierw generuje losowy klucz dla kazdego uzytkownika inny
  1. //losowy ciag
  2. $s = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,10);

2. klucz ten jest szyfrowany w md5
3. "sol2" 10 znakowa szyfrowana sha1
4.haslo jest haszowane i dopisywane jest sol1 +sol2
5. haszowana calosc w md5

Dlaczego tak sie bawie wgl? Bo mam duzo porabanych kolegow ktorzy chca mi udowodnic jacy to oni nie sa "super hakierzy".

Gdzies czytalem ze na samo md5 potrzeba 32 znaki w varchar?
na sha1 nie wiem? ktos wie?
Lepiej haslo trzymac w char czy varchar jaka roznica?
Wiec ile najlepiej i nie za malo znakow? (dla takiego systemu)
Turson
sha1 ma 40 co przeczytałbyś w manualu php gdybyś chociaż zajrzał
http://stackoverflow.com/questions/59667/w...-varchar-in-sql
Daimos
Cytat(Turson @ 1.12.2014, 09:47:33 ) *
Dlaczego tak sie bawie wgl? Bo mam duzo porabanych kolegow ktorzy chca mi udowodnic jacy to oni nie sa "super hakierzy".

Na tych kolegów wystarczy Ci pewnie samo md5. Standardowo i dużo lepiej kiedy używają ludzie sha1. Jeśli chcesz zabezpieczyć się lepiej, sha512, do tego klucz w plikach i klucz w bazie Ci dobrze zabezpieczy hasła. Ale najważniejsza jest aplikacja bez dziur, bo właśnie one, oraz słabe hasła, są najpopularniejszą bramą dla potencjalnych włamywaczy.
Poczytaj na tym forum, jest dużo o zabezpieczeniach, a temat kryptografii jest jak morze, wystarczy zerknąć w google.
Turson
Daimos, to nie mój cytat wink.gif
Daimos
Cytat(Turson @ 1.12.2014, 22:15:48 ) *
Daimos, to nie mój cytat wink.gif

Oj no wiadomo, źle coś kliknąłem wink.gif
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.