[authentication samen maken]+php->mysql functies verleerd
Heb me een lange periode bezig gehouden met OOP en hebt toen niets meer gedaan met mysql (was langetijd(met lange tussen pauzes van niks doen en overnieuw starten) bezig met een html form creator dat de html form zelf geeft + validatie en ben daar zo goed als klaar mee).
Maar nu wil ik een goed beveiligde authentication script maken, maar weet niet meer precies hoe :$. Heb natuurlijk hier op phphulp naar de scripts zelf gekeken. Maar daar vind je veel 'verouderde', incomplete en/of te simele authentication scripts.
Waar ik nu vooral mee zit is de mysql gedeelte. Ik weet niet meer precues hoe ik dingen precies (het beste) moet aanpakken. Ik heb hier nog wel een handige boek dat ik kan doornemen(PHP 5 en MySQL Het Complete HANDboek), maar wil het weer leren door te doen(heb het alleen verleerd).
Mijn doel is dus om een authentication script te maken met de volgende dingen in gedachten:
-PHP5 OOP
-Sessions (geen cookies)
Punten die ik er in wil gaan verwerken:
Quote:
Inlogsysteem
Onderdelen:
Inloggen
Uitloggen
Registreren
Checkpermission
Activeren
Wachtwoord vergeten
Failure check(bv naar 5 keer mislukt inloggen binnen een half uur is bannen(niet kunnen inloggen) voor 1 uur).
Captcha beveiliging?
Adminpanal:
-Accounts:
|-Toevoegen
|-Aanpassen
|-Verwijderen
|-Zoeken
|-??
-Rechten(weet nog niet hoe ik dit ga doen met behulp van een database. Ga dit gebruiken Tut link):
|-Toevoegen
|-Aanpassen
|-Verwijderen
|-??
-Cijfers
|-Aantal leden
|-Aantal active leden
|-Leden online
|-Laatste 10-100 leden geregistreerd
|-??
-Config
|-Activeren (aan/uit)
|-Failurecheck instellingen (na ?x mislukt binnen ?? minuten bannen voor ?? minuten)
|-??
Onderdelen:
Inloggen
Uitloggen
Registreren
Checkpermission
Activeren
Wachtwoord vergeten
Failure check(bv naar 5 keer mislukt inloggen binnen een half uur is bannen(niet kunnen inloggen) voor 1 uur).
Captcha beveiliging?
Adminpanal:
-Accounts:
|-Toevoegen
|-Aanpassen
|-Verwijderen
|-Zoeken
|-??
-Rechten(weet nog niet hoe ik dit ga doen met behulp van een database. Ga dit gebruiken Tut link):
|-Toevoegen
|-Aanpassen
|-Verwijderen
|-??
-Cijfers
|-Aantal leden
|-Aantal active leden
|-Leden online
|-Laatste 10-100 leden geregistreerd
|-??
-Config
|-Activeren (aan/uit)
|-Failurecheck instellingen (na ?x mislukt binnen ?? minuten bannen voor ?? minuten)
|-??
Met deze 'tijdenlijke' mysql:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
Bevat misschien nog fouten. Zal het morgen verbeteren...
edit(tabel verandert):
CREATE TABLE users (
id int(11) NOT NULL auto_increment,
username varchar(20) NOT NULL default '',
password varchar(32) NOT NULL default '',
email varchar(...) NOT NULL default '',
activation int(11) NOT NULL default '0',
reg_date datetime NOT NULL default '0000-00-00 00:00:00',
last_date datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY username
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
edit(tabel verandert):
CREATE TABLE users (
id int(11) NOT NULL auto_increment,
username varchar(20) NOT NULL default '',
password varchar(32) NOT NULL default '',
email varchar(...) NOT NULL default '',
activation int(11) NOT NULL default '0',
reg_date datetime NOT NULL default '0000-00-00 00:00:00',
last_date datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY username
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Nu wil ik beginnen met de login gedeelte. Ik heb dus dan een 'class authentication' met daarin de functie 'login'.
Nu heb ik het volgende(grotensdeels hier van de scripts op phphulp):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function login($username, $password)
{
$sql_query = 'SELECT * FROM authentication WHERE username="'.$username.'" AND password="'.md5($password).'"';
$rows = mysql_num_rows(mysql_query($sql));
if($rows == 1)
{
$update = 'UPDATE authentication SET ip="'.$_SERVER["REMOTE_ADDR"].'" WHERE username="'.$username.'"';
mysql_query($update);
$_SESSION['login'] = '1';
}
if($rows == 0)
{
// header terug
}
}
?>
function login($username, $password)
{
$sql_query = 'SELECT * FROM authentication WHERE username="'.$username.'" AND password="'.md5($password).'"';
$rows = mysql_num_rows(mysql_query($sql));
if($rows == 1)
{
$update = 'UPDATE authentication SET ip="'.$_SERVER["REMOTE_ADDR"].'" WHERE username="'.$username.'"';
mysql_query($update);
$_SESSION['login'] = '1';
}
if($rows == 0)
{
// header terug
}
}
?>
Hoe kan ik nu dit al beste aanpakken(zo efficent en snel mogenlijke - beste manier gewoon). Hoe zou jij dit doen. (Met ingedachte dat je de connectie al hebt gemaakt en boven aan session_start() heb staan.
Een lange topic :p, maar wil graag het hele script hier zo maken als dat gaat. Is altijd leuk als je ziet hoe andere mensen het doen en zo van elkaar leert. Ik wil dit script daarna hier op phphulp plaatsen als het af is samen met de credits van iedereen hier die hiermee meehelpt.
Ik hoop dat jullie mij niet gaan afzeiken van dat ik het met gaan google of gewoon het boek moet doorlezen, want het zou leuk zijn als samen met iedereen hier een goeie basis script lib kunnen maken. Wil dus een soort van refactormycode.com doen(check de site als je het niet kent).
Alvast bedankt, DDragonz :) :$
Gewijzigd op 01/01/1970 01:00:00 door DDragonz
Nu een systeem gaan maken dat mysql_* functies gebruikt is een beetje 'kansloos'. Deze functies zullen in php 6 (misschien 7) verdwenen zijn. Gebruik mysqli_* functies of het mysqli object of pdo of adodb.
maar 50 in totaal is echt verkeerd
denk eens na over de volgende 2 vragen:
welke klasses denk je nodig te hebben?
welke methodes ( functies ) moeten deze klasses beschikken?
handleiding raadplegen
voor PDO (wat ik zelf erg prettig vind werken) kan ik je ook nog een tut aanbevelen
Veel succes ermee! Ik ben erg nieuwsgierig naar je eindresultaat! Ik hou dit topic in de gaten om dingen er bij te leren. Ook wil ik wel delen met je samen schrijven. PM me maar voor wat afspraken als je wilt.
Voor al je mysql functies kan je natuurlijk altijd de voor PDO (wat ik zelf erg prettig vind werken) kan ik je ook nog een tut aanbevelen
Veel succes ermee! Ik ben erg nieuwsgierig naar je eindresultaat! Ik hou dit topic in de gaten om dingen er bij te leren. Ook wil ik wel delen met je samen schrijven. PM me maar voor wat afspraken als je wilt.
Edit:
Laten we hier eens mee beginnen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE IF NOT EXISTS users (
id int(11) NOT NULL auto_increment,
nickname varchar(20) NOT NULL default '',
email varchar(255) NOT NULL default '',
website varchar(255) NOT NULL default '',
wachtwoord varchar(50) NOT NULL default '',
n_wachtwoord varchar(50) NOT NULL default '',
actief int(11) NOT NULL default '0',
reg_date datetime NOT NULL default '0000-00-00 00:00:00',
last_date datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY nickname(nickname)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
id int(11) NOT NULL auto_increment,
nickname varchar(20) NOT NULL default '',
email varchar(255) NOT NULL default '',
website varchar(255) NOT NULL default '',
wachtwoord varchar(50) NOT NULL default '',
n_wachtwoord varchar(50) NOT NULL default '',
actief int(11) NOT NULL default '0',
reg_date datetime NOT NULL default '0000-00-00 00:00:00',
last_date datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY nickname(nickname)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
Beetje onduidelijk geweest. Ik bedoelde dus eigenlijk de php functies waarmee je met een mysql kunt communiceren.
Quote:
Stukje van php.net van alle mysql functies (van php dus niet van msql zelf-zeg het dus eigenlijk gewoon verkeerd).
.
.
:
# mysql_ db_ query
# mysql_ drop_ db
# mysql_ errno
# mysql_ error
# mysql_ field_ name
:
.
.
.
.
:
# mysql_ db_ query
# mysql_ drop_ db
# mysql_ errno
# mysql_ error
# mysql_ field_ name
:
.
.
@Ypma:
Jha, dat weet ik. Maar het was maar even tijdelijk. En ik had dus gewoon gecopyeerd en geplakt van een van de tuts of scripts hier op phphulp.nl(met inplaats van name = usernam en een paar nu nog overbodige dingen er uit).
Wil je een goeie email validator hebben dan moet dit maar eens lezen: Link
(De meeste email validators zouden emails met een spatie of andere niet logische tekens als een foutieve email zien. Zelfs die van uit sommige php boeken zijn niet goed.)
@Thijs:
Was daar id al mee begonnen(klassen diagram), maar is noch niet compleet. Zal het hier plaatsen als ie af is.
@Crispijn:
PDO... hmm weet niet. Nog nooit mee gewerkt, maar lijkt mij wel handig in combinatie met OOP. Ik zal het eens lezen :) Zal nadat ik een class diagram hebt gemaakt eens zien wat we kunnen doen :). Zal het dan hier wel plaatsen. Maar wat ik graag zie is dat je gewoon je eigen functie (de hoofdzakelijke) begint te schrijven (met behulp van de class diagram) en dat je het dan hier post en dat andere mensen het kunnen optimaliseren. Dus verbeteren(in zovere het gaat) van de script.
edit:
En wat betreft je eerste bijdragen :). Ik heb het verandert en sommige dingen verandert. Zoals het wachtwoord. Wachtwoord word versleuteld opgeslahen met sha1 en/of md5 en word ongeacht hoe groot het wachtwoord is altijd 32 tekens lang. Dus varchar(32).
Gewijzigd op 01/01/1970 01:00:00 door DDragonz
Webmakerij schreef op 17.02.2008 01:55:
even een beetje offtopic;
Nu een systeem gaan maken dat mysql_* functies gebruikt is een beetje 'kansloos'. Deze functies zullen in php 6 (misschien 7) verdwenen zijn. Gebruik mysqli_* functies of het mysqli object of pdo of adodb.
Nu een systeem gaan maken dat mysql_* functies gebruikt is een beetje 'kansloos'. Deze functies zullen in php 6 (misschien 7) verdwenen zijn. Gebruik mysqli_* functies of het mysqli object of pdo of adodb.
Ik dit verhaal maar lijkt me nogal onwaarschijnlijk! Ze gaan wel het e.e.a. veranderen maar gezien het aantal mensen die de gewone mysql functies gebruikt gaan ze die echt niet even zo maar verwijderen.
Hosts zijn wel ongeveer verplicht om het te ondersteunen denk ik dan ook..
zie ook: http://www.scriptorama.nl/software-updates/php6-komt-met-nieuwe-mysql-client-library-mysqlng
Mysqli heeft wat mij betreft wel de voorkeur inderdaad. Als je er dan toch mee bezig bent ;)
Maar feitelijk kan mysqli niks meer dan mysql functies en/of wat queries, zelf. Het is alleen wat uitgebreiden qua php functies.
Lode:
Vanaf PHP6 worden deze functie verplaatst naar de PECL, dus zullen ze inderdaad als extension beschikbaar blijven. Veel hosts zullen deze extension in het begin waarschijnlijk ook lekker aan laten staan. Maar als je toch weet dat deze functie op een gegeven moment gaan verdwijnen, waarom dan niet direct kiezen voor een beter alternatief...Ik dit verhaal maar lijkt me nogal onwaarschijnlijk! Ze gaan wel het e.e.a. veranderen maar gezien het aantal mensen die de gewone mysql functies gebruikt gaan ze die echt niet even zo maar verwijderen.
DDragonz:
In dat geval zou je dus juist naar een OO oplossing zoals PDO of MySQLi moeten kijken. Je wilt eigenlijk helemaal niets meer te maken hebben met de procedurele mysql_* functies...Mijn doel is dus om een authentication script te maken met de volgende dingen in gedachten:
-PHP5 OOP
- ...
-PHP5 OOP
- ...
In php 5.3 komt hier verandering in tot die tijd werk ik gewoon met de mysql extensie. Deze extensie is prima te gebruiken, als je er zelf een klasse voor gemaakt hebt. Maar dat geld ook voor mysqli.
En PDO zou ik helemaal niet gebruiken. Je maakt immers meestal een project voor 1 (hoog uit 2) database systemen. Waarom dan nog een extra laag tussen database client en PHP. Dit zorgt alleen maar voor meer werk en gaat ook tenkoste van de snelheid.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Martijn! schreef op 17.02.2008 10:30:
En PDO zou ik helemaal niet gebruiken. Je maakt immers meestal een project voor 1 (hoog uit 2) database systemen. Waarom dan nog een extra laag tussen database client en PHP. Dit zorgt alleen maar voor meer werk en gaat ook tenkoste van de snelheid.
OOP gaat ook ten koste van de snelheid, validatie ook, maar zijn dat dingen die je niet zou doen?
En om PDO nou een extra laag te noemen :S, in OOP programmeren kunnen er 100en lagen zijn, dus om PDO nou te laten voor 1 extra laag :S
Martijn! schreef op 17.02.2008 10:30:
Dit is dan zoals jij het noemt toch ook een 'extra laag'? Waarom zou je het wiel helemaal opnieuw uitvinden en zelf een database klasse schrijven als PDO en zeer goede basis biedt. Deze extensie is prima te gebruiken, als je er zelf een klasse voor gemaakt hebt.
Het voordeel dat je PDO voor verschillende databases kunt gebruiken wil toch niet zeggen dat jij je applicatie ook voor verschillende databases moet gebruiken? Bovendien is de PDO klasse uitstekend te extenden met je eigen klasse om zo je database specifieke methodes erin op te nemen...
Ik heb zelf de classes van mysqli ge-extend inderdaad.
Maar had in het verleden eigenlijk precies het zelfde maar dan met wrapper classes voor mysql met queries voor Statements e.d.
PDO...
Nope niet voor mij! mysql / pgSql zijn bijna niet te vergelijken. En voor de nieuwelingen is PDO dan misschien makkelijk. Maar persoonlijk hoeft het van mij niet...
Quote:
OOP gaat ook ten koste van de snelheid, validatie ook, maar zijn dat dingen die je niet zou doen?
Waar haal je dit nou vandaan?
PDO zou iets recht moeten maken wat krom is, namelijk SQL dialecten.
- Er zijn verschillen tussen wat database systemen kunnen. PDO kan dit niet voor jou na maken.
- Meestal maak je een project voor 1 of 2 database systemen. Waarom dan PDO gebruiken?
- Je zult een PDO niet specifiek voor 1 database systeem een project kunnen maken, iets wat in de praktijk toch vaak voorkomt en nodig is. Uiteraard zou je PDO kunnen uitbreiden, maar wat is dan nog het verschil met mysql of mysqli?
Eigenlijk net als met ActiveRecord in Ruby on Rails, eerst is het geweldig maar dan begint de ellende als je iets buiten het boekje wilt doen.
edit:
Hier nog wat benchmark,s:
http://dealnews.com/developers/php-mysql.html
http://blogs.vinuthomas.com/2006/08/07/benchmark-mysql-mysqli-pdo-in-php/
Het lijkt mij dat dit voor pgSQL hetzelfde zal zijn.
PDO is een database abstraction layer en zal altijd langzamer zijn dan de mysql, mysqli of pg extensies.
Maar natuurlijk is PDO ook gewoon een goede basis voor een project.
Maar ik zou het niet snel gaan gebruiken.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Bv
Quote:
*Mysql
*Mysqli
*pgSQL
*PDO
*Mysqli
*pgSQL
*PDO
Wil het beste alles eerst op 'papier'. Is veel makelijker programmeren zo als je weet wat je moet gaan doen :)(planning).
Maar verschillende databases kunnen verschillende dingen en werken ook heel verschillend.
De ham vraag is dus waar je gebruik van wilt maken... voor standaard dingen ben je qua scripten sneller af met PDO lijkt me...
Maar dan laat je dus een hoop dingen over 1 kam scheren...
Een test waar 88 r/s gemaakt worden en een insert gedaan wordt van 10000 records, en dan heb jij het over de praktijk? De praktijk die in dit topic gaat over een authenticatie systeem?
@dragonz, ik zou het niet direct afstemmen op php6, dit duurt zeker nog jaren.
Wat ik wel zou afwegen is of je iets wil leren ofniet. Wil je weer je oude rotte mysql code uit de kast halen, of wil je een echte database gaan gebruiken zoals pgsql.
En wil je alles direct aanspreken of wil je absctractiue layers gaan schrijven ?
Gewijzigd op 01/01/1970 01:00:00 door Joep
Hoebedoel je met alles over een kam scheren... Graag uitleg.
@Joep:
Wat zou ik dan het beste kunnen gebruiken? Op de meeste (goedkope/budget)hostingdealers hebben ze bijna alleen maar mysql ondersteuning. Mysql is toch het meest gebruikte database, toch.
@allemaal:
pgSQL ziet er wel goed uit, maar in de officiele documontatie op de website van hun staan allemaal voorbeelden samen met C taal(wat lijkt op php, maar toch geen webbased programmeren is). Maar op http://nl3.php.net/pgsql staat wel alles goed uitgelegd dus het leren van dit zou geen probleem moeten zijn.
Welke andere goeie databases kan ik overwegen? Of pgSQL gewoon al het beste?
edit:
Is pgSQL gratis of moet je daar licenties voor kopen als webhoster?
Gewijzigd op 01/01/1970 01:00:00 door DDragonz
Niet zomaar beginnen met scripten maar eerst een duidelijke klasse diagram maken zodat je weet welke klasses welke functionaliteit hebben.
edit:
Is PDO wel op elke server te doen? Want je moet er toch iets voor in de php.ini doen dus er is een kans dat een webhosting niet heeft. Zie http://nl2.php.net/pdo
Gewijzigd op 01/01/1970 01:00:00 door DDragonz
Quote:
In de praktijk zal dat nooit mogelijk zijn aangezien de SQL die je gebruikt voor beide databases niet op alle punten hetzelfde zal zijn. Ok, de basishandelingen zoals het selecteren, invoegen, updaten en verwijderen van records wel, maar als je alleen die functies gebruikt, benut je niet de echte kracht van de database. Je zult dus eigenlijk nooit een systeem schrijven dat voor 2 database systemen geschikt is.Met PDO zou het toch kunnen om het voor mysql en phsql allebij te programmeren.
Als je de keuze hebt kies je uiteraard voor postgreSQL en ga je niet eens proberen om je vingers aan MySQL te branden. Deze laatste gaat namelijk veel te vrij om met de standaarden en probeert regelrechte bugs als functionliteit te verkopen.
DDragonz schreef op 17.02.2008 19:17:
Met PDO zou het toch kunnen om het voor mysql en phsql allebij te programmeren.
edit:
Is PDO wel op elke server te doen? Want je moet er toch iets voor in de php.ini doen dus er is een kans dat een webhosting niet heeft. Zie http://nl2.php.net/pdo
edit:
Is PDO wel op elke server te doen? Want je moet er toch iets voor in de php.ini doen dus er is een kans dat een webhosting niet heeft. Zie http://nl2.php.net/pdo
Ja PHP 5 is vereist, maar wanneer je het Object georienteerd gaat schrijven is PHP5 ook wel required.
Verder hoef je niks in je php.ini te doen want in PHP5 staan standaard alle pdo extenties enabled ( zover ik weet ).
Gewijzigd op 01/01/1970 01:00:00 door Thijs X