Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Logowanie oparte o sesje.
sebekzosw
post 27.09.2008, 22:39:38
Post #1





Grupa: Zarejestrowani
Postów: 437
Pomógł: 42
Dołączył: 16.04.2007

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


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
Go to the top of the page
+Quote Post
akurczyk
post 28.09.2008, 08:59:51
Post #2





Grupa: Zarejestrowani
Postów: 201
Pomógł: 5
Dołączył: 15.07.2008
Skąd: Kłodzko

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


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.


--------------------
Pozdrawiam
Aleksander Kurczyk
Porady dla webmasterów
Go to the top of the page
+Quote Post
sebekzosw
post 28.09.2008, 09:23:03
Post #3





Grupa: Zarejestrowani
Postów: 437
Pomógł: 42
Dołączył: 16.04.2007

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


A czy można to logowanie zabezpieczyć bardziej? Proszę też o opinie innych...
Go to the top of the page
+Quote Post
akurczyk
post 28.09.2008, 09:35:19
Post #4





Grupa: Zarejestrowani
Postów: 201
Pomógł: 5
Dołączył: 15.07.2008
Skąd: Kłodzko

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


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


Ten post edytował akurczyk 28.09.2008, 09:35:57


--------------------
Pozdrawiam
Aleksander Kurczyk
Porady dla webmasterów
Go to the top of the page
+Quote Post
marcio
post 28.09.2008, 09:48:45
Post #5





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


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.

Ten post edytował marcio 28.09.2008, 09:49:09


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Axexis
post 28.09.2008, 15:58:45
Post #6





Grupa: Zarejestrowani
Postów: 98
Pomógł: 14
Dołączył: 13.01.2008
Skąd: Birmingham

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


  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

Ten post edytował Axexis 28.09.2008, 16:00:22


--------------------
  1. root@php.pl:~# rm -fr /


be. confused
Go to the top of the page
+Quote Post
TrevorGryffits
post 28.09.2008, 17:46:31
Post #7





Grupa: Zarejestrowani
Postów: 139
Pomógł: 24
Dołączył: 29.07.2007
Skąd: Tarnowskie Góry

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


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