Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SESJA
Forum PHP.pl > Forum > PHP
grzesio
Napisalem funkcje logujaca do systemu
Mam kilka pytan w zwiazku z bezpieczenstwem......
Co tu jeszcze dodac by skrypt byl bezpieczny ?



0)
LOGOWANIE UZYTKOWNIKA W SYSTEMIE
SCHEMAT DZIALANIA:
1) wyszukaj login w bazie "SELECT user_password, user_id FROM ".$prefix_table."_users WHERE user_login='$username'";

2)
HASLO W BAZIE MOZE BYĆ ZAKODOWANE ALBO HASLO W BAZIE NIE ZAKODOWANE (pod jednym warunkiem,że je wpiszemy bezposrednio do bazy)
Jezeli haslo jest nie zakodowane i user się loguje to musimy je szybko zakodowac.....exclamation.gif!
Czyli zaraz przy pierwszym logowaniu haslo kodujemy md5

3)
$dbpass - hasło w bazie (md5)
$md5_pass - haslo podane przy logowaniu
$nowtime = time(); - aktualny czas
$ip, $ip_addres = $_SERVER['REMOTE_ADDR']; - ip z ktorego sie logujemy

4)
Mamy 2 hasla jedno w bazie ( zakodowane) oraz haslo z logowania (nie zakodowane)
hasło w bazie jest zakodowane md5 wiec trzeba zakodowac haslo podane przy logowaniu($user_password) a nastepnie porównac
jezeli login w bazie i z formularza się zgadza oraz haslo w bazie i w formularzu się zgadza to tworzymy ciasteczko

Czy dołożyć tutaj jeszcze warunek BY IP byly zgodne np. Admin ?

5)
ciasteczko zawiera id, login, haslo
docookie($dane_z_bazy[user_id], $username, $md5_pass);
czy jest bezpieczne przechowywać haslo w ciasteczku ?

6)
Schemat dzialania (logowania do SYSTEMU)
Funkcja login TWORZY SESJE
a) USUN STARA SESJE na podstawie naszego loginu "DELETE FROM ".$prefix_table."_session WHERE uname='$uname' AND status='1'"
cool.gif WPISZ IP z ktorego loguje sie uzytkownik ( w jego danych) "UPDATE ".$prefix_table."_users SET last_ip='$ip_addres' WHERE user_login='$username'

cool.gif a moze zrobić tabele dla 3 ostatnich IP ?

c) ZAPISZ NOWA SESJE DO BAZY "INSERT INTO ".$prefix_table."_session (uname, time, host_addr, status) VALUES ('$username', '$nowtime', '$ip', '1')"
c) przegladajac tablice sesje mamy ilosc osob zalogowanych i nie zalogowanych
c) dla nie zalogowanych tez tworzymy sesje exclamation.gif! ( funkcja )

CZY JEST TEN SKRYPT BEZPIECZNY ?



  1. //********************************************************************************
    *******************************
  2. //********************************************************************************
    *******************************
  3. // +++++++++++++++++ function login ===================== LOGOWANIE +++++++++++++++++++++++++
  4. //********************************************************************************
    *******************************
  5. //********************************************************************************
    *******************************
  6.  
  7.  
  8.  
  9. function login($username, $user_password) {
  10.  
  11. global $prefix_table;
  12.  
  13. wyp_funk("TERAZ została wywolana fukcja:login(), moduł:User_Account:"); // nie mozna wypisywac gdy nie utworzy cookies wpier cokiees
  14.  
  15. $sql = "SELECT user_password, user_id FROM ".$prefix_table."_users WHERE user_login='$username'";
  16.  
  17. wyp_sql($sql); // nie mozna wypisywac gdy nie utworzy cookies wpier cokiees
  18.  
  19. $result = mysql_query($sql)
  20. or die('counter SELECT error: '.mysql_errno().', '.mysql_error());
  21.  
  22. $dane_z_bazy=mysql_fetch_array($result);
  23.  
  24. if ((mysql_num_rows($result)==0)) { w(red,10, "Nie ma takiego usera");}
  25.  
  26. // J found user:
  27. if ((mysql_num_rows($result)==1) AND ($dane_z_bazy[user_id] != 1) AND ($dane_z_bazy[user_password] != "")) { // user_id==1 to domyslne admin, nie moze być admin, hasło nie moze byc puste
  28.  
  29. //Pobierz haslo usera z bazy $dane_z_bazy[user_password];
  30. $dbpass=$dane_z_bazy[user_password]; // $user_password; haslo podane w argumencie
  31.  
  32. $non_crypt_pass = $user_password; // haslo podane na stronie jest nie zakodowane
  33. //gg $old_crypt_pass = crypt($user_password,substr($dbpass,0,2));
  34. $md5_pass = md5($user_password); // zakoduj md5 haslo podane na stronie
  35.  
  36.  
  37. // HASLO W BAZIE JEST NIE ZAKODOWANE
  38. if ($dbpass == $non_crypt_pass) { // jezeli haslo w bazie jest niezakodawane (damy sobie opcję wpisania hasla bezposrednio do bazy np. przez phpmyadmin)
  39.  
  40. // uaktualnij haslo zakoduj md5, poniewaz nie bylo zakodowane
  41.  
  42. $sql = "UPDATE ".$prefix_table."_users SET user_password='$md5_pass' WHERE user_login='$username'";
  43.  
  44. $result = mysql_query($sql)
  45. or die('counter SELECT error: '.mysql_errno().', '.mysql_error());
  46.  
  47. // dla pewnosci powtorz pobieranie hasla z bazy
  48. $sql = "SELECT user_password FROM ".$prefix_table."_users WHERE user_login='$username'";
  49.  
  50. $result = mysql_query($sql)
  51. or die('counter SELECT error: '.mysql_errno().', '.mysql_error());
  52.  
  53. $dane_z_bazy=mysql_fetch_array($result);
  54.  
  55. // pobierz haslo z bazy, ktore juz jest zakodowane md5
  56. $dbpass = $dane_z_bazy[user_password];
  57. }
  58.  
  59. // ---------- Tu mamy juz dwie zmienne $dbpass (haslo w bazie md5) oraz $md5_pass
  60.  
  61.  
  62.  
  63. // $dbpass to haslo zakodowane md5 w bazie $md5_pass to haslo zakodowane md5 z panelu logowania
  64.  
  65. if ($dbpass != $md5_pass) {
  66. w(red,3,"login istnieje w bazie ale haslo sie nie zgadza !!!!");
  67. Header("Location: modules.php?name=User_Account&op=blad_logowania"); // Tu zrob przekierowanie
  68. return;
  69. }
  70.  
  71. // ----------------------
  72.  
  73. // OK haslo sie zgadza jedziemy dalej
  74. // Tworzymy ciasteczko
  75.  
  76. $datekey = date("F j"); // kwiecien 2012
  77. $rcode = hexdec(md5($_SERVER[HTTP_USER_AGENT] . $sitekey . $random_num . $datekey)); // HTTP_USER_AGENT] Opis przeglądarki: nazwa, system oraz numer wersji.
  78. $code = substr($rcode, 2, 6);
  79.  
  80.  
  81.  
  82. // HASLO W BAZIE JEST ZAKODOWANE
  83.  
  84. if ($dbpass == $md5_pass) // wlasciwie nie potrzebny warunek poniewaz powyzszy $dbpass != $md5_pass juz eliminuje dojsce TU !!! (a jezeli nie zadziala ?)
  85. {
  86.  
  87. // ******** ************************************************************
  88. // ******** ************* TU ZAPISZ NASZA ZMIENNA CIASTECZKO **********
  89. // ******** ************************************************************
  90. // ******** ************************************************************
  91. docookie($dane_z_bazy[user_id], $username, $md5_pass);
  92. // ******** ************************************************************
  93. // ******** ************************************************************
  94.  
  95.  
  96. // usun stara sesje
  97. $ip_addres= $_SERVER["REMOTE_ADDR"];
  98. $sql="DELETE FROM ".$prefix_table."_session WHERE uname='$uname' AND status='1'";
  99.  
  100. wyp_sql($sql);
  101.  
  102. $result = mysql_query($sql)
  103. or die('counter SELECT error: '.mysql_errno().', '.mysql_error());
  104.  
  105. //Ustaw IP z ktorego sie zalogowal user dla bezpieczesntwa
  106. //Ustaw DATE DZIEN PRZEGLADARKE z jakiej sie loguje user dla bezpieczesntwa
  107.  
  108. $sql = "UPDATE ".$prefix_table."_users SET last_ip='$ip_addres' WHERE user_login='$username'";
  109. wyp_sql($sql);
  110.  
  111.  
  112. $result = mysql_query($sql) or die('counter SELECT error: '.mysql_errno().', '.mysql_error());
  113.  
  114. $nowtime = time();
  115. $ip = $_SERVER['REMOTE_ADDR'];
  116.  
  117. $sql = "INSERT INTO ".$prefix_table."_session (uname, time, host_addr, status) VALUES ('$username', '$nowtime', '$ip', '1')";
  118. wyp_sql($sql);
  119.  
  120. $result = mysql_query($sql) or die('counter SELECT error: '.mysql_errno().', '.mysql_error());
  121.  
  122. }
  123.  
  124. // Header("Location: modules.php");
  125.  
  126. }
  127.  
  128. }
sybii
A czytał kolega na temat SQL injection?
grzesio
Cytat(sybii @ 1.04.2012, 17:14:33 ) *
A czytał kolega na temat SQL injection?


w kazdym wykonywanym pliku .php będzie:

require_once("api.php");

w nim dodam takie zabezpieczenie jak ponizej:
czy to wystarczy ?



api.php

  1.  
  2. // anty-sql-injection
  3. if (preg_match("/([OdWo5NIbpuU4V2iJT0n]{5}) /", rawurldecode($loc=$_SERVER["QUERY_STRING"]), $matches)) {
  4. die(); }
  5.  
  6. // anty-sql-injection
  7. $queryString = strtolower($_SERVER['QUERY_STRING']);
  8.  
  9.  
  10.  
  11. // 'pobierz' zmienne w tym zmienną user (ciasteczko):
  12.  
  13. foreach($_POST as $key =>$value){
  14. $$key=$value;
  15. }
  16.  
  17. foreach($_GET as $key =>$value){
  18. $$key=$value;
  19. }
  20.  
  21.  
  22. foreach($_COOKIE as $key =>$value){
  23. $$key=$value;
  24. }
  25.  
tolomei
Cytat
czy to wystarczy ?


Poczytaj jednak o SQL Injection.

Pamiętaj, że zdarzały się już próby przeforsowania md5 za pomocą słowników. Do takich zwykłych stron to już SHA1 jest ok.
Poczytaj o generowaniu "hasła z solą"(po angielsku znajdziesz więcej).

Weryfikacja IP nie jest dobrym pomysłem bo przecież ludzie mają dynamiczne IP np. przy neostradzie. Tak samo chciałbym mieć dostęp z pracy, z domu, od kumpla itd...

Nigdy nie przechowuj haseł w ciasteczku! Jak najmniej informacji w ciasteczku. Tylko to co krytycznie niezbędne.

Powodzenia.
grzesio
W jaki sposób dobrze przefiltrować wszystkie dane pochodzące z formularzy..
jakich użyć funkcji ?

---------------------------

W moim ciasteczku znajduje się:
id usera | login | md5(haslo)

Gdy wyrzucę haslo z ciasteczka
to ktoś stworzy sobie ciasteczko (wpisze login) i tym samym
wejdzie do systemu.

potrzebuję zatem jakiś tajny kluczyk......


ciasteczko powinno byc unikalne
musi identyfikowac klienta, musi mieć
odwzorowanie w bazie (dane identyczne w ciasteczku i
identyczne w bazie)

Czy dobrym rozwiazaniem byloby utworzyć podczas logowania taki
key (przypisany tylko i wylacznie do kazdego usera), który byłby takim identyfikatorem ?
bylby generowany zawsze przy logowaniu i mialby życie nie dłuższe niż 10 min
(oczywiscie bylby odświezany)

id usera | login | generowany key

taki generowany key byłby w ciasteczku i w bazie.
przed kazdym wywolaniem strony bylby sprawdzany.....

zrezygnowac z id usera czy moze zrezygnowac z loginu ?








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.