Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Logowanie oparte o sesje.
Forum PHP.pl > Forum > PHP
sebekzosw
Witam!
Pracuję nad stroną, która jest oparta o MySQL. Mam zamiar zrobić logowanie, które będzie oparte o sesje. Logowanie jest najważniejsze więc istotne jest dla mnie jego bezpieczeństwo:

  1. <?php
  2. if (isset($_POST['login'])) {
  3.    $user_pass = md5($_POST['user_pass']);
  4.    $user_name = preg_replace(array("/=/","/#/","/sORs/"), "", stripinput($_POST['user_name']));
  5.  
  6.    if(empty($_POST['user_name'])) {
  7.        echo "Wpisz login";
  8.    } elseif(empty($_POST['user_pass'])) {
  9.        echo "Wpisz hasło";
  10.    } elseif(!dbcount("(id_uzytkownika)", "uzytkownicy", "nick_uzytkownika='".$user_name."' AND haslo_uzytkownika='".md5($user_pass)."'")) {
  11.        echo "Nieprawidłowy login lub hasło";
  12.    } else {
  13.        $login = $_POST['user_name'];
  14.         session_start();
  15.        session_register("login");
  16.    }
  17. }
  18. ?>


To już gotowy skrypt PHP, który wykonuje logowanie. Co sądzicie o tym logowaniu? Czy jest ono bezpieczne? I jak można go zabezpieczyć bardziej? Z góry dzięki za pomoc.

Pozdrawiam, Sebekzosw
akurczyk
Ja robię bez md5() i session_register() ale i tak te skrypty są bezpieczne ponieważ sesje to pliki po stronie serwera do których istnieje odwołanie w cookie, a jeśli ktoś przechwyci cookie i będzie miał inny system, przeglądarkę itp. to sesja wygasa.
sebekzosw
A czy można to logowanie zabezpieczyć bardziej? Proszę też o opinie innych...
akurczyk
Można napisać własną równie bezpieczną implementacje sesji, niedawno było na forum, ale bardziej zabezpieczyć chyba się nie da.
I jeszcze jedno polecał bym ci to przerobić na standard php5 (w obecnym standardzie php6 może mieć problemy):
  1. <?php
  2. mysql_connect(&#092;"localhost\", \"login\", \"haslo\");
  3. mysql_select_db(&#092;"baza\");
  4. mysql_query(&#092;"SET NAMES 'utf8'\");
  5. if(isset($_POST['zaloguj_sie']) && !empty($_POST['login']) && !empty($_POST['haslo'])) {
  6.    $wykonaj_zapytanie = mysql_query(&#092;"SELECT * FROM uzytkownicy WHERE login='\".addslashes($_POST['login']).\"' AND haslo='\".addslashes($_POST['haslo']).\"'\");
  7.    if(mysql_num_rows($wykonaj_zapytanie) == 1) {
  8.        $wiersz = mysql_fetch_array($wykonaj_zapytanie);
  9.        $_SESSION['zalogowany'] = &#092;"tak\";
  10.        $_SESSION['administrator'] = $wynik['administrator'];
  11.        $_SESSION['id'] = $wiersz['id'];
  12.        $_SESSION['login'] = $wiersz['login'];
  13.        $_SESSION['haslo'] = $wiersz['haslo'];
  14.        $_SESSION['email'] = $wiersz['email'];
  15.        $_SESSION['imie_i_nazwisko'] = $wiersz['imie_i_nazwisko'];
  16.    }
  17. }
  18. if(isset($_GET['przekierowanie'])) {
  19.    header(&#092;"Locatio: {$_GET['przekierowanie']}\");
  20. } else {
  21.    header(&#092;"Locatio: index.php\");
  22. }
  23. ?>
marcio
Cytat
Ja robię bez md5() i session_register() ale i tak te skrypty są bezpieczne ponieważ sesje to pliki po stronie serwera

To bardzo zle robisz powiem ci glupie 2 ptrzyklady jakie mi przychodza do glowy:
1.Wystarczy ze ktos znajdzie XSS na twojej stronie
2.Ktos znajdzie Sql inj. i juz ma login i haslo bez kombinowania w jakies teczowe tablice

Po 3 session_register() od php5 jak dobrze wiem nie jest potrzebne php5 ma wbudowany automatyczny system ktory dziala na takiej zasadzie a po 4 to w pierwszym kodzie nawet nie filtrujesz dobrze danych w zapytaniu sql

Potem z tego co widze to masz funkcje dbcount() ktora hmm.... wydaje mi sie ze dziala za pomoca mysql_num_rows() jesli tak to zle ja osobisciw wole sprawdzac dane za pomoca mysql_fetch_assoc() poniewaz jesli zle filtrujesz dane to wpisujac ' or 1/* mysql_num_rows() moze przepuscic i moze cie zalogowac

POtem bezpieczenstwo logowania zalezy tez od tego jak zabezpieczasz podstrony.

P.S to tylko moje zdanie moge sie mylic.
Axexis
  1. <?php
  2. if (isset($_POST['login'])) {
  3.    $user_pass = md5($_POST['user_pass']);
  4.    $user_name = preg_replace(array("/=/","/#/","/sORs/"), "", stripinput($_POST['user_name']));
  5.  
  6.    if(empty($_POST['user_name'])) {
  7.        echo "Wpisz login";
  8.    } elseif(empty($_POST['user_pass'])) {
  9.        echo "Wpisz hasło";
  10.    } elseif(!dbcount("(id_uzytkownika)", "uzytkownicy", "nick_uzytkownika='".$user_name."' AND haslo_uzytkownika='".md5($user_pass)."'")) {
  11.        echo "Nieprawidłowy login lub hasło";
  12.    } else {
  13.        $login = $_POST['user_name'];
  14.         session_start();
  15.        session_register("login");
  16.    }
  17. }
  18. ?>


Po pierwsze nie 'pójdzie' Ci to, bo dwa razy hashujesz hasło.
Po drugie, zamiast tych wszystkich filtrów, daj:
$user_pass = mysql_real_escape_string($_POST['user_pass']);
$user_name = mysql_real_escape_string($_POST['user_name']);

oprócz tego, do sesji logowania dodaj
  1. <?php
  2. $_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
  3. ?>
i sprawdzaj je przy każdej zabezpieczonej stronie. Uniemożliwi to przejęcie przez 'hackera' sesji (o ile nie ma tego samego IP co ofiara biggrin.gif).
Przepisany kod logowania:
  1. <?php
  2. if(!isset($_POST['user_pass']) || !isset($_POST['user_name'])) die("Musisz wypelnic wszystkie pola!");
  3.  
  4. $user = mysql_real_escape_string($_POST['user_name']);
  5. $pass = mysql_real_escape_string(md5($_POST['user_pass']));
  6.  
  7. if(!dbcount("(id_uzytkownika)", "uzytkownicy", "nick_uzytkownika=\"$user\" AND haslo_uzytkownika=\"$pass\""))
  8. {
  9. echo "Nie prawidlowa nazwa uzytkownika lub haslo";
  10. }
  11. else
  12. {
  13. $_SESSION['login'] = $user;
  14. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  15. }
  16. ?>


Nawiasem, session_start() wstawia sie zawsze na poczatku pliku, inaczej Ci wywali bledy (przy E_ALL).

Pozdrawiam
TrevorGryffits
Ja tylko jeszcze dodam, że nie warto robić mysql_real_escape_string(md5(blablabla)). Wystarczy samo md5.
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.