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">
<form action="registracia.php" method="post">
<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">
<form action="index.php?prihlas=1" method="post">
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.
mna osobne gramatika az tak netrapi.. ide hlavne o kvalitny informacny obsah
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..
presne ako hovoris, hlavny je obsah ! ja by som mal oooomnoho horsiu gramatiku, ale to je uz offtopic...
na gramatiku se vykaslete...
fajn clanok, zide sa... dik:) a na gramatiku sa vykasli ...
pekne spracovany kus kodu :) zaciatocnikovi pomoze :)
bude aj nieco vymakanejsie? (posielanie certifikatov / podpisovanie namiesto posielania hesla)
ja mam tento sprosty zvyk este z windowsov :)
---
Riadit pracu programatorov je ako past macky.
imho strasne zly navyk..
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.
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 :)
necital som to dako ale ked na to pozeram mas pravdu!! jednoznacne pouzit $_POST a $_GET pre vyssiu bezpecnost
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
sorry zle som sa vyjadril kazdopadne viem co si myslel
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.
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
budeme radi ak nam nakodis,okomentujes... dokonaly kod
vulnerable :((
no pokial viem tak ano a tiez nerozumiem tomu koli comu by tam malo byt 300 alebo hoc aj 255 je to zbytocne
netvrdím, že 255 znaků je optimální, ale 300 je prostě blbost. to ani nejde...
je to proste do 255 bajtov
jasne, to som si ani nevsimol :)
proste profik