Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logowanie - Bezpieczeństwo to podstawa!
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
seba199696
Cześć. Poszukuję skryptu do logowania użytkownika [PHP/MYSQL].

Stwórzmy razem dobry darmowy skrypt.
Może ktoś wkleić dobrego gotowca? Razem będziemy ulepszać zabezpieczenia skryptu przed atakami.
Dużo jest gotowców lecz nie są bezpieczne smile.gif

Co najlepiej wykorzystać?
kiler129
Generlanie logowanie to prosta sprawa: w bazie tryzmamy login+solony hash hasla. Dodatkowo w sesji zapisujesz md5() utworzone z ip oraz przeglądarki użytkownika.
Do łącznia się z bazą używasz PDO. Przy sprawdzaniu czy zalogowany weryfikujesz md5() w sesji (coby nikt nie kradł sesji innemu użytkownikowi).

Ot cała filozofia.
wookieb
Przenoszę
plej
Sam go chce ulepszyć więc wkleję mój skrypt:)

  1. <?php
  2.  
  3. if (!isset($_SESSION['login'])) { // dostęp dla niezalogowanego użytkownika
  4.  
  5. if ($_POST['wyslane']) { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt
  6.  
  7. include 'db.php'; // połączenie się z bazą danych
  8. $tabela = 'uzytkownik'; // zdefiniowanie tabeli MySQL
  9.  
  10. $login = htmlspecialchars(stripslashes(strip_tags(trim($_POST["login"]))));
  11. $haslo = htmlspecialchars(stripslashes(strip_tags(trim($_POST["haslo"]))));
  12.  
  13. $haslo = md5($haslo); // szyfrowanie podanego hasła
  14.  
  15. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  16. login='$login' and haslo='$haslo' and status=0");
  17.  
  18. // jeżeli użytkownik zarejestrował się, a nie aktywował swojego konta, to wyświetla się komunikat
  19. if (mysql_num_rows($wynik) == 1) {
  20. $informacja = mysql_fetch_array($wynik);
  21. echo '<p>Nie aktywowałeś jeszcze swojego konta. Aby to zrobić, wejdź w swoją skrzynkę odbiorczą, a następnie znajdź wiadmość z linkiem aktywacyjnym i aktywuj swoje konto</p>';
  22. }
  23.  
  24. // jeżeli wszystko jest dobrze, użytkownik się loguje
  25. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  26. login='$login' and haslo='$haslo' and status=1");
  27.  
  28. if (mysql_num_rows($wynik) == 1) {
  29. $informacja = mysql_fetch_array($wynik);
  30. $_SESSION["login"] = $informacja["login"];
  31. header('Location: index.php');
  32. } else {
  33. echo '<p>Zostały wprowadzone nieprawidłowe dane</p>';
  34. }
  35. mysql_close($polaczenie);
  36. }
  37.  
  38.  
  39.  
  40. } else {
  41. header('Location: index.php'); // zalogowany użytkownik zostaje przekierowany na stronę główną
  42. }
  43.  
  44. if ($_GET["wylogowanie"] == "tak") {
  45. // niszczenie sesji użytkownika
  46. header('Location: index.php'); // przekierwanie na stronę główną
  47. }
  48. $tytul = "Logowanie";
  49. include('naglowek.php');
  50. include('panel-logowania.php');
  51. include('menu-gora.php');
  52. include('menu-lewe.php');
  53. ?>
  54.  
  55. <div id="srodek">
  56. <div id="srodekt"></div>
  57. <div id="srodeks">
  58. <br/>
  59. </div>
  60. <div id="srodekb"></div>
  61. </div>
  62. <?php
  63. // mysql_query('SET NAMES \'utf8\'');
  64. include('prawa-strona.php');
  65. include('stopka.php');
  66. ?>
konole
Kod
        $login = htmlspecialchars(stripslashes(strip_tags(trim($_POST["login"]))));
        $haslo = htmlspecialchars(stripslashes(strip_tags(trim($_POST["haslo"]))));

Jeszcze zapomniałeś mysql_real_escape_string dry.gif
seba199696
  1. include 'db.php'; // połączenie się z bazą danych
Czy to jest bezpieczne? lepiej łączyć się w tym samym skrypcie?
kiler129
Cytat(seba199696 @ 22.05.2011, 10:20:19 ) *
  1. include 'db.php'; // połączenie się z bazą danych
Czy to jest bezpieczne? lepiej łączyć się w tym samym skrypcie?

Jeśli nie ma danych od użytkownika to include jest jak najbardziej bezpieczne.
plej
w db.php łączy się z bazą danych:)

konole gdzie dodać "mysql_real_escape_string" questionmark.gif
snitch.gif
seba199696
"Do łącznia się z bazą używasz PDO." O co chodzi z tym PDO? Jak to wykorzystać?
mat-bi
http://pl.php.net/manual/pl/book.pdo.php

Taa,

plej - może manual - mysql_real_escape_string
seba199696
  1. <? Php
  2. $ Dbh = new PDO ( 'mysql: host = localhost; dbname = test' , $ user , $ pass );
  3. ?>


Chodzi o takie połączenie?
Rid
A ja zaproponuję inną możliwość dla zwiększenia bezpieczeństwa:
http://dev.mysql.com/doc/refman/5.0/en/sec...onnections.html
Zyx
A na co komu takie logowanie całkowicie oderwane od jakiegokolwiek systemu? Przecież powinno być oczywiste, że mechanizm uwierzytelniania użytkownika to część platformy/systemu, na bazie której tworzymy naszą stronę WWW, a nie żaden samodzielny byt, bo tak to to nigdy nie będzie ani bezpieczne, ani działające. Generalnie na początek polecam bardziej pogłębienie swojej znajomości PHP oraz zasad działania poszczególnych funkcji, bo to, co z tym kodem wyrabiacie, to jakiś horror.

  1. $login = htmlspecialchars(stripslashes(strip_tags(trim($_POST["login"]))));
  2. $haslo = htmlspecialchars(stripslashes(strip_tags(trim($_POST["haslo"]))));


1. Brak sprawdzania ustawień magic_quotes - na połowie serwerów ten kod nie będzie działać.
2. Gratulacje, dzięki temu genialnemu produktowi myśli informatycznej pojawiła się podatność na SQL Injection.

  1. <?php


Miło, że sesja nie jest w ogóle zabezpieczona przed przechwyceniem...

  1. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  2. login='$login' and haslo='$haslo' and status=0");
  3.  
  4. // jeżeli użytkownik zarejestrował się, a nie aktywował swojego konta, to wyświetla się komunikat
  5. if (mysql_num_rows($wynik) == 1) {
  6. $informacja = mysql_fetch_array($wynik);
  7. echo '<p>Nie aktywowałeś jeszcze swojego konta. Aby to zrobić, wejdź w swoją skrzynkę odbiorczą, a następnie znajdź wiadmość z linkiem aktywacyjnym i aktywuj swoje konto</p>';
  8. }
  9.  
  10. // jeżeli wszystko jest dobrze, użytkownik się loguje
  11. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  12. login='$login' and haslo='$haslo' and status=1");


Pomijając już wołający o pomstę do nieba sposób wstawiania danych do zapytania, który w połączeniu z pierwszym zacytowanym przeze mnie fragmentem kodu gwarantuje nam piękne SQL Injection, mamy tu "miszczostwo" optymalizacji. Po jakiego grzyba dokładnie ten sam wiersz jest później pobierany drugi raz? Czy nie prościej jest pobrać go raz, z pominięciem warunku AND status=0 i sprawdzić ten status już w skrypcie?

Rid -> i na co komu SSL w komunikacji z bazą danych, kiedy kod PHP leży i kwiczy? Zapominasz o prostym fakcie, że żaden administrator profesjonalnego hostingu nie jest na tyle głupi, by pchać komunikację z bazami danych jawnie przez Internet. Nawet jeśli serwer bazodanowy i serwer WWW nie są tą samą maszyną, będą umieszczone w tej samej sieci chronionej pierdyliardem firewalli filtrujących ruch i posiadającej jeszcze wewnętrzne zabezpieczenia. Jak komuś to będzie potrzebne, to administrator dobry powie prosto i jasno: proszę łączyć się z bazą poprzez SSL, bo taka jest polityka bezpieczeństwa. W przeciwnym wypadku świadczy to tylko o zerowych kompetencjach autora takiego kodu, który nie ma zielonego pojęcia, co robi i dlaczego właściwie to robi.

Generalnie sorry, że rozbijam Wasze marzenia, ale napisanie bezpiecznego logowania to bułka z kromką, ale pod warunkiem, że się umie programować, umie myśleć i umie korzystać z poszczególnych narzędzi. Jak będziecie tak dorzucać różne głupoty nie mając zielonego pojęcia o tym, jak to właściwie działa, to nigdy nie osiągniecie zamierzonego efektu.
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-2024 Invision Power Services, Inc.