PDA

Voir la version complète : Authentification simplifiée


Coldfusion
19/02/2004, 22h25
Bonsoir,

suite à ce sujet : http://forum.vbulletin-fr.org/showthread.php?t=5221
et grace encore une fois à Pitchoune et Foularou

Il me reste plus qu'une étape avant d'en avoir finit de vous embeter avec mes questions php...

- J'ai fait mon formulaire pour avoir les infos (pseudo / email / mot de passe) des gens qui veulent voir une page privée. Les infos sont dans la DB dans une table spéciale (photo2)
- Les informations s'affichent sur une autre page (pour controler que tout va bien sans passer via phpmyadmin) >> page3.php

- Maintenant, il me faut faire un formulaire d'identification afin que les gens qui sont déjà inscrits puissent s'authentifier et rentrer dans les pages privées

J'ai donc crée la page "page4.php" qui contient un formulaire tout bête :
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p><font size="2" face="Arial, Helvetica, sans-serif"><strong>Identifiaction obligatoire</strong>
(si vous ne vous &ecirc;tes jamais enregistr&eacute;, <a href="page1.php">cliquez
ici pour vous enregistrer</a>) </font></p>
<form name="form1" method="post" action="page5.php">
<table width="40%" border="0" align="center">
<tr>
<td>Pseudo</td>
<td><input type="text" name="textfield"></td>
</tr>
<tr>
<td>Mot de passe</td>
<td><input type="text" name="textfield2"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Valider"></td>
</tr>
</table>
</form>
<p>&nbsp; </p>
</body>
</html>


Et j'ai crée donc "page5.php" qui commence par :

<?php
require('_connexion.php');

$db = @mysql_connect("$dbhost", "$dbuser", "$dbpass") OR DIE("Erreur : la base de données n'existe pas.");
@mysql_select_db("$dbbase",$db) OR DIE("Erreur : la base de données n'est pas accessible.");

$sql = "SELECT * FROM $table";

Mais quelle requete dois-je lancer ensuite pour que je puisse verifier que le pseudo et le mot de passe corresponde bien à ce qui est dans ma table "photo2" dans les champs : "pseudo" "mdp"

?

J'ai cherché sur plusieurs site mais je ne trouve rien

Excusez si je suis perseverant mais je trouve le php tellement impressionnant, voir que l'on peut retirer les infos d'une DB est extraordinaire pour moi qui suis un HTMLien de longue date...

Merci d'avance pour votre aide. :001: :001:

Pitchoune
19/02/2004, 23h03
Là, je ne saurais dire, j'ai jamais eu le cas à affronter.

Si quelqu'un connait un peu le bout de code pour dire "si pseudo du form = pseudo de la bdd ET mdp du form = mdp de la bdd alors ok sinon pas ok", je suis preneur aussi :)

Coldfusion
19/02/2004, 23h30
sur excel je le fait en deux secondes... mais en php... c'est la colle.

Merci quand meme pour toute ton aide Pitchoune

PS : j'ai essayé de copier le code de vB qui lui aussi, utilise un script pour s'identifier, mais c'est trop compliqué avec les templates et tout le bazard...

Pitchoune
19/02/2004, 23h32
Oui, surtout qu'ils se servent du codage des mots de passes en MD5, je sais pas du tout comment l'utiliser.

Akex
20/02/2004, 03h34
Tu peux déjà encoder ton mot de passe lorsque le membre s'inscrit.


$mdp = md5($mdp);

Ensuite pour controler, tu recherches déjà l'utilisateur dans la base et ensuite si tu le trouves tu controles le mot de passe :


$sql = "SELECT * from $table where pseudo= '" . addslashes(htmlspecialchars_uni($textfield1)) . "'";

//on recherche l'utilisateur
if ($req=mysql_query_first($sql)) {
//utilisateur trouvé on vérifie le mot de passe
if ($req[mdp]==md5($textfield2)) {
//mettre ici l'action qui dirige vers la bonne page etc...
} else {
echo "mot de passe incorrect";
}
} else {
echo "Utilisateur inconnu";
}

Coldfusion
20/02/2004, 15h38
Tu peux déjà encoder ton mot de passe lorsque le membre s'inscrit.


$mdp = md5($mdp);


ahh... alors il faut que je retouche page2.php

Je ne sait pas ou mettre la requete, peut tu me dire svp ou dans ce fichier (fait par Pitchoune...encore merci) ?
<?php
if(empty($pseudo) || empty($mdp) || empty($mdp2) || empty($email)) // Si un des champs est vide
{
?>
<script language="Javascript">
alert('Un des champs est vide, Veuillez revenir au formulaire d\'enregistrement.');
history.back();
</script>
<?
}
else if($mdp!=$mdp2) // Si les 2 mots de passes entrés ne correspondent pas
{
?>
<script language="Javascript">
alert('Les mots de passes entrés ne correspondent pas. Veuillez revenir en arrière et vérifiez votre mot de passe.');
history.back();
</script>
<?
}
else
{
require("_connexion.php"); // Inclus les paramètres de ce fichier externe

$db = @mysql_connect("$dbhost", "$dbuser", "$dbpass") OR DIE("Erreur : la base de données n'existe pas."); // Connexion à la base de données
@mysql_select_db("$dbbase",$db) OR DIE("Erreur : la base de données n'est pas accessible."); // Choix de la base de données

if (verif_email($email)) // Si l'email entré correspond bien a une email
{
$rqt = mysql_query("INSERT INTO $table VALUES ('','" . addslashes($pseudo) . "','" . addslashes($mdp) . "','" . addslashes($email) . "')");
}

if(!$rqt) // Si requête echoue
{
?>
<script language="Javascript">
alert('La requête a échoué, veuiller recommencer ou contactez l\'administrateur.');
history.back();
</script>
<?php
}
else // Sinon, tout est ok :)
{
?>
<script language="Javascript">
alert('L'enregistrement s\'est réalisé avec succès !');
window.location='page1.php';
</script>
<?php
}
}
?>

Sinon si je comprends bien ton deuxieme fichier, ca m'a l'air simple sauf que je ne sait pas comment rediriger vers la page privée... Normalement c'est la page2.php mais dans celles-ci il y a deja le script php de l'enregistrement des personnes.
en clair, quelle est la commande pour : Si...ok...alors...aller sur telle page.
J'ai trouvé un autre script php qui ressemble au tiens akex (car j'essayais de trouver comment faire pour rediriger...)
Le voici
<?
<?php
require('_connexion.php');

$db = @mysql_connect("$dbhost", "$dbuser", "$dbpass") OR DIE("Erreur : la base de données n'existe pas.");
@mysql_select_db("$dbbase",$db) OR DIE("Erreur : la base de données n'est pas accessible.");

$sql="SELECT id,nom FROM membres where login='$login' AND pass='$password'";
$base = new class_db($sql);
//Si il existe au moins un enregistrement on redirige sur la page demandée.
if ($base->num_rows() !=0 ){
$base->next_record();
$id_membre = $base->Record[id_membre];
//A ce stade vous devez avoir mis dans la variable
//id_membre la valeur de l'identifiant de l'utilisateur dans la base.
session_start();
session_register(id_membre);
if (!isset($retour)){
$retour = "http://www.phpteam.net/index.php";
//on définit une valeur de retour au cas ou.
}
echo "<script language='JavaScript'>
document.location.replace('".$retour."');
</script>";
}else {
//Sinon on redirige sur la page d'enregistrement
echo "<script language='JavaScript'>
document.location.replace('./formulaire.php ?retour=$retour');
</script>";
}

?>

Voila, en fait je croit qu'il redirige si ok alors va sur la bonne page, sinon va t'enregistrer.
C'est exactement comme le tiens donc à mon avis.
J'aimerais utiliser le tiens mais svp, explique moi mieux comment completer ton script pour qu'il marche (redirection si oui ou , si non.)

Merci beaucoup akex & pitchoune & foularou... j'ai déjà identifié les 3 pros du php sur ce forum... :001:

Pitchoune
20/02/2004, 15h42
Pour moi, pro, peux être pas, mais j'essaye de faire ce que je peux comprendre (demande pas à Ambre de lire tout ces discussion ici, elle n'y comprendrait rien :p)

Akex
20/02/2004, 19h36
Ce n'est pas etre pro :), c'est de la base ;).

Coldfusion
23/02/2004, 19h45
:(
:(

Coldfusion
23/02/2004, 22h50
Akex...I need your help !!!
:rolleyes:

..



...



......


:062: contre une bouteille est-ce possible ??? :(

grog6
23/02/2004, 23h48
V venir te filer un coup de main ;)

Ton probleme n'a rien a voir avec VB ?

C'est bien une page d'un site que tu veux faire ?
Tu ne recup pas les infos du membre de la table user de VB ?!

Si c'est ca, pour coder le mot de passe en MD5, c pas la peine (enfin t pas obligé) et au moins ca peut te permettre de renvoyer eventuellement aux membres leur mot de passe par mail s'ils l'ont perdu :)

Sinon pr l'identification et permettre aux membres de "garder" leur session et surfer sur ton site avec leur pseudo, il faut que tu utilses les sessions en PHP qui en fait te cree, gere tes cookies ...

setcookie("login","$username ||| $mdp",time()+ 150 * 24 * 3600 , "/");

pour creer un cookie du nom de login qui contient les infos que tu veux (en loccurence ici moi le login ||| mdp

et ensuite tu verifies la presence du cookie, son contenu grace a cette variable

$HTTP_COOKIE_VARS[login]


Edit : je vais commente run peu le setcookie(), tu dois pas y piger grand chose ;)

le "login" designe le nom que tu veux donner a ton cookie, tu peux l'appeler jules, tartanpion, ca ne changera rien a son contenu ;)
La 2e entree de la fonction est le contenu de ce cookie
La 3e avec le time()+150*24*3600 designe la validite du cookie
Ici, il sera valide a partir de la date actuelle + 150 * 24 * 3600 secondes soit 150 jours :)

Pitchoune
23/02/2004, 23h54
Je prends note pour les cookies, ça peut servir... :D

Coldfusion
24/02/2004, 07h47
c'est vraiment super ton explication sur les cookies, j'ai parfaitement compris.

J'ai par contre peur que cela ne me serve pas, je t'expliques :
Mon systeme d'autentification ne sert que pour entrer en fait dans une partie privative sur mon site (bien evidemment en dehors de vB). Grace à Pitchoune et Foularou et Alex j'ai pu faire la premiere partie qui est de s'enregistrer (nom, mot de passe, email).
Maintenant, dans un deuxieme temps, j'aimerais pouvoir faire un petit systeme inverse, d'autentification afin d'éviter à l'utilisateur de s'enregistrer chaque jour (car ils vont voir les pages privées régulierement) dans la DB. Un système qui demande donc juste le nom et mot de passe et qui verifie si il est bien dans la DB, si oui alors il entre dans la partie privative, si non alors il est redirigé vers le formulaire d'enregistrement précedemment crée.

Deuxieme point, les utilisateurs ne sont censés rester que quelques minutes sur cette partie privée. Il faudrait donc que lorsqu'ils ferment I.E, ils ne soient plus autentifiés. Car les gens qui vont regarder ces pages seront sur des ordinateurs publics, donc utilisés par plusieurs personnes différentes dans la journée. C'est pourquoi je pensait à mon avis qu'il n'y avait pas besoin de cookie. Je n'ai aussi pas besoin d'un systeme completement fiable donc le cryptage en md5 est superflu je pense, ainsi que l'autentification à chaque page... (une seule page d'accès aux autres doit etre bloquée à mon avis, comme une grosse porte blindée lol)

Tu comprends maintenant mieux ?
J'ai donc simplement besoin d'une verification à un instant T de si quelqu'un est ds la base ou non.

Merci de ta réponse que j'attends avec impatience.

:)

lanoix
24/02/2004, 09h53
(J'ai pas tout suivi et j'ai survolé ton sujet, mais je vais essayer de t'aider.)

Le md5 n'est jamais superflu si je puis dire... Ce que ca change c'est que les pass n'apparaitront en clair nulle part... Si tu n'utilises pas md5, tu verras les pass en clair dans la DB et si tu passes le mot de passe en paramètre d'une page tu verras "&pass=toto"... En md5, "&pass=fgnlk41regf" et fgnlk41regf dans ta base de données... Inconvénient, impossible de redonner le pass, le seul moyen de récupérer un accès est d'en demander un nouveau...
De plus je dirais que puisque php t'offres quelques facilités au niveau d'une sécurisation simple, prend-la!! Ne jamais dire qu'on a pas besoin de sécurité :s

Donc voici comment procéder:
Le code d'identification d'akex tu en fait une fonction avec un return d'un booléen.. tu tapes ca dans un fichier que tu inclus sur chaque page... En haut de chaque page tu executes cette fonction et tu testes son code de retour... Si le gars est authentifier, tu laisses aller, sinon, tu le rediriges vers ta page de login... Ensuite, soit tu utilises des cookies de sessions (qui sont détruits a la fermeture de IE) ou tu passes le mot de passe et le login dans chacun de tes liens...

Voila, j'essayerai de m'attarder + a ton problème si nécessaire mais la, je suis oqp. ;)

Coldfusion
24/02/2004, 13h44
(J'ai pas tout suivi et j'ai survolé ton sujet, mais je vais essayer de t'aider.)

Le md5 n'est jamais superflu si je puis dire... Ce que ca change c'est que les pass n'apparaitront en clair nulle part... Si tu n'utilises pas md5, tu verras les pass en clair dans la DB et si tu passes le mot de passe en paramètre d'une page tu verras "&pass=toto"... En md5, "&pass=fgnlk41regf" et fgnlk41regf dans ta base de données... Inconvénient, impossible de redonner le pass, le seul moyen de récupérer un accès est d'en demander un nouveau...
De plus je dirais que puisque php t'offres quelques facilités au niveau d'une sécurisation simple, prend-la!! Ne jamais dire qu'on a pas besoin de sécurité :s

Donc voici comment procéder:
Le code d'identification d'akex tu en fait une fonction avec un return d'un booléen.. tu tapes ca dans un fichier que tu inclus sur chaque page... En haut de chaque page tu executes cette fonction et tu testes son code de retour... Si le gars est authentifier, tu laisses aller, sinon, tu le rediriges vers ta page de login... Ensuite, soit tu utilises des cookies de sessions (qui sont détruits a la fermeture de IE) ou tu passes le mot de passe et le login dans chacun de tes liens...

Voila, j'essayerai de m'attarder + a ton problème si nécessaire mais la, je suis oqp. ;)

Merci beaucoup pour ta réponse,

concernant le MD5, comment integrer cette ligne alors, dans quel fichier ?
>> $mdp = md5($mdp);

Sinon pour le reste, je comprends de mieux en mieux la démarche cependant quand tu me parle de return de boléan... là je suis completement paumé.

Je remet en fichier joint mes fichiers qui composent ce systeme afin que tu voit bien comment ca marche (c'est simple en fait)
page4.php est la page d'accueil vers la partie privée
page1.php est la page d'enregistrement
page2.php est la page d'inscription ds la DB puis de visualisation de ce qui est privé
page3.php est la page qui liste tout ce qui est ds la base
page5.php est la page qui verifie dans la DB si l'user est bien dans la base

voilou... merci de ton aide, j'attends alors que tu ait un peu plus de temps pour m'expliquer ou modifier ces fichier un peu plus...

merci bcp

lanoix
24/02/2004, 19h50
J'ai jeté un oeil à tes fichiers...
Dans page 2, tu as addslashes($mdp), tu peux remplacer par md5($mdp)... Ton pass est alors enregistré crypté... Maintenant l'authentification avec ta page5.php est correcte.

Pour ce qui est de faire une authentification sur chaque bonne page ou c'est nécessaire, tu changes ta page5.php comme ceci:


<?php
require('_connexion.php');

function identification($login,$pass)
{

$db = @mysql_connect("$dbhost", "$dbuser", "$dbpass") OR DIE("Erreur : la base de donnÈes n'existe pas.");
@mysql_select_db("$dbbase",$db) OR DIE("Erreur : la base de donnÈes n'est pas accessible.");

$sql = "SELECT * from $table where pseudo= '" . addslashes(htmlspecialchars_uni($login)) . "'";

if ($req=mysql_query_first($sql))
{
if ($req[mdp]==md5($pass))
return 0;
else
return 2;
}
else
{
return 1;
}
}
?>

Tu la renommes en... disons identification.php. Ensuite tu n'as plus qu'a ecrire les pages ou tu veux vérifier l'identification de cette manière:

<?php
include("identification.php");
if((isset($login)) && (isset($pass)))
$ident = identification($login,$pass);
else
$ident = 3;

if($ident == 0)
{
// A faire si identifié
}
else if($ident == 1)
{
// A faire si utilisateur non trouvé
}
else if($ident == 2)
{
// A faire si mot de apsse mauvais
}
else if($ident == 3)
{
// A faire si pas de login/pass donné
}
?>

C'est une des manière de faire, surement pas la meilleure, mais au moins une que tu peux comprendre pour commencer. Quand je parle de 'booléen' c'est que tu peux simplifier et renvoyer avec identification true ou false...
Aussi, pour chaque lien entre les pages ou tu dois garder l'authentification, tu dois passer les login/pass en parametre ("mapage.php?login=$login&pass=$pass"), ou en champs cachés (input type="hidden") dans des formulaires...
Une fois que tu voudras aller plus loin et trouver la meilleur manière de faire, je te conseille d'aller jeter un oeil sur des sites de scripts php pour en prendre quelques uns et regarder coment c'est codé (évidemment faut faire gaffe aux trucs codés bourrin lol).

Mushu
24/02/2004, 22h58
lol ambre Tfiché ...

Akex
24/02/2004, 23h01
un switch $ident suivi de case :) est plus judicieux ;)

Coldfusion
25/02/2004, 16h20
Citation:
Posté par lanoix


<?php
include("identification.php");
if((isset($login)) && (isset($pass)))
$ident = identification($login,$pass);
else
$ident = 3;

if($ident == 0)
{
// A faire si identifié
}
else if($ident == 1)
{
// A faire si utilisateur non trouvé
}
else if($ident == 2)
{
// A faire si mot de apsse mauvais
}
else if($ident == 3)
{
// A faire si pas de login/pass donné
}
?>

Que la maniere soie pas la meilleure du monde... ca n'est pas grave, tant que ca marche...
merci pour ton aide qui m'est...d'une grande aide...

Concernant le script ci-dessus, comment fait-tu pour lui dire ce qu'il doit faire si...ou si...ou si...
en clair, je ne sait pas comment ecrire parfaitement en php ce que je veut qu'il fasse.

>>if($ident == 0)
Si identifié alors aller sur une page d'accueil, celle qui pour l'instant est la page2.php mais qu'a terme il me faudrait passer sur une page spéciale.

>>if($ident == 1)
Si utilisateur non trouvé, alors passer à la page1.php

else if($ident == 2)
Alors dire un message "le mot de passe est mauvais..." et rediriger sur identification.php

ce serait ? :
echo*'Votres mot de passe est faux';
et ensuite quelle est la commande pour rediriger ? Je fait en javascript ?

en clair ca donnerait :
?>
<script language="Javascript">
alert('Les mots de passes entrés ne correspondent pas. Veuillez revenir en arrière et vérifiez votre mot de passe.');
history.back();
</script>
<?

else if($ident == 3)
Si identifié alors aller sur une page d'accueil, celle qui pour l'instant est la page2.php mais qu'a terme il me faudrait passer sur une page spéciale.
------
est ce que je peut encore beneficier de ton aide pour cela svp ?

Merci beaucoup car quand je cherche les commandes pour rediriger je trouve que des javascripts ou des redirections HTTP...

grog6
25/02/2004, 16h40
Tu peux utiliser ca pour rediriger la page :

<script language=\"javascript\">
myvar = \"\"; timeout = 5;
function dorefresh() {
window.status=\"Redirecting\"+myvar; myvar = myvar + \" .\";
timerID = setTimeout(\"dorefresh();\", 100);
if (timeout > 0) { timeout -= 1; }
else { clearTimeout(timerID); window.status=\"\"; window.location=\"gauche.php\"; }
}
dorefresh();
</script>

Coldfusion
26/02/2004, 18h06
Bonjour tous

Toujours coldfusion en train de se trifouiller la tête avec ça...

quand je vais page4.php, je rentre mon login et mon pass, le fichier page4.php doit alors verifier via identification.php qui verifie alors dans la DB si j'ai mon pseudo et le bon pass
J'ai un message d'erreur :
Parse error: parse error in /usr/local/www/data.users/monsite.com/www/identification.php on line 7

et la ligne 7 est :
$db = @mysql_connect("$dbhost", "$dbuser", "$dbpass") OR DIE("Erreur : la base de donnÈes n'existe pas.");

què passa ? Pourquoi n'arrive t il pas à se connecter ?

Sinon grog6 je peut pas tester encore, j'attends que ceci marche.
Merci d'avance à vous deux, vous m'aidez beaucoup :001:

Foularou
26/02/2004, 18h10
Ne manque t'il pas un ; en fin d'instruction ou bien une { qui n'ai pas fermer?

Coldfusion
26/02/2004, 18h53
Ne manque t'il pas un ; en fin d'instruction ou bien une { qui n'ai pas fermer?ben non je pige pas...

rien ne manque et ... c'est la meme ligne que dans page2.php :confused:

<?php
require('_connexion.php');

function identification($login,$pass)
{

$db = @mysql_connect("$dbhost", "$dbuser", "$dbpass") OR DIE("Erreur : la base de donnÈes n'existe pas.");
@mysql_select_db("$dbbase",$db) OR DIE("Erreur : la base de donnÈes n'est pas accessible.");

$sql = "SELECT * from $table where pseudo= '" . addslashes(htmlspecialchars_uni($login)) . "'";

if ($req=mysql_query_first($sql))
{
if ($req[mdp]==md5($pass))
return 0;
else
return 2;
}
else
{
return 1;
}
}
?>

Foularou
26/02/2004, 18h59
if ($req[mdp]==md5($pass))
{
return 0;
}
else
{
return 2;
}

Coldfusion
26/02/2004, 19h16
j'ai donc compris qu'avant un else et apres un else, il faut toujours ouvrir puis fermer

Cependant dans ton exemple...je ne voit pas quoi faire au dessus...
Il m'en reste une d'ouverte dans ce cas,
juste après : if ($req=mysql_query_first($sql))

ou sinon c celle du début ?
Ou sinon c'est qu'il en manque une qui ferme en bas ?

J'ai donc mis cela (5 ouvertes / 5 fermées)

<?php
require('_connexion.php');

function identification($login,$pass)
{

$db = @mysql_connect("$dbhost", "$dbuser", "$dbpass") OR DIE("Erreur : la base de donnees n'existe pas.");
@mysql_select_db("$dbbase",$db) OR DIE("Erreur : la base de donnÈes n'est pas accessible.");

$sql = "SELECT * from $table where pseudo= '" . addslashes(htmlspecialchars_uni($login)) . "'";

if ($req=mysql_query_first($sql))
{
if ($req[mdp]==md5($pass))
{
return 0;
}
else
{
return 2;
}
else
{
return 1;
}

}
}
?>
mais...meme message d'erreur : ligne 7
:(
---
coldfusion
----

Pitchoune
26/02/2004, 19h19
Avec la modif sur ton message pour que je puisses mieux voir la mise en page, il te manque un } à la fin :)

Pitchoune
26/02/2004, 19h19
Mais depuis que tu as reposté le code, il manque plus :p

Coldfusion
26/02/2004, 19h40
j'y comprends rien, dans ce que je viens de reposter il y a 5 "}" et 5 "{"

Ne faut-il pas un crochet ouvert pour un crochet fermé ?

Coldfusion
29/02/2004, 11h56
:(

j'y arrive pas... :004: