BAZA WIEDZY
KURSY
Bazy danych w PHP
Kurs AdvancedAJAX
Kurs ASP
Kurs ASP.NET
Kurs C++
Kurs CSS
Kurs HTML
Kurs HTML drugi
Kurs JavaScript
Kurs MySQL
Kurs PHP
Kurs RSS
Kurs XHTML
Obiekty DOM
MANUALE
CSS1 - W3C
DOM - w budowie
PHP 2005
PHP 2006
Wyrażenia regularne
SHOUTBOX
STAT
Online: 20 | UU: 425
[PHP] Prosty system do logowania
2 kwiecień 2007

W tej poradzie przedstawiony zostanie sposób stworzenia prostego systemu do logowania. Wykorzystamy w tym celu PHP i bazę MySQL. Program będzie składał się z kilku części - formularza logowania, logowania i wylogowywania.

Stworzymy dwa pliki i jedną tabelę w MySQL.

index.php - w tym pliku będzie logowanie i wylogowywanie
main.php - do tego pliku nastąpi przeniesienie w przypadku prawidłowego logowania
Baza z tabelą "logowanie" - z trzema polami:  id(auto_increment), uzytkownik(varchar, 50), haslo(varchar, 32).
* Pole "haslo" dla bezpieczeństwa zakodowane będzie funkcją md5(). (aby dowiedzieć się czym jest md5() można kliknąć w link w przykładzie)

W stworzonej dla potrzeb logowania tabeli w kolumnie "uzytkownik" dodamy rekord o nazwie "admin", a w kolumnie "haslo" zakodowany ciąg znaków funkcją md5() -
"81dc9bdb52d04dc20036dbd8313ed055".

* W trakcie testu w polu hasła należy wprowadzić hasło przed zakodowaniem w md5(), czyli 1234.

Index.php będzie składał się z trzech części:

Formularza z dwoma polami - "nazwa użytkownika", "hasło" oraz przyciskiem submit
Programu do autoryzacji, który przed zalogowaniem będzie sprawdzał poprawność wprowadzonych danych, a w przypadku powodzenia przenosił do strony main.php
Wylogowania

  • index.php 

    Kod: php

    <?
    // Na samej górze zadeklaruj sesję.
    session_start();
    // Sekcja wylogowywania, kasuje wszystkie zmienne sesyjne
    session_destroy();
        $message=""; // Wiadomość po wylogowaniu
       
    // Sekcja logowania
    $login=$_POST[‘login’];
    if($login) {
      // W momencie kliknięcia w przycisk formularza
      $uzytkownik=$_POST[‘uzytkownik’];
      $md5_haslo=md5($_POST[‘haslo’]);
      // Koduje hasło funkcją md5().
     

    // Połączenie z bazą.
      $host="localhost"; // Nazwa hosta.
      $db_user=""; // Nazwa użytkownika - MySQL.
      $db_password=""; // Hasło do bazy.
      $database="baza"; // Nazwa bazy.
        mysql_connect($host,$db_user,$db_password);
        mysql_select_db($database);
    // Sprawdzenie nazwy użtkownika i hasła.
      $rezultat=mysql_query("select * FROM logowanie WHERE uzytkownik=’$uzytkownik’ AND haslo=’$md5_haslo’");
        if(@mysql_num_rows($rezultat)){
       session_register("uzytkownik"); // Zapamiętuje zmienną sesji
        header("location:main.php"); // Przekierowanie do strony main.php
      exit;
      }else {
      $message="Nieprawidłowa nazwa użytkownika lub hasło";
      }
    } // Koniec sprawdzania autoryzacji.
    ?>
    <head>

    <title>Dokument</title>
    </head>
      <body>
    <? echo $message; ?>
    <form id="form1" name="form1" method="post" action="<? echo $PHP_SELF; ?>">
      <table>
        <tr>
          <td>Użytkownik: </td>
          <td><input name="uzytkownik" type="text" id="uzytkownik" /></td>
        </tr>
        <tr>
          <td>Hasło: </td>
          <td><input name="haslo" type="password" id="haslo" /></td>
        </tr>
      </table>
    <input name="login" type="submit" id="login" value="login" />
    </form>
    </body>
    </html>

    Plik main.php zostaje wywołany w momencie, gdy autoryzacja się uda. W przeciwnym wypadku akcja przekieruje do pliku index.php

    Kod: php

    <?

    session_start(); // Na samej górze zadeklaruj sesję.
      if(!session_is_registered("uzytkownik")){ // Sprawdza zmienną sesji.
      header("location:index.php"); // Przekierowanie do index.php
    }
    ?>

    <head>

    <title>Dokument</title>
    </head>
        <body>
    <p>Witaj <? echo $_SESSION[‘uzytkownik’]; ?>! Jesteś zalogowany.</p>
    <p><a href="index.php">Wyloguj</a></p>
    </body>
    </html>
     

    Opracowanie: Adam Suchowski

  • Dodaj komentarz









    Komentarze
    72 odpowiedzi
    umpapumpa
    16 maj 2012, godz. 8:12

    a kto mi podpowie jakie znaczenia ma znak @ umieszczony na początku w poniższej linijce kodu?
    @ $login = $_POST[’uzytkownik’];

    ddddddddddddddd
    26 luty 2012, godz. 7:38

    lubie to…

    Bryk
    24 luty 2012, godz. 9:32

    A jak dodać nowe użytkownika?

    kuba
    5 styczeń 2012, godz. 3:22

    Witam, jak przerobic ten skrypt zeby w zaleznosci kto sie zaloguje kierowało na inna strone?

    Bartek
    25 wrzesień 2011, godz. 11:24

    UWAGA!
    Wszystkim którym to nie działa niech zmienią: apostrofy
    oraz KODOWANIE

    ficiek
    31 sierpień 2011, godz. 5:24

    Ciągle wyskakuje mi ‘błędne hasło bla bla bla’.
    Więc albo pomimo sprawdzenia 50 razy podałem złe dane albo skrypt jest lipny.

    asdd
    25 maj 2011, godz. 8:34

    A mi to nie działa. Jestem już tak blisko i nie mogę obczaić. Jak by ktoś był łaskaw odpisać mi na e-mail o co biega. . Zrobiłem tabele z 3 polami w mysql, potem tak jak poniżej i jestem na poziomie logowania. Wpisuje admin haslo 1234 i nie moge wejsc - nieprawidlowa nazwa lub haslo. Tylko ja nie wiem gdzie mam ustanowic ta nazwe i haslo. Gdy prubuje dodac nowy rekord to pokazuje ze wszystko ok, a to dalej stoi w miejscu. PLEASE HELP! xteer@op.pl

    Martin
    30 marzec 2011, godz. 8:45

    Witam
    Nie wiem dlaczego, ale nie przerzuca mnie na stronę main.php?
    Czy może ma ktoś już opracowany ten skrypt, jak tak prosze o maila
    Z góry dziękuję.

    Pablo
    24 luty 2011, godz. 9:39

    Jeśli komuś wywala błędy związane z PHP_SELF trzeba odkomentować w pliku php.ini zmienną register_globals.
    /etc/php5/apache2/php.ini

    ma wyglądać tak: register_globals=On

    Matikx
    11 listopad 2010, godz. 11:21

    męczyłem się nad tym skryptem, głównie według mnie… cała stronka logowania została źle opracowana - pod względem wygody i bezpieczeństwa; prosty to może on jest w wyglądzie, ale jako skrypt php na krasnalu mi nie działa.

    btw… lepsze zabezpieczenie według mnie to sha1(md5($_POST[”haslo”]));

    10 listopad 2010, godz. 9:01

    Jak korzystacie z tego skryptu to pamiętajcie o użyciu PDO to pomaga chronić przed SQL Injection

    Darchiv
    25 czerwiec 2010, godz. 9:13

    Jest to tabela bazy danych MySQL (coś jak Excel).
    Łap: http://pl.wikipedia.org/wiki/MySQL

    Artur
    14 czerwiec 2010, godz. 11:05

    co to jest ta tabela MYSQL? Muszę zrobić osobny plik txt z hasłami?

    tomputer
    29 styczeń 2010, godz. 11:52

    Prośba o podpowiedź co tak naprawde trzeba w tym skrypcie zmienić żeby zagrało

    zamotany
    27 styczeń 2010, godz. 10:48

    do mojego postu nizej: oczywiscie ciapki zamienilem na apostrofy

    zamotany
    27 styczeń 2010, godz. 10:46

    mam problem z linijka
    $rezultat=mysql_query(”select * FROM logowanie WHERE uzytkownik=’$uzytkownik’ AND haslo=’$md5_haslo’”);

    zawsze wyrzuca mi do niej blad Parse error: syntax error, unexpected T_VARIABLE in /virtual/ itd
    ktos wie o co moze chodzic?

    Janek
    18 grudzień 2009, godz. 12:01

    Mam pytanie, mianowicie w skrypice jest napisane:
    “>
    a pytanie z mojej strony to co to jest $PHP_SELF; do czego to sie odwoluje?

    th0rax
    1 grudzień 2009, godz. 5:32

    świetny prosty skrypcik! :)
    pare dni męczarni a potem okazało się że wystarczy apostrofy poprawić i śmiga aż miło ;]

    25 listopad 2009, godz. 6:31

    ej mi nic sie nie robi czemu tak jest????????????

    Baxx
    11 wrzesień 2009, godz. 10:52

    Skrypt jest dobrze napisany;)Mi działa:) daje 6!!!!!

    mariusz
    22 czerwiec 2009, godz. 9:54

    WItam, a może ktoś mi napisać jak wypisać później id zalogowanej osoby???
    Jest mi to potrzebne aby wypisać wszystkie dane z bazy osoby zalogowanej
    Proszę o pomoc mariuszgg@tlen.pl.

    8 czerwiec 2009, godz. 9:40

    Wszystko niby dobrze tylko do main.php nie przechodzi! o co biega? Może mi to ktoś wyjaśnić?

    maniek
    30 maj 2009, godz. 10:57

    a ja mam taki problem ze jesli wywale headera to wchodze do warunku
    if(@mysql_num_rows($rezultat))
    a jesli header jest to omija mi cale i wchodze w else od
    if($login)
    do tego nie moge wyechowac zadnej zmiennej, nawet POSTy … -_-

    Yo
    29 kwiecień 2009, godz. 12:09

    Może mi ktoś wytłumaczyć dlaczego w index.php jest:

    […]session_register(”uzytkownik”)[…],

    a nie:

    session_register($uzytkownik)
    bo nie mogę zrozumieć

    leonard
    23 marzec 2009, godz. 2:12

    zamien apostrofy na prawidłowe po skopiowaniu skryptu

    henry
    22 marzec 2009, godz. 9:57

    witam , mam problem , okienko do logowania się ładuje ale mam błąd w tej linijce

    $login=$_POST[’login’];

    vyder
    17 styczeń 2009, godz. 10:53

    Co do zabezpieczeń systemu logowania to przecież w tytule jest jasno napisane “[PHP] Prosty system do logowania”, więc należy spodziewać się istoty zagadnienia, a zabezpieczenia powinny zostać dodane po ogarnięciu tematu, więc uwagi o zagrożeniu jakie taki “goły” skrypt logowania za sobą niesie są nie na miejscu :P

    17 styczeń 2009, godz. 11:02

    Okej, wyrzuciłem kropki i działa ;)

    17 styczeń 2009, godz. 11:01

    Witam, a ja mam komunikat:
    Parse error: syntax error, unexpected ‘.’, expecting ‘]’ in /var/www/strona/index.php on line 10

    gdzie 10ta linia to:
    $login = mysql_escape_string($_POST[.login.]);

    Pomożecie ? :)

    Fev
    28 październik 2008, godz. 4:06

    A mi kuczę nie działa - bez przerwy po zalogowaniu pokazuje mi się znowu formularz…

    Anonim
    1 październik 2008, godz. 10:17

    Ten skrypt to jedna wielka porażka jak chcecie zabezpieczyć swoje tajne dane takim czymś to powodzenia :)

    Wpisałem w nim skrypcik OR 1 = 1 do wyciągania ciastek i haseł

    $uzytkownik=$_POST[‘uzytkownik’];
    ładne przejęcie żadnych zabezpieczeń i $uzytkownik ze złośliwym kodem fru do bazy danych

    select * FROM logowanie WHERE uzytkownik=’$uzytkownik’ AND haslo=’$md5_haslo’”
    cIEKAWI JESTEŚCIE CO SIĘ STANIE :d

    mam z was niezły polew

    ktoś
    6 czerwiec 2008, godz. 8:59

    jak zadeklarować sesje?:> niech ktos wytłumaczy mi to… z manualu sie nie dowiedziałem za bardzo..

    obcy
    6 czerwiec 2008, godz. 3:42

    działa - dzięki wielkie ;)

    Lucass
    5 czerwiec 2008, godz. 8:10

    Jesli Wam nie dziala, poprawcie recznie WSZYSTKIE apostrofy, u mnie pomogla porawa apostrofow w funkcjach post i w nastepujacej komendzie:
    $rezultat=mysql_query(”select * FROM logowanie WHERE uzytkownik=’$uzytkownik’ AND haslo=’$md5_haslo’”);

    teraz dziala, pozdrawiam

    bili
    17 maj 2008, godz. 10:27

    dziala dziala :D

    roman
    17 kwiecień 2008, godz. 10:01

    $db_password=”haslo”;
    pliku php nie można ściągnąć jak jest na chronionym ftp, a wynik działania pliku php w przeglądarce nie zwraca przypisań do zmiennych jeżeli się ich nie echuje :)

    Elok
    17 kwiecień 2008, godz. 9:08

    Ustaw typ pola id na int

    xyz
    5 kwiecień 2008, godz. 7:54

    “Baza z tabelą “logowanie” - z trzema polami: id(auto_increment), uzytkownik(varchar, 50), haslo(varchar, 32). ”

    tworze nową tabele i tworze te pola i pojawia sie błąd:

    “zapytanie SQL:

    CREATE TABLE `logowanie` (
    `id` VARCHAR( 55 ) NOT NULL AUTO_INCREMENT ,
    `uzytkownik` VARCHAR( 50 ) NOT NULL ,
    `haslo` VARCHAR( 32 ) NOT NULL
    ) ENGINE = MYISAM

    MySQL zwrócił komunikat: Dokumentacja
    #1063 - Incorrect column specifier for column ‘id’ ”

    hmm.. napisałby mi ktos to zapytanie jakie wkleic by bylo dobrze?

    “/ Połączenie z bazą.
    $host=”localhost”; // Nazwa hosta.
    $db_user=”"; // Nazwa użytkownika - MySQL.
    $db_password=”"; // Hasło do bazy.”

    w pliku php mam haslo niezaszyfrowane wpisać? przeciez ktos moze sobie sciagnac ten plik i bedzie widzial, tak samo z haslami…

    17 marzec 2008, godz. 8:06

    A tak poza tym to ok :)

    17 marzec 2008, godz. 8:06

    W ogóle nie filtrujesz zmiennych ;].
    Proponuje to zapisać tak:
    // Sekcja logowania
    $login = mysql_escape_string($_POST[’login’]);
    if($login) {
    // W momencie kliknięcia w przycisk formularza
    $uzytkownik = mysql_escape_string($_POST[’uzytkownik’]);
    $a = mysql_escape_string($_POST[’haslo’]);
    $md5_haslo=md5($a);
    // Koduje hasło funkcją md5().

    9 marzec 2008, godz. 4:37

    ten skrypt jest malo bezpieczny!!!

    radiuss
    16 grudzień 2007, godz. 9:18

    Witam!
    A ja mam problem nastepujacej tresci: po przejsciu przez logowanie do pliku main.php pojawia sie na stronie: “Witaj,
    Notice: Undefined variable: _SESSION in …
    ! Jesteś zalogowany.
    Wyloguj”
    Notice dotyczy tej lini kodu: “Witaj, ! Jesteś zalogowany.” Ktoś może wi dlaczego i o co chodzi?

    gustafitka
    5 grudzień 2007, godz. 1:56

    “No niestety nie dziala ten skrypcik. Wyglada calkiem fajnie ale nie przenosi do pliku main.php po zalogowaniu tylko wraca z powrotem do formularza logowania… Czy ktos wie jak to uruchomic?” - Mam ten sam problem moze mi LUKAS powiedziec co zrobiles i jak poprawiles srypcik

    Maras
    11 listopad 2007, godz. 10:15

    Można usunąć poprzednie - doszedłem do błędu :)

    Adamt - dziękuje :)

    Maras
    11 listopad 2007, godz. 10:04

    Udało się połączyć z serwerem!
    Udało się połączyć z bazą danych!

    Warning: session_register() [function.session-register]: Cannot send session cache limiter - headers already sent (output started at /home2/public_html/materialy/index.php:56) in /home2/public_html/materialy/index.php on line 106

    Dlaczego tak się dzieje?

    Warning: Cannot modify header information - headers already sent by (output started at /home2/ckunr1/public_html/materialy/index.php:56) in /home2/ckunr1/public_html/materialy/index.php on line 107

    adamt
    11 listopad 2007, godz. 9:34

    kliknij na napis mysql_connect w tutorialu i rozwiązanie gotowe ;)

    Maras
    11 listopad 2007, godz. 9:26

    Witam, mam pytanie co i gdzie trzeba dodać do tego skryptu żeby wyświetlało że połączenie z bazą powiodło sie lub połączenie z bazą nie powiodło się ?

    Z góry dzięki za odpowiedź

    Mikeeee
    2 listopad 2007, godz. 11:46

    Mam takie pytanie… bo juz wlasciwie mi wszystko dziala tyle ze jak wpisuje haslo 1234 do tego pola haslo to mi wyskakuje ze mam blad… :|
    mam wpisane 81dc9bdb52d04dc20036dbd8313ed055 jako haslo
    i mi nie dziala

    help

    greg
    31 październik 2007, godz. 7:01

    Nie dziala niektorym bo przy kopiowaniu i przeklejaniu zle apostrofy ‘ sa przy POST-ach i nie pobiera zmiennej w ogole. Pozmieniajcie apostrofy na prawidlowe i zacznie dzialac.

    adamt
    24 październik 2007, godz. 5:50

    connect robisz tylko raz na rzecz jednego skryptu, gdy już połączysz się z bazą poprawnie, to połączenie jest aktywne a kończy się wraz z zakończeniem działania skryptu. Nie musisz robić disconnect

    cygan
    24 październik 2007, godz. 11:59

    disconnect -> znaczy mam na myslo msql_close ;-)

    cygan
    24 październik 2007, godz. 11:56

    w index jest connect a czy powinno byc tez disconnect? i jesli tak to gdzie po else gdy ktos podal zle haslo, a jesli nie dajemy to czy w main.php na nowo trzeba robic connect jesli tam chce cos robic na bazie.

    alex
    19 wrzesień 2007, godz. 6:22

    Probuje zastosowac to do bazy mssql200 zamienilem zapytania np mssql_num_rows, hmm skrypt mi nie reaguje nie wiem jak taz z register_globals off , ma ktos moze jakies dzialajacy skrypt na mssql,
    ssg@gazeta.pl

    mychaexe
    13 wrzesień 2007, godz. 2:53

    witam!!!
    w końcu znalazłam i nareszcie działa mi logowanie ładnie ale przydał by sie formularz dodawania uzytkownika i hasła do bazy dla admina.
    Pozdrawiam

    kasia
    12 wrzesień 2007, godz. 2:56

    czyli najpierw w miejscu haslo mam podac wlasne to to mi wtedy zakoduje je na te cyferki i tyle a co z ta mysql musze miec jakas baze zalozona czy jak? hihihi help:)

    10 wrzesień 2007, godz. 11:01

    Witam ponownie. Skrypcik jednak dziala. Blad byl po mojej stronie i za szybko wystawilem komentarz. Polecam!

    6 wrzesień 2007, godz. 10:19

    No niestety nie dziala ten skrypcik. Wyglada calkiem fajnie ale nie przenosi do pliku main.php po zalogowaniu tylko wraca z powrotem do formularza logowania… Czy ktos wie jak to uruchomic?

    Maras
    30 sierpień 2007, godz. 11:48

    Działa :)

    admin
    13 sierpień 2007, godz. 10:35

    Poprawiłem skrypt i teraz powinno wszystko działać bez zarzutu. Dziękuję za uwagi.

    slawek
    12 sierpień 2007, godz. 5:00

    ja też mam identyczny problem, próbowałem już na wiele sposobów i niestety ale poddaję się, nie mam pojęcia czemu nie ma przekierowania do main.php, trudno szukam innych skryptów

    adamt
    12 sierpień 2007, godz. 1:55

    radek_alfa, masz racje, jeszcze zmieniony został sposób zapamiętywania sesji

    Maras, umieść na początku kogu < error_reporting(E_ALL ^ E_NOTICE); >, wyświetli Ci wykryte błędy

    12 sierpień 2007, godz. 10:29

    $database=”logowanie”; // Nazwa tabeli.
    troche wprowadza w błąd…. jak już to nazwa Bazy Danych bo nazwa tabeli jest bezposrednio w zapytaniu SQL

    Maras
    11 sierpień 2007, godz. 11:10

    adamt - pozmieniałem apostrofy na cudzysłowia i na odwrót, najdziwniejsze jest to że jak wpisuje jakieś bzdury w nazwie lub haśle BD to nie wyświetla komunikatu o źle podanym haśle lub użytkowniku na stronie.
    Pokazało mi błąd w tej lini
    “if(@mysql_num_rows($rezultat)!=‘0′){ ” - poprawiłem i od tej pory mam cały czas na stronie istnieją dwie tabelki UżYTKOWNIK, HASłO.

    adamt
    7 sierpień 2007, godz. 8:20

    Maras, sprawdź czy masz włączony JavaScript. Wydaje się że to może być Twój jedyny problem. W przypadku problemu z bazą wyświetlił by błąd zapytania. Pamiętaj także o dokładnym sprawdzeniu czy zamiast cudzysłowiów wpisałeś apostrofy i na odwrót.

    Maras
    3 sierpień 2007, godz. 8:59

    Nikon mam ten sam problem , nie przenosi do pliku main.php. Mógłby mi autor tego cacka całość przesłać na e-maila ? Prosił bym także o plik do importu do bazy MYSQL. Z góry dzięki

    nikon
    2 sierpień 2007, godz. 1:17

    Nie działa, walczę z tym od dwóch dni. Po wpisaniu hasła i loginu pozostaje tak jak było nie przenosi do main.php

    admin
    23 lipiec 2007, godz. 12:19

    Klikni w session_start() na tej stronie. Wszystkie funkcje w naszych przykładach są zlinkowane z manualem PHP. Tam jest wszystko wyjaśnione.

    krullu
    23 lipiec 2007, godz. 11:09

    o co chodzi z deklaracja sesji- mozna jakis przykład bo nie rozumiem

    zenek
    26 czerwiec 2007, godz. 7:40

    U mnie też, ustaw dobrze parametry w bazie

    carl
    26 czerwiec 2007, godz. 5:45

    U mnie działa, trzeba tylko sprawdzić czy dobrze się skopiowało

    blah
    26 czerwiec 2007, godz. 2:46

    nie działa…

    orka
    3 kwiecień 2007, godz. 12:57

    Ekstra tylko ja bym chciała żeby użytkownicy sami zakładali swoje loginy i hasła. Już coś z tego kumam. Może mi się to uda przerobić.

     
     
    Copyright © 2006-2011 egrafik.pl | Kontakt | Reklama | Projekty domów
    jocker