Hallo
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:

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)
|-??


Met deze 'tijdenlijke' mysql:

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 ;


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):

<?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
    }	
  }
?>


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 :) :$
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.
en een email in een varchar(50) lijkt me ook erg vreemd...logischer is een varchar(255) alhoewel zelfs deze niet volledig dekkend is. een email mag tenslotte uit 255 tkenes voor en 255 tkenes na het @ teken bestaan....
maar 50 in totaal is echt verkeerd
Ik denk dat je het beste kan beginnen met een klasse diagram te gaan maken,
denk eens na over de volgende 2 vragen:
welke klasses denk je nodig te hebben?
welke methodes ( functies ) moeten deze klasses beschikken?





Voor al je mysql functies kan je natuurlijk altijd de 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.

[edit]Laten we hier eens mee beginnen:[/edit]



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 ;

@Webmakerij:
Beetje onduidelijk geweest. Ik bedoelde dus eigenlijk de php functies waarmee je met een mysql kunt communiceren.

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
:
.
.


@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).
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.


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
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.
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...
DDragonz
Mijn doel is dus om een authentication script te maken met de volgende dingen in gedachten:
-PHP5 OOP
- ...
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...

Mysql_* functies zijn tot nu toe veeeeel sneller dan mysqli_* functies.

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.
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
Deze extensie is prima te gebruiken, als je er zelf een klasse voor gemaakt hebt.
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.

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...

Reageren