Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [HTML][MySQL][PHP]System logowania
viamarimar
post 29.11.2014, 15:20:14
Post #1





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


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


Ten post edytował viamarimar 29.11.2014, 15:48:55
Go to the top of the page
+Quote Post
Daimos
post 29.11.2014, 16:09:32
Post #2





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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.

Ten post edytował Daimos 29.11.2014, 16:09:45


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
viamarimar
post 29.11.2014, 23:16:18
Post #3





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


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

Ten post edytował viamarimar 29.11.2014, 23:17:27
Go to the top of the page
+Quote Post
borabora
post 29.11.2014, 23:37:19
Post #4





Grupa: Zarejestrowani
Postów: 116
Pomógł: 33
Dołączył: 8.09.2014

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


  1. if(mysql_fetch_array($zap2)>0) {

na
  1. if(mysql_num_rows($zap2)== 0){
Go to the top of the page
+Quote Post
viamarimar
post 30.11.2014, 01:31:06
Post #5





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


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?

Ten post edytował viamarimar 30.11.2014, 00:03:20
Go to the top of the page
+Quote Post
Daimos
post 30.11.2014, 14:45:26
Post #6





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
viamarimar
post 30.11.2014, 15:19:54
Post #7





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


...............................

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);


Ten post edytował viamarimar 30.11.2014, 15:44:12
Go to the top of the page
+Quote Post
Daimos
post 30.11.2014, 18:35:55
Post #8





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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

Ten post edytował Daimos 30.11.2014, 18:36:45


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
viamarimar
post 1.12.2014, 09:39:38
Post #9





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


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)

Ten post edytował viamarimar 1.12.2014, 09:41:36
Go to the top of the page
+Quote Post
Turson
post 1.12.2014, 09:47:33
Post #10





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


sha1 ma 40 co przeczytałbyś w manualu php gdybyś chociaż zajrzał
http://stackoverflow.com/questions/59667/w...-varchar-in-sql
Go to the top of the page
+Quote Post
Daimos
post 1.12.2014, 19:55:33
Post #11





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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.


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
Turson
post 1.12.2014, 22:15:48
Post #12





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Daimos, to nie mój cytat wink.gif
Go to the top of the page
+Quote Post
Daimos
post 2.12.2014, 18:33:12
Post #13





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
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 Wersja Lo-Fi Aktualny czas: 12.07.2025 - 07:23