Anonymous
4.04.2004, 15:01:01
Witam.
W jaki sposob najefektywniej mozna napisac skrypt zakladajacy konta plus aktywacja przez email. Mam juz napisany skrypt logujacy, lecz mam problemy z zakladaniem kont. Nie wiem jakich funkcji uzyc, aby proces ten byl bezpieczny, bylbym wdzieczny za ich wymienienie (w manualu sam poszukam ich funkcjonowania). Poza tym mam ksiazke php 4 Od Podstaw i tam jest taki przykladowy kod (choc stary i juz troche nieuzyteczny) ale nie moge go zmodykowac do wlasnych potrzeb, po prostu go nie rozumiem ;/ Widze tam wiele funkcji np create_acount ale nie wiem czy ich stosowanie jest konieczne i praktyczne (bo przeciez swiat idzie naprzod i od czasu wydania ksiazki moglo sie wiele zmienic). Jesli chodzi o moj php to znam podstawy, na mysql tez troche sie znam. Napisalem juz ksiege gosci, wczesniej wspominiane logowanie i teraz zabieram sie wlasnie za zakladanie kont. Tak jak mowilem wczesniej - bede wdzieczny za jakies ciekawe rozwiazania, funkcje badz nawet przykladowe kody.
PS: Przeszukalem forum ale niestety nie znalazlem tak zinterpretowanego topicu i odpowiedzi jak moj. Pozdrawiam.
halfik
4.04.2004, 17:13:05
user wypełnia forma, sprawdzasz czy wszsytko jest wporzadkum.in czy nie ma juz takiego usera, czy podal wsystkie dane jakich oczekujesz itd. Jak tak, to zapisujesz te dane do tabeli na bazienp. konta_oczekujace (procz tego w tej tabeli masz klucz - do jego wygenerowania mozesz uzyc np. md5($nick$pass) ), a do user idzie mail z kluczem. Jak suer kliknie na linka, to odpala sie skrypt, ktoy szuka w konta_oczekujace wpisu z takim kluczem i jak jest to kopiuje dane z tej tabeli do tabeli uzytkownicy, a nastepnie usuwa wpis z konta_oczekujace. Tak poza tym od czasu do czasu trzeba czyscic tabele: czyli np. dodatkowo w konta_oczekujace masz czas waznosci np. 48 h. skrypt rejestrujacy zawse jak ktos go "odpali" sprawdza ta tabele i usuwa nieaktualne juz wpisy. No to tyle w skrocie.
moze Ci pomoze jak napisze Ci jak ja mam to zorganizowane:)
1) uzytkownik wypelnie formularz do zalozenia nowego konta (nick + mail)
2) generuje dla niego haslo tymczasowe. Robie to korzystajac z funckji:
[php:1:741d82f634]<?php
function CreatePassword()
{
$integer=rand();
$md5 = md5 ((string) ($integer));
$pass=substr($md5,6,8);
return $pass;
}
?>[/php:1:741d82f634]
3) nastepenie umieszcam to haslo w bazie i wysylam do uzytkownika mail, w ktoyrm jest link prowadzacy do strony,na ktorej zmienia on sobie haslo na swoje i uzupelnia reszte informacji w profilu. Link jest w formie:
[xml:1:741d82f634]http://costam.pl/pierwsze_logowanie.php?user=nazwa_uzytkownika&pass=jego_haslo[/xml:1:741d82f634]
UPDATE: w momencie wyslania maila wpisujesz usera do bazy z wartoscia pola active na 0. Jesli taki wpis istnieje w bazie dluzej niz x czasu to go poprostu wywalasz.
Anonymous
4.04.2004, 17:44:03
Dzieki, bardzo pomogly mi wasze komentarze. Mimo wszystko nadal nie wiem jakich funkcji użyć do zapisania danych użytkownika do bazy danych (aktywacja to oddzielna dzialka). Potrafie sprawdzac poprawnosc pol i z tym nie powinno byc problemow, mam raczej na mysli jak zapisac BEZPIECZNIE do bazy informacje z formularza. Odwolam sie tu np do ksiegi gosci. Wowczas w niej po sprawdzeniu informacji wpisu zapisywalem dane w tradycyjny sposob (nick, data, ip, email, tresc). Nie mialem z tym wowczas problemow. Nie wiem tylko czy w rejestracji ten sposob bedzie takze efektywny i bezpieczny... kiedy przejrzalem kod w ksiazce "php 4 Od Podstaw" to zauwazylem w nim wiele nowych funkcji, wyraznie dane zostaly zapisywane w inny sposob.
Funkcje uzyte w tym skrypcie to:
register_form
in_use
create_account
W ksiedze gosci np tych funkcji nie musialem uzywac...
Anonymous
4.04.2004, 17:47:37
Aha... Spodobal mi sie ten pomysl halfika odnosnie aktywacji kont (oddzielna baza konta_oczekujace). Czy to efektywny sposob czy ktos ma lepszy pomysl...?
Ja mam troche inaczej zrobione. Wykorzystuje tu mySQL. Mam jedną tabele. Są w niej pola które identyfikują usera czyli: nick, email itd co wpisał przy rejstarcji i jest pole "active", domyslnie jest ustawione na 0 wtedy user jest nieaktywany, jest tez pole uid, gdzie zapisuje sie unikalny identyfikator usera, przy rejstaracji wysyałam meila z tym uid i odpowiedni skrypt aktywuje konto, zmienia w tabeli wartość pola "active" na 1 i wtedy user jest aktywny. A co do tego ktore jest efektywniejsze to ci nie powiem, bo to chyba zalezy od osoby ktora pisze skrypt, jego uiejętnosc i jak on to sobie zaplanował
Anonymous
4.04.2004, 19:31:20
A podczas logowania jak wyszukujesz login i haslo uzytkownika to sprawdzasz takze czy ma aktywne konto?
To tak. Podczas logowania sprawdzam czy login i hasło zgadza sie i czy pole active jest na 1 jezeli nie to wiadomo ze sie nie zaloguje. PS. Jutro ci opisze dokłanie co i jak, bo dzis juz mi sie nie chce
Anonymous
4.04.2004, 19:51:36
Okej, będe cierpliwie czekał
rafcio8405
5.04.2004, 13:14:39
W tworzeni takiego systemu najlepiej sie oprzeć o sesje i/lub ciasteczka! Rejestrowanie nowego użytkownika polega na utworzeni bazy danych gdzie będą przechowywane dane takie jak e-mail, loging, hasło, a dla kont z aktywacją dodatkowe pole gdzie występuje albo 0 gdy konto nie aktywne albo 1 gdy konto aktywne sam coś takiego mam na swojej stronce! Baza danych to może być SQL, MySQL oraz pliki binarne (*.txt) Kiedyś logowanie było dla mnie czarną magią a teraz jak zrozumaiłem zasadę działania!
poczytaj sobie w manualu o sesjach!
eS...
5.04.2004, 13:20:48
Cytat
Baza danych to może być SQL
hmm a co to za baza??
rafcio8405
5.04.2004, 13:25:51
Baza to tam stacjonuje wojsko!!
Chodzi mi że tworzysz jak u mnie na stronie plik o odpowiedniej nazwie (zazwyczaj nazwa użytkownika) do której są zapisywane odpowiednie dane potrzebne Ci do identyfikacji danego usera!! Jak nie rozumiesz to nie mój problem!!!
arogancik
5.04.2004, 13:28:57
wydaje mi sie rafcio, ze to głupie rozweiązanie. jesli juz bawisz sie na plikach, to lepiej wszystko wrzucić do jednego i tylko pola jakos porozdzielać i bedzie to czytelniejsze.
wydaje mi sie ze prościej jest edytować jeden plik niz kilkanascie
rafcio8405
5.04.2004, 13:40:55
Mam jedno pytanie a jak ktoś zdobędzie twoj plik z danymi to co będzie znał hasła wiem że kto by chciał zdobywać w takim serwisie kody ale od czegośhakerzy zaczynają a ja chcem żeby moi użytkownicy mieli 80% pewności że nik nie będzie ruszał ich kont a w przyszłości chcem dojść do 99% pewności!! Ale błędem jest nazywać 100% pewność że się nikt tego nie rozgryzie bo dla w prawionych każda blokada jest do złamania to tylko kwestja czasu!!! U mnie jest dosyć proste ale na tyle utrudnione logowanie jak to możliwe!! Masz rację jest to kłopot bo trzeba coś tworzyć aby pokazywać ilu jest zarejestrownych użytkowników i u mnie jest to w opracowaniu!! Nie mówię że nie masz racji!! a tam napisałem zazwyczaj czyli nie koniecznie!! Zabezpieczenia jak to można nazwać to:
>Nie umieszczać pliku z logowaniem w folderach typu
>>Loging
>>User, Users
>>Log
>Pliki, które mają przechowywać nie powinny być zozszeżeniem *.txt
Najlepiej swoje rozszeżenie wymyśleć itp. itd.
arogancik
5.04.2004, 13:44:02
było juz pisane ze pliku z hasłami nie da sie zabezpieczyc, ale mozna skorzystać z htaccess, albo dać rozszerzenie.php i wsatwić wszystko jako komenatrze. wtedy tylko trzeba bedzie pozbyc się zanczków komentarzy i wszystko bedzie w pożądku. co innego jesli ktoś złamie twoje hasło ftp, ale wtedy to co innego bo tak czy siak bedzie mógł sobie skopiowac wszystko
Anonymous
5.04.2004, 16:11:44
Dzieki za rady, aczkolwiek logowanie na sesjach (plus ciachu) mam juz napisane. Jest oparte o mysql z recznie dodawanymi userami w phpmyadmin, dlategotez teraz probuje napisac jakis dobry skrypt rejestrujacy z aktywacja kont. Jesli chodzi o bezpieczenstwo mojego skryptu, to ocenie je na b.dobre, a nie na celujace z tej samej przyczyny, ktora podal rafcio. Czekam na opis Liko, a poki co ide pisac rozprawke.
1. User wchodzi do mnie na stronę i rejstruje się. Podaje dane w formularzu takie jak: nick, hasło, e-mail, data urodzenia, wiek, opcjonalnie Imię i Nazwisko. Klika zarejstruj.
2. W tym momęcie dane zostają dodane do bazy danych w moim wypadku jest to baza mySQL. Mam tabele o nazwie users z polami: nick, hasło, e-mail, data_urodzenia, wiek, imię, nazwisko, uid, register_time, active, last_login. W polu nick znajduje się nick podany w formularzu, w polu hasło znajduje się hasło, które zostało zahaszowane przez algorytm MD5() w przypadku mySQL posiada on funkcje password, która jest odpowiednikiem funckji MD5 w php. W polach e-mail, data_urodzenia, wiek, imię, nazwisko są warstości w niezminionej postaci, które zostały wypełnione w formularzu. Pole uid jest polem unikalnym dzięki któremu identyfikuje usera. Powstaje ono przy zapisie do bazy danych z funkcji:
time(),
sha1(),
md5() i
uniqid() co powoduje, że powtorzenie się ciągu znaków jest praktycznie niemożliwe. Pole active jest po to, żeby sprawdzic czy user jest aktywny czy nie. W polu last_login zapisywana jest data ostatniego zalogowania.
3. W tym samym czasię co dodanie danych do bazy nastepuje wysłanie e-mail'a z kluczem aktywującym. Tym kluczem jest ciąg znaków z pola uid. Po wejsciu na odpowiednią stronę, skrypt aktalizuje pole active zmieniając jego wartość na 1 (czyli user jest teraz aktywny).
4. Logowanie odbywa się na zasadzie podania odpowiedniego loginu i hasła. Jeżeli nie mamy hasła bo zapomnieliśmy, wykorzystujemy funkcje do przypomnienia go. W polu do tego przeznaczonym wpisujemy (wklejamy) unikalny identyfikator, który otrzymalismy e-mailem aktywującym konto. Jeżeli go też nie mamy, to klikam w odpowiedni link, który przeniesie mnie do przypominacza hasła konwencjonalnego gdzie wpisujemy login i date urodzenia. Wtedy admin otrzymuje komunikat w panelu admia, że nastepujący użytkownik zapomniał hasła. Konto zostaje dezaktywowane. W czasie do dwóch dni admin upewnia się to ta osoba i konto zostaje usunięte. Wtedy user może założyc se nowe. W logowaniu opieram się na sesjach wbudowanych w php, choć zamierzam napisać własną klasę obsługującą sesje, lecz zastanawiam się jak to ma wyglądać.
W sesji jest zapisywany "uid", dzięki któremu identyfikuje usera na wszystkich podstronach.
Nakreśliłem ci zarys tego co ja zrobiłem, lecz nie podawałem kodu, żebyś sam doszedł do tego i rozumiał każdą rzecz. Jeśli są jakieś pytania do tego to pisz, spróbuje odpowiedzieć.
Anonymous
7.04.2004, 13:40:30
Okej dzieki, a jak powinna wygladac struktura pola active?
Nie bardzo rozumiem
Anonymous
7.04.2004, 18:19:57
Struktura w MySQL pola Active. Czy ma być to może pole typu VARCHAR, MEDIUMINT, może ma być to pole binarne, może podstawowe lub unikalne... o to mi chodzi.
Anonymous
7.04.2004, 19:18:42
int
1 dla katywny
0 nieaktywny
dokładnie pole typu integer enum(0, 1) default 0
Anonymous
8.04.2004, 13:02:32
Okej, rozplanowalem juz mniejwiecej stukture bazy danych:
Cytat
CREATE TABLE `user` (
`id` mediumint(10) NOT NULL auto_increment,
`login` varchar(8) binary NOT NULL default '',
`haslo` varchar(20) binary NOT NULL default '',
`email` varchar(50) NOT NULL default '',
`miasto` varchar(50) NOT NULL default '',
`plec` enum('M','K') default 'M',
`ip` varchar(50) NOT NULL default '',
`datarejestracji` datetime NOT NULL default '0000-00-00 00:00:00',
`datalogowania` timestamp(14) NOT NULL,
`status` enum('0','1') default '0',
PRIMARY KEY (`login`),
UNIQUE KEY `id` (`id`),
KEY `id_2` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
Czy może tak zostać?
No i jak napisac zapytanie, żeby podczas logowania wyszukiwało tylko tych osób, które w status mają "1" (status=aktywacja). Bo z tego co mowil Liko to wychodzi na to, ze najpierw szukamy usera i jesli istnieje to dopiero sprawdzamy czy jest aktywowany... czy nie jest to zbyt okrężny sposób (strata czasu) ?
SELECT * FROM user WHERE login = $login AND haslo = md5($haslo) AND status = 1 LIMIT 1 Wtedy znajduje ci tylko osbe z taki loginem i hasłem ktora ma pole status 1. Jest to przykładowe zapytanie, musisz je odpowiednio przerobic pod swoj skrypt
Anonymous
8.04.2004, 15:40:15
Dałem zapytanie:
Kod
$query = "SELECT * FROM $user_tablename WHERE login = '$login' AND haslo = password('$haslo') AND status = 1 LIMIT 1";
z którego można wywnioskować, że zostanie zalogowany tylko ten, który zostanie znaleziony w bazie ($user_tablename to zmienna, aczkolwiek prowadzi do prawidlowej bazy!) oraz ten któremu hasło się zgadza z wpisanym w formularzu i którego status w bazie wynosi 1! Problem w tym, że loguje każdego usera któremu STATUS = 0. Jeśli ktoś ma STATUS = 1 to go o dziwo nie zaloguje! Moje pytanie, dlaczego?
PS: Narazie tworze userow recznie w phpmyadmin i testuje logowanie.
A pokaz funckje ktora loguje i która sprawdza czy jest zalogowany.
Anonymous
8.04.2004, 17:09:17
O to ta funkcja:
[php:1:69055a99a1]<?php
function auth_user($login, $haslo) {
global $default_dbname, $user_tablename;
$link_id = db_connect($default_dbname);
$query = "SELECT * FROM $user_tablename WHERE login = '$login' AND haslo = password('$haslo') AND status = 1 LIMIT 1";
$result = mysql_query($query);
if(!mysql_num_rows($result)) return 0;
else {
$query_data = mysql_fetch_row($result);
return $query_data[0];
}
}
function witaj($user)
{
echo "Witaj $user! [ <a href="logout.php">Wyloguj</a> ]";
}
function login_form() {
global $PHP_SELF;
?>[/php:1:69055a99a1]
Anonymous
8.04.2004, 17:17:20
Aha i jeszcze funkcja sprawdzajaca dane w w środku skryptu [auth_user, w poprzednim poście podałem strukture tej funkcji]:
[php:1:f88ae5a29e]<?php
if (!auth_user($_POST['user'], $_POST['pass']))
{
echo "Niepoprawny login lub/i hasło!";
}
?>[/php:1:f88ae5a29e]
Z góry wielkie dzięki.
Nie wiem ale troche dziwnie to zrobiłes ja mam taką klase, choc jeszcze nie skoczoną:[php:1:e20a6da4d7]<?php
class auth
{
var $auth_nick;
var $auth_pass;
var $auth_mail;
function is_login() // sprawdz czy jest sie zalogowanym
{ global $db; // poczatek funkcji
if( isset($_SESSION['www_nick']) && isset($_SESSION['www_pass']) ) // 1
{
$db->db_query( "SELECT nick, pass FROM users WHERE nick='$_SESSION[www_nick]' AND pass='$_SESSION[www_pass]' AND status='1'" );
if( $db->db_num_rows()==1 ) // 2
{
$return = TRUE;
} else {
$return = FALSE;
} // koniec 2
} else {
$return = FALSE;
} // koniec 1
return $return;
} // koniec funkcji
function login() // funkcja ktora loguje
{ global $db; // poczatek funkcji
if( isset($_POST['nick']) && isset($_POST['pass']) && $_POST['auth_login'] ) // 1
{
$login = $_POST['nick'];
$password = $_POST['pass'];
$db->db_query( "SELECT nick, pass FROM users WHERE nick='$login' AND pass=md5('$password') AND status='1'" );
if( $db->db_num_rows()==1 ) // 2
{
$r = $db->db_fetch_array();
$this->auth_nick = $r['nick'];
$this->auth_pass = $r['pass'];
if( $login==$this->auth_nick && md5($password)==$this->auth_pass ) // 3
{
$_SESSION['www_nick'] = $this->auth_nick;
$_SESSION['www_pass'] = $this->auth_pass;
} // koniec 3
} // koniec 2
} // koniec 1
} // koniec funkcji
} // koniec klasy
?>[/php:1:e20a6da4d7]
Mi to działa jak trzeba. Wywołuje ją poprzez :[php:1:e20a6da4d7]<?php
$auth = new auth();
$auth->login();
if($auth->is_login()) {
//jakas akcja
} else {
echo "blad";
}
?>[/php:1:e20a6da4d7]
Nie tutaj jeszcze obsługi tego uid bo musze napisac kilka rzeczy do strony zeby obsługiwał według tego uid, ale zawsze mozesz zmienic cos samemu dorobic
Anonymous
9.04.2004, 08:33:12
A czy nikt nic nie podejrzewa co może być źle w moim skrypcie :?
[php:1:5c4d6efe2d]<?php
function auth_user($login, $haslo) {
global $default_dbname, $user_tablename;
$link_id = db_connect($default_dbname);
$query = "SELECT * FROM $user_tablename WHERE login = '$login' AND haslo =
password('$haslo') AND status = 1 LIMIT 1";
$result = mysql_query($query);
if(!mysql_num_rows($result)) return 0;
else {
$query_data = mysql_fetch_row($result);
return $query_data[0];
}
}
function witaj($user)
{
echo "Witaj $user! [ <a href="logout.php">Wyloguj</a> ]";
}
function login_form() {
global $PHP_SELF;
?>[/php:1:5c4d6efe2d]
Ja wogole nie kapuje po co ty taką zrobiłes ? co ty zwracasz przez funckje ?. Muszisz mieć która loguje, czyli zapisuje zmienne sesyjne, lub ciach czy co kolwiek i funkcje która sprawdza czy dane w zmiennej odpowiadają danym w tabeli. Wez se z mojego skryptu jak nie wiesz jak napisac swoje.
?>[/php]
Anonymous
9.04.2004, 13:10:50
Patrz po co:
[php:1:4272a09ba2]<?php
<?php
include "./common_db.inc";
$register_script = "./register.php";
function auth_user($login, $haslo) {
global $default_dbname, $user_tablename;
$link_id = db_connect($default_dbname);
$query = "SELECT * FROM $user_tablename WHERE login = '$login' AND haslo = password('$haslo') AND status = 1 LIMIT 1";
$result = mysql_query($query);
if(!mysql_num_rows($result)) return 0;
else {
$query_data = mysql_fetch_row($result);
return $query_data[0];
}
}
function witaj($user)
{
echo "Witaj $user! [ <a href="logout.php">Wyloguj</a> ]";
}
function login_form() {
global $PHP_SELF;
?>
<HTML>
<HEAD>
<TITLE>Logowanie</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="<? echo $PHP_SELF ?>">
<DIV ALIGN="CENTER"><CENTER>
<H3>Aby uzyskać dostęp do żądanych stron, proszę się zalogować</H3>
<TABLE BORDER="0" WIDTH="200" CELLPADDING="2">
<TR>
<TH WIDTH="18%" ALIGN="RIGHT" NOWRAP>Identyfikator</TH>
<TD WIDTH="82%" NOWRAP>
<INPUT TYPE="TEXT" NAME="user" SIZE="8">
</TD>
</TR>
<TR>
<TH WIDTH="18%" ALIGN="RIGHT" NOWRAP>Hasło</TH>
<TD WIDTH="82%" NOWRAP>
<INPUT TYPE="PASSWORD" NAME="pass" SIZE="8">
</TD>
</TR>
<TR>
<TD WIDTH="100%" COLSPAN="2" ALIGN="CENTER" NOWRAP>
<INPUT TYPE="Checkbox" NAME="autologowanie">
Automatyczne logowanie
</TD>
</TR>
<TR>
<TD>
<A HREF="register.php">Załóż bloga!</a>
</TD>
</TR>
<TR>
<TD WIDTH="100%" COLSPAN="2" ALIGN="CENTER" NOWRAP>
<INPUT TYPE="SUBMIT" VALUE="LOGOWANIE" NAME="Submit">
</TD>
</TR>
</TABLE>
</CENTER></DIV>
</FORM>
</BODY>
</HTML>
<?
}
session_start();
if (isset( $_SESSION['user']))
{
witaj( $_SESSION['user']);
}
elseif (isset($_COOKIE['user']))
{
if (!auth_user($_COOKIE['user'], $_COOKIE['pass']))
{
echo "assasa";
}
else
{
$_SESSION['user'] = $_COOKIE['user'];
$_SESSION['pass'] = $_COOKIE['pass'];
witaj( $_SESSION['user'] );
}
}
elseif (isset($_POST['user']))
{
if (!auth_user($_POST['user'], $_POST['pass']))
{
echo "Niepoprawny login lub/i hasło!";
}
else
{
$_SESSION['user'] = $_POST['user'];
$_SESSION['pass'] = $_POST['pass'];
if ($_POST['autologowanie']=="on")
{
setcookie("user", $_POST['user'] , time()+36000);
setcookie("pass", md5($_POST['pass']) , time()+36000);
}
witaj( $_SESSION['user'] );
}
}
else
{
login_form();
}
?>
?>[/php:1:4272a09ba2]
Anonymous
1.05.2004, 12:37:58
Pytanie do liko i byc moze takze do innych uzytkownikow :
Stworzylem w mojej bazie pole 'uid' , ktore ma przechowywac unikalny ciag znakow potrzebny do aktywacji konta . No wlasnie , co konkretnie powinno to pole zawierac , jaki ciag ? Napisales by uzyc metody md5, time ... a jak to wyglada w praniu ?
Dajmy na to zmienna $uid przechowuje ten ciag przed zapisaniem do bazy , jak powinna wygladac ta zmienna ?
Astaroth
16.05.2004, 21:53:55
Ok a nie znacie stronki skąd można by było zassać gotowy skrypt??
e4you
16.05.2004, 21:59:30
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.