Methode d'authentification? [PHP] - PHP - Programmation
Marsh Posté le 14-10-2002 à 19:37:35
Le but est pour une simple autentification :
- créer un numéro unique
- le stocker chez l'utilisateur
- valider le login/pwd
- l'enregistrer sur le serveur dans une table (num_unique, nom, droits, temps limite...)
- lire le numéro unique de l'utilisateur
- chercher la correspondance dans la table
- valider l'utilisateur connecté (temps limite).
- on sait qui est sur le site.
Comment gérer ce numéro unique ?
1. les sessions php : le plus simple, mais aussi le plus contraigant. On n'utilise dans ce cas que la capacité à générer un numéro unique... (elles sont plus utiles dans le cas de la gestion d'un caddie)
Les sessions fonctionnent en général avec un cookie (id unique généré et envoyé dans un cookie).
Si l'utilisateur refuse les cookies, en fonction de la configuration du serveur php, le code sera parsé avant l'envoi : Il ajoutera le numéro de session à la suite du tag html <a href="">.
Cela peut poser de graves problèmes si tu génères tes urls avec du javascript à moins que tu ne saches désactiver l'ajout du numéro de session par le serveur.
voir un tutorial : http://www.toutestfacile.com/phpin [...] =sessions0
2. Les cookies : pas très sûr si tu y stockes directement le login+pwd. Donc il vaut mieux stocker un numéro unique (par exemple avec md5(uniqid(rand(),1)); )...
si l'utilisateur les refuse que faire ?
Faire passer le cookie dans l'url ou lui dire d'activer les cookies.
c'est une bonne solution, facile et rapide à mettre en place.
Uniquement vallable pour une authentification. Pour un caddie, il faut impérativement utiliser les sessions.
3. Créer son propre module de session.
c'est sans doute la meilleure solution, la moins dépendante du serveur et la plus couteuse en temps de codage et d'exécution.
Il existe des classes toute faites ( voir http://www.phpclasses.org ).
S'il faut 0.00024 sec pour exécuter un script avec une session php, compte 0.0025 sec pour exécuter un script avec une session perso (dans le meilleur des cas).
Marsh Posté le 14-10-2002 à 20:25:57
pinaise, ca c'est de la reponse, merci!!!
Manque plus qu'un exemple mis en place par qqun, si possible bien sur
Marsh Posté le 14-10-2002 à 22:01:16
c pas bien compliqué...
(je l'ai pas testé, ça vient de (http://www.phpcomplete.com/content.php?page=4&id=72) je l'ai juste un peu modifié. ça correspond +- à ce que j'utilise.
validation.php
Code :
|
code à inclure en haut de chaque page
Code :
|
Marsh Posté le 14-10-2002 à 22:19:40
moi j'avais fait ca: http://forum.hardware.fr/forum2.php3?post=20116&cat=10
Marsh Posté le 14-10-2002 à 22:47:11
y a juste un problème dans ton cas :
si qq arrive à avoir le cookie contenant le login et la md5(cle1.login.cle2), il saura toujours avoir accès au compte de cet user, comme s'il avait le mot de passe.
-ça peut arriver s'il se logue à partir d'un pc public
-si tu as prévu de le passer par l'url dans le cas ou l'utilisateur refuserait les cookies.
et l'utilisateur en voyant une utilisation externe de son compte ne saurait l'empêcher qu'en changeant de login (ou toi tes clés).
mais bon ça a son avantage comme tu le dis, pas besoin de se reloguer chaque fois et ce, sans avoir de pwd dans le cookie
Marsh Posté le 14-10-2002 à 23:27:44
moi je voulais aussi faire passer un num de session en url au debut, mais j'avais peur de l'historiques des liens.... vu que le site sera svt acceder depuis des postes publiques...
le probleme que j'ai c'est pour definir la duree d'une session (pas en prog)
Mais bon, pour l'instnant je vais faire ca comme un boeuf, sans secu, et je reviendrais demander quand je m'attaquerais a la finition
Marsh Posté le 14-10-2002 à 23:49:44
l'avantage des sessions est d'avoir une durée de vie limitée, de sorte que si qq récupère l'url, il ne saura l'utiliser que pdt un certain temps, ou pas du tout.
pour modifier la durée du cookie de session :
session_set_cookie_params($duréee);
attention, la durée de ce cookie n'est pas le temps actuel+un délais (time()+60*60), mais bien le délais seul (ex : 60*60 pour 1 heure).
Le timeout dans la table registered_user sert à savoir qui est online. Le taux d'erreur dépend de la durée du timeout.
si le timeout est de 2 minutes, certaines personnes ne sont peut-être plus sur le site depuis 1min 59sec...
Marsh Posté le 16-10-2002 à 11:43:52
Moi ce que j'ai fait, c'est que tout au long du site :
Tout ce qui est administration, il faut que les cookies soient activé (numéro de session inscrit dans le cookie). Bref, pour qu'une personne puisse modifier son compte ou pour administrer une partie du site (ou tout le site), il faut être concecté.
Tant qu'une personne n'est pas conecté, elle doit saisir son nom+mot de passe à chaque fois qu'elle poste quelque chôse (forum, news ...)
Dès qu'une personne est conecté, (avec cookie activé obligatoirement) si elle a pas le droit de poster à un endroit donné, je ne lui envoie pas le formulaire et si elle a le droit, je l'identifies grâce à son numéro de session (incrémentation d'un numéro grace à la bdd + une chaine de caractère aléatoire) et son IP.
Pour les zones réservé à certaines personne, je ne leur affiche le lien que si elle se sont identifié.
Il n'y a que pour le chat que j'ai mis en place un système de numéro de session dans les liens et ca ne corespond pas au même système de session que pour le reste du site (session avec une durée de validité plus courte mais remise à jour à chaque chargement de la page)
BRef, j'ai fait mon système perso.
Marsh Posté le 11-02-2003 à 17:12:55
ethernal a écrit : l'avantage des sessions est d'avoir une durée de vie limitée, de sorte que si qq récupère l'url, il ne saura l'utiliser que pdt un certain temps, ou pas du tout. |
Salut !
Ethernal, vu que tu as l'air de toucher en PHP, je poste ici (sachant que ki veut m'aider PEUT )
J'ai chopé http://www.phpscripts-fr.net/?page=script&id=308
C un script d'authentification qui m'a l'air carrément pas mal mais je ne comprends pas sa page login.php (enfinà partir d'un certain moment !)
La voici :
Citation : <? |
Que font les accolades là ? (celles en gras)
Ya le ELSE et un eligne de code ==> ;
pui {.......} ???
En plus, je ne comprends pas ce que fait :
Citation : $destination=mysql_result($requete,$i,"destination" ); |
need help
merci
Marsh Posté le 11-02-2003 à 17:42:42
alors j'ai regradé ds le fucking manual et ca veut dire koi en FRANCAIS :
Citation : mysql_result (PHP 3, PHP 4 >= 4.0b1) |
result identifier est la variable qui contient le résultat d'une requete ca j'ai
row je vois et mixed field encore moins !
merci
Marsh Posté le 11-02-2003 à 19:01:34
pour l'accolade, à mon avis il y a une erreur.ça doit être
Code :
|
pour le mysql_result(), il récupère la valeur du champ "destination" de la ligne $i qui n'est pas défini auparavant. Ce champ destination est je suppose le nom d'une page php. j'en vois pas l'intérêt.
Il ne te manquerais pas un bout de code ? (j'ai pas downloadé le script pour voir plus en profondeur)
ps: je n'ai pas vérifié, mais je pense que le mixed[field] peut prendre comme valeur le nom du champ ou son numéro (position 1, ...)
Marsh Posté le 11-02-2003 à 23:16:31
ethernal a écrit : pour l'accolade, à mon avis il y a une erreur.ça doit être
|
merci
non il ne me manque pas un ou de code. En fait destination est bien une page. Ca sert à rediriger un user vers une page et un autre vers une autre page, peut importe.
la variable $i n'est pas défini. Est-ce que ds ce cas sa valeur par défaut est 0 ?
Sinon son usage est-il par exemple : Ona une table de 1000 lignes on met $i = 500, on commence la recherche au 500ème enregistrement (offset en fait ) ? me goure-je ?
merci encore
Marsh Posté le 12-02-2003 à 14:48:19
Ethernal ta solution est tip top, mais si je me trompe pas a chaque demande de l utilisateur tu es obligé de requeter sur ta base de donnée non (pour voir si la ligne existe bien dans ta table d authentification) ? Ca fait pas un peu lourd si y a trop de visiteurs ?
Autre question comment tu fais pour savoir qu un utilisateur s est deconnecté et ainsi supprimer la ligne dans cette table temporaire ?
Marsh Posté le 12-02-2003 à 15:09:34
Oreste a écrit : ... |
C'est vrai ca. Ce que je comprends pas c qu'il faut se trimballer une verif d'ID session sur tout le site si on veut gérer une authent... Mettre puis checker un Cookie ne suffit pas ? C qd même plus léger non ?
Marsh Posté le 12-02-2003 à 21:39:25
Personnellement, j'utilise un cookie, mais il est non permanent... c'est mieux ? Je pense que oui, je vois pas trop comment le choper sinon (à part via un Cross Site Scripting).
Marsh Posté le 12-02-2003 à 21:46:22
ethernal a écrit : |
Je comprends pas trop comment tu t'y prends
Marsh Posté le 18-02-2003 à 12:00:51
ma solution:
a l'arrivé sur le site:
-je verifie si le cookie qui stocke le numero de session existe
-si oui, j'utilise la session deja active
-sinon je demarre une nouvelle session, je crée le cookie (valable 24h)
-j'efface les anciennes sessions (vieilles de 24h par exxemple)
ensuite le numero de session est passé a chaque page via l'url
comme ca, je stocke le login, mot de passe et autres infos dans une table correspondante au numero de session
Marsh Posté le 18-02-2003 à 13:25:21
Evolvox a écrit : |
avec un cookie qui contient le login et pwd, tu vas à chaque page (comme ici) regarder dans la table des users si il existe. Si oui tu lui donnes certaines autorisations.
En cas de machines publiques ou de pc multi-user, si qq regarde le cookie, il a le login et le pwd (même si celui est crypté, il le recopie et l'installe sur une autre machine et ça fct)
La personne sera obligée de modifier son password.
Pour éviter cela (et d'autres propositions genre md5($login.$pwd.'ma clé unique'), je propose que après l'authentification de la personne (envoi de son login/pwd), de créer dans table user à la ligne correspondant à l'utilisateur un numéro généré automatiquement et unique.
Lors de l'accès à une page le numéro dans le cookie est envoyé et la correspondance est checkée dans la table users.
Si l'utilisateur voit que qq a intercepté son cookie, il lui suffit de se déconnecter et de se reconnecter, le numéro aura changé et la personne qui a l'ancien numéro de cookie sera refusée.
Je dirais que c'est une pseudo session... ici le numéro unique n'est pas limité dans le temps, contrairement aux sessions php.
Marsh Posté le 18-02-2003 à 14:54:31
ethernal a écrit : |
sioux
Marsh Posté le 27-03-2003 à 16:18:39
ethernal a écrit :
|
Ethernal > j'ai petit soucis avec le deuxième script. Lorsque j'exécute le tout, j'obtiens le message d'erreur suivant :
Code :
|
(la ligne 8 correspondant à $result = mysql_query($query, $connection) or die('error making query'; ). Tu vois à quoi c'est du ?
Marsh Posté le 27-03-2003 à 16:24:11
s'pas bien de copier sans comprendre
dans le second script, tu as oublié (enfin, je n'ai pas cru bon de devoir me répéter) de te connetcer à la bd...
Pour les suivants : il faut ajouter en début de fichier
Code :
|
Marsh Posté le 27-03-2003 à 16:27:14
(Je sais. )
Ça se tient.
Marsh Posté le 27-03-2003 à 16:43:34
(Spa facile de trouver un tuto complet sur les authentifications en français. )
Bon si tu es là ça sera plus simple de comprendre justement (je débute, mais ça ne t'étonnera pas ).
Code :
|
Bon actuellement, j'ai error 1 making query comme réponse. C'est à dire que la première requête ne fonctionne pas.
J'ai bien une table registered_users dans ma base perso, qui ressemble à ça :
id int (11) notnull auto_increment
user_name varchar(50) notnull
timeout int(11) notnull
Il y a un problème avec ça ?
Autre chose : les tables registered_users et users sont liées ?
Merci.
Marsh Posté le 27-03-2003 à 17:18:55
pour être sûr :
Code :
|
ensuite :
id est un varchar de 32 caractères (session_id()) et n'est pas en auto_increment, mais en primary key.
Description de la table :
Code :
|
Elles sont liées par le fait que la table registered_users n'est qu'une copie d'une partie de la table users, mais ça s'arrète là.
ex de table user :
Code :
|
Marsh Posté le 27-03-2003 à 17:36:02
(Je te remercie d'aider un graphiste en pleine déroute. )
Bon j'ai rectifié mes tables, mais j'obtiens toujours la même erreur sur la deuxième page : error 1 making query.
Je copie les codes des 2 pages, pour être certain :
validation.php
Code :
|
index2.php
Code :
|
Tu vois une erreur monstrueuse ?
Marsh Posté le 27-03-2003 à 17:57:30
justement non
met un "or die ('db non trouvée';" après le mysql_select_db('perso',$connection);
-> mysql_select_db('perso',$connection) or die ('db non trouvée';
et enlève le "or die" après le "mysql_query($query, $connexion);"
Marsh Posté le 27-03-2003 à 18:16:54
Aucun changement. Ça m'ennuie.
Tu me confirmes qu'il n'y a besoin de rien d'autre que ces 2 pages de code pour que ça fonctionne ? On sait jamais, j'ai peut-être oublié quelque chose.
J'utilise easyphp, qui semble configuré correctement ('y a d'autres scripts qui fonctionnent).
Marsh Posté le 27-03-2003 à 19:58:43
parappa a écrit : Aucun changement. Ça m'ennuie. |
sûr ?
normalement il doit t'afficher le message d'erreur au lieu de error 1 making query et ce message est certainement plus explicite.
parappa a écrit : |
je n'ai jamais dit que c'était un kit tout fait...
ces 2 pages devraient fonctionner (comme dit au début, elles proviennent d'un tutorial et correspondent +- à ce que j'utilise)
la page n°1 est la connexion.
la page n°2 doit être incluse dans chaque page du site pour suivre la personne. Mais, il faut ajouter un check pour voir si le visiteur est authentifié ou pas.
Marsh Posté le 14-10-2002 à 18:29:23
en fait j'aurais voulu savoir comment vous identifiez vos users sur votre site tout au long de leur surf??? par mot de passe dasn une base de donnée bien sur (enfin je pense), mais comment vous faite pour savoir a chaque instant DANS le site de quel user il s'agit??
Cookie, ID dasn URL, session PHP, cumul de tout ca??
Et si vous auriez des exemples (tout fait? ) concernant la gestion des sessions ca m'interesserait, parce que je voulais le faire avec ca, mais il y a deux trois truc que je comprend pas trop dans mon bouk1
Merci