Prihlasovanie v php

01.05.2006 19:33 | blackhole

Toto je jednoduchý systém prihlasovania užívateľov na stránku.
Cely princíp je v tom, že heslo je uložene iba v databáze a v url je nahradene kódom, ktorý sa mení pri prihlásení.
Ak nezvládate použitie session alebo cookies alebo by to bolo príliš zložité použitie tak myslím že toto je celkom vhodné.
"

Najprv vytvorenie jednoduchej tabuľky užívateľov:

CREATE TABLE `users` (
  `id` int(5) NOT NULL auto_increment,
  `login` varchar(20) NOT NULL default '',
  `heslo` varchar(300) NOT NULL default '',
  `code` int(10) NOT NULL default '0',
  `email` varchar(100) NOT NULL default '',
  `lastlog` datetime NOT NULL default '00:00:00 00-00-0000',
  `regcas` datetime NOT NULL default '00:00:00 00-00-0000',
  `ip` varchar(20) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 AUTO_INCREMENT=1 ;

Súbor so spojením na db:
<?php
$link = mysql_pconnect ( "localhost" , "root", "password") or die ("Nepodarilo sa spojiť zo serverom");
$db = mysql_select_db("moja_db", $link) or die ("Spojenie z databázov nefunguje");
// nastavenie znakovej sady
@mysql_query ("SET NAMES CP1250");
?>

Ďalej stránku z registráciou:
<?php
if (isset($_POST['login']) && isset($_POST['heslo']) && isset($_POST['hesloover'])){
// skontroluje či su všetky polička vyplnené
if ($_POST['login'] == "" || $_POST['heslo'] == "" || $_POST['email'] == "" || $_POST['hesloover']== ""){
die("Niečo si vynechal!");
}
// skontroluje či je heslo a overenie hesla rovnake
if ($_POST['heslo'] != $_POST['hesloover']){
die("Hesla musia byť rovnake!");
}
// kontrola či už neexistuje rovnaký login
include "subor_so_spojenim_na_db.php";
$query = "SELECT * FROM users WHERE login=\"".$_POST['login']."\"";
$result = mysql_query($query, $link) or die ("Chyba!");
$num = mysql_num_rows($result);
if ($num != 0){
echo "Niekto už používa rovnaký login!<br>";
die();
}
// koniec kontrola
// ošetrenie html tagov
$_POST['login'] = HTMLSpecialChars($_POST['login']);
$_POST['email'] = HTMLSpecialChars($_POST['email']);
$_POST['heslo'] = HTMLSpecialChars($_POST['heslo']);
$regcas = date("Y-m-d H:i:s", time());
$ip = $_SERVER["REMOTE_ADDR"];
$heslo = md5($_POST['heslo']);
$oprava = "INSERT INTO users (login,heslo,code,email,regcas,ip )VALUES ('".$_POST['login']."','".$heslo."','123456','".$_POST['email']."','".$regcas."','".$ip."')";$dooprava = mysql_query($oprava, $link) or die ("Registracia sa nepodarila.");
$hlaska = "<b>Registrácia bola úspešna!</ b>";
echo $hlaska;
}
?>

Registračný formulár:
<div align="center"><br>
<br><br>
<br><br>
<table border="0" cellspacing="0" cellpadding="0">
  &lt;form action="registracia.php" method="post"&gt;
  <tr>
<td><sup>* </sup> <b>Login:</b></td>
<td><input type="text" name="login" size="25" maxlength="150"></td>
  </tr>
  <tr>
<td><sup>* </sup> <b>E-Mail: </b></td>
<td><input type="text" name="email" size="25" maxlength="150"></td>
  </tr>
  <tr>
<td><sup>* </sup> <b>Heslo:</b></td>
<td><input type="password" name="heslo" size="25" maxlength="150"></td>
  </tr>
  <tr>
<td><sup>* </sup> <b>Potvrď heslo: </b></td>
<td><input type="password" name="hesloover" size="25" maxlength="150"></td>
  </tr>
</table>
<input type="submit" value="Registruj"><input type="reset" value="Vymazať">
</form><a href="/index.php"><input type="button" value="Prihlasenie"></a>
<br><div align="left">
<sup>*</sup> - tieto políčka musia byť vyplnené!<br>
</div></div>

A hlavná stránka index.php:
<?php
// hlasenie v java scripte
function hlaska($text){
  // nepodarilo sa mi to sem natrepať
}
if (isset($_GET['hlaska'])){
      hlaska($_GET['hlaska']);
}
// prihlasenie
if (isset($_POST['login']) && isset($_POST['heslo'])){
  include "subor_so_spojenim_na_db.php";
            @$query = "SELECT * FROM users WHERE login=\"".$_POST['login']."\"";
              if (!$query) {
                    echo "Spojenie z databázou sa nepodarilo";
                }
            @$result = mysql_query($query, $link);
              if (!$query) {
                    echo "Vyber z databázi sa nepodaril";
                }
                $cosi = mysql_fetch_array($result);
if ($cosi['heslo'] == md5($_POST['heslo'])){
      $code = rand(100000,999999);
      $time = date("Y-m-d H:i:s", time());
  $oprava = "UPDATE users SET code=\"".$code."\", lastlog=\"".$time."\" WHERE login=\"".$_POST['login']."\"";
  $dooprava = mysql_query($oprava, $link) or die ("Chyba!");
        header("Location: main.php?login=".$_POST['login']."&code=".$code."");
            }
}
?>

Formulár pre prihlásenie:
<div align="center">
&lt;form action="index.php?prihlas=1" method="post"&gt;
Login: <input type="text" name="login" size="20" maxlength="64"><br>
Heslo: <input type="password" name="heslo" size="20" maxlength="64"><br>
<input type="submit" value="Prihlás ma">
</form>
<a href="/registracia.php"><input type="button" value="Registracia"></a>
</div>

Stránka pre prihlásených užívateľov main.php:
<?php
include "script_so_zabespecenim.php";
include "subor_so_spojenim_na_db.php";
$query = "SELECT * FROM users WHERE login=\"".$_GET['login']."\"" ;
$result = mysql_query($query, $link) or die ("Dačo je blbé!");
$cosi = mysql_fetch_array($result);
  echo "Vitaj uživateľ <b>".$_GET['login'] ."</b>, zaregistrovaný". $cosi ['regcas']."<br>Posledné prihlasenie: ". $cosi ['regcas']."<br><br>" ;
?>

<a href="/<?php echo "main.php?login=".$_GET['login']."&code=".$_GET['code']."&do=spev"; ?>">Zaspievaj </a>
<br>
<a href="/<?php echo "main.php?login=".$_GET['login']."&code=".$_GET['code']."&do=tanec"; ?>">Zatancuj </a>
<br>
<a href="/<?php echo "main.php?login=".$_GET['login']."&code=000000"; ?>">Odhlas sa </a>
<br>

<?php
if (isset($_GET['do'])){
  if ($_GET['do'] == "spev"){
        echo "<br>Spievam!";
  } elseif ($_GET['do'] == "tanec"){
        echo "<br>Tancujem!";
  }
}
?>

A nakoniec súbor zo zabezpečením:
<?php
// kontrola spravnosti url
if (!isset($_GET['login']) || !isset($_GET['code'])) {
      header("Location: index.php?hlaska=Chyba login, alebo code!");
}
// skontroluej ci existuje subor so spojenim
if (file_exists("subor_so_spojenim_na_db.php")){
}else {
// ak neexistuje spojenie zastavi načitanie stranky
include "daky_flip.php";
echo "<b>Mimo prevadzky...</b>";
die();
}
include "subor_so_spojenim_na_db.php";
$query = "SELECT * FROM users WHERE login=\"".$_GET['login']."\"" ;
$result = mysql_query($query, $link) or die ("Dačo je blbé!");
$cosi = mysql_fetch_array($result);
$num = mysql_num_rows($result);
// kontrola ci dany user existuje
if ($num != 1) {
            header("Location: index.php?hlaska=Neexistujuci uživateľ!");
}
// kontrola kodu
if ($_GET['code'] != $cosi['code']) {
$newcode = rand(100000, 999999);
$oprava = "UPDATE users SET code=\"".$newcode."\" WHERE login=\"".$_GET['login']."\"";
$dooprava = mysql_query($oprava, $link) or die ( "SQL dotaz secure sa nepodaril" );
            header("Location: index.php?hlaska=Boli ste odhláseny");
            die();
}
?>

Ukážka | Hotove zdrojaky
Mal som menšie problémy z vkladanim sem kodov a nepodarilo sa mi vložiť jednu funkciu. Takže tu je: Hláška a všetky kody ešte raz: Kody

Nieje to nič oslňujúce, ale svoj účel splní. Ďalej sa to dá doplniť kontrolou aktivity usera, a prípade neaktívnosti zmení kód.

    • gramatika 01.05.2006 | 22:25
      Avatar blackhole_yurij   Používateľ
      skript som neskusal, ale skus si davat pozor na gramatiku. z databázov, z databazi ... neber to ako buzerovanie
      -- rozculovat sa nad sprostostou inych znamena ublizovat sam sebe
      • ... 01.05.2006 | 22:30
        Avatar patie   Návštevník

        mna osobne gramatika az tak netrapi.. ide hlavne o kvalitny informacny obsah

        zivot je tazky - jeden z najtazsich
        • suhlas 01.05.2006 | 22:42
          Avatar blackhole_yurij   Používateľ
          suhlasim, ale ked je clanok napisany gramaticky spravne, pozdvihne to jeho uroven (alebo zla gramatika uroven znizi :) )
          -- rozculovat sa nad sprostostou inych znamena ublizovat sam sebe
          • Polepsim sa 01.05.2006 | 23:51
            Avatar blackhole   Návštevník

            No snazil som sa co najmenej chyb spraviť ale word som nechcel nechat rypať do kodov
            ----
            And your dark satan was the same as your god..

        • jj 02.05.2006 | 09:31
          Avatar blackhole   Návštevník

          presne ako hovoris, hlavny je obsah ! ja by som mal oooomnoho horsiu gramatiku, ale to je uz offtopic...

    • na gramatiku se vykaslete... 02.05.2006 | 13:26
      Avatar blackhole   Návštevník

      na gramatiku se vykaslete...

    • :) 02.05.2006 | 14:23
      Avatar blackhole   Návštevník
      par chybiciek v gramatike nikoho nezabije, ale dobry clanok - http://mattonik.funpic.de -
    • e 02.05.2006 | 16:19
      Avatar blackhole_thomm   Používateľ

      fajn clanok, zide sa... dik:) a na gramatiku sa vykasli ...

    • imho bych spis pouzil pear 02.05.2006 | 17:27
      Avatar blackhole   Návštevník
      imho bych spis pouzil pear nez neco slozite vymyslet
    • what's next? 02.05.2006 | 20:11
      Avatar blackhole_ventYl   Používateľ

      pekne spracovany kus kodu :) zaciatocnikovi pomoze :)
      bude aj nieco vymakanejsie? (posielanie certifikatov / podpisovanie namiesto posielania hesla)

      --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
    • . 02.05.2006 | 23:05
      Avatar blackhole   Návštevník
      hmm prihlasovat sa do mysql ako root.. neni nad dobre zvyky ;-)
      • root@mysql 03.05.2006 | 14:34
        Avatar blackhole_ventYl   Používateľ

        ja mam tento sprosty zvyk este z windowsov :)

        ---
        Riadit pracu programatorov je ako past macky.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
        • imho 03.05.2006 | 16:28
          Avatar patie   Návštevník

          imho strasne zly navyk..

          zivot je tazky - jeden z najtazsich
          • ta... 03.05.2006 | 23:16
            Avatar blackhole_ventYl   Používateľ

            ta budem ti hovorit, ked ja mam zdaleka najzapamatatelnejsie heslo do mysql na roota :) (Ale nejedna sa o ziadne slovicko, je to pure zmet cisel pismen a inych znakov)

            ---
            Riadit pracu programatorov je ako past macky.

            --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
    • huh? 03.05.2006 | 01:56
      Avatar blackhole   Návštevník

      co vam yebe? ze kvalitny kod :)
      co tak osetrit user input, ked uz riesime taku vec, ako je autentikacia? :)
      pchat $_GET a $_POST rovno do sql, no fuj. opravte to prosim, kym to dakto nepouzije :)

      • uff 03.05.2006 | 16:29
        Avatar patie   Návštevník

        necital som to dako ale ked na to pozeram mas pravdu!! jednoznacne pouzit $_POST a $_GET pre vyssiu bezpecnost

        zivot je tazky - jeden z najtazsich
        • ee 03.05.2006 | 17:10
          Avatar blackhole   Návštevník

          nie ze pouzit, ale osetrit.
          napr. zistit magic_quotes_gpc a ak je 0, addslashnut input pri zapise a stripslashnut pri citani. to hovorim o stringoch, samozrejme

          • no.. 03.05.2006 | 17:16
            Avatar patie   Návštevník

            sorry zle som sa vyjadril kazdopadne viem co si myslel

            zivot je tazky - jeden z najtazsich
    • Timeout 03.05.2006 | 11:01
      Avatar blackhole   Návštevník
      Celkom dobry kod. BTW vie mi niekto napovedat, ako sa asi principialne riesi odhlasenie usera po nejakom case. Trebars, user smie byt zahlaseny iba 5 min. BTW(2) pri odhlasovani sa robi "session_destroy()" ??
      • Odhlasovanie sa robi asi 03.05.2006 | 14:33
        Avatar blackhole_ventYl   Používateľ

        Odhlasovanie sa robi asi tak, ze ak mas niekde v tabulke zoznam prihlasenych uzivatelov, tak si pri nich poznacis unix_timestamp, kedy od nich prisiel posledny request.
        Na zaciatok autentifikacnej kniznice (a toto je dolezite) das nasledujuci SQL prikaz:

        DELETE FROM logged WHERE ts<(UNIX_TIMESTAMP(NOW())-300);

        s predpokladom, ze mas tabulku v ktorej jeden riadok prislucha kazdemu prihlasenemu (nie registrovanemu) uzivatelovi a ts obsahuje UNIX timestamp posledneho poziadavku uzivatela.

        ako je to so sessnami, ti neporadim, pac ich nepouzivam :)

        ---
        Riadit pracu programatorov je ako past macky.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
      • session 06.05.2006 | 13:53
        Avatar patie   Návštevník

        1) odhlasenie riesi samotne php nastavuje sa to v php konfiguracnom subore po akej dobe ma automaticky zrusit session.. 2) ano session_destroy() zrusi celu session

        http://pl.php.net/manual/en/ref.session.php

        zivot je tazky - jeden z najtazsich
    • Ucel samotneho skriptu 03.05.2006 | 20:00
      Avatar lowec   Používateľ
      No cely tento samotny skript mi pripada dost okliesteny...skutocne az moc. Je minimalne osetreny a maximalne nebezpecny. Je to pekna (a hlavne prehladna, naco ja davam doraz) kostra jednoducheho loginu nicmene v dnesnom svete nepouzitelna.
      • dokonaly kod 03.05.2006 | 20:45
        Avatar patie   Návštevník

        budeme radi ak nam nakodis,okomentujes... dokonaly kod

        zivot je tazky - jeden z najtazsich
    • vulnerable :(( 04.05.2006 | 12:44
      Avatar blackhole   Návštevník

      vulnerable :((

    • vytvoření tabulky 11.05.2006 | 00:06
      Avatar blackhole   Návštevník
      .....varchar(300).... varchart může mít max 255 znaků, ne?
      • jj 11.05.2006 | 09:17
        Avatar patie   Návštevník

        no pokial viem tak ano a tiez nerozumiem tomu koli comu by tam malo byt 300 alebo hoc aj 255 je to zbytocne

        zivot je tazky - jeden z najtazsich
        • netvrdím, že 255 znaků je 11.05.2006 | 13:03
          Avatar blackhole   Návštevník

          netvrdím, že 255 znaků je optimální, ale 300 je prostě blbost. to ani nejde...

          • jo jasne 11.05.2006 | 13:57
            Avatar patie   Návštevník

            je to proste do 255 bajtov

            zivot je tazky - jeden z najtazsich
      • :) 11.05.2006 | 13:43
        Avatar blackhole   Návštevník

        jasne, to som si ani nevsimol :)
        proste profik