PHP d'authentification

Répondre
doudi
le 14/02/2005 à 15:19
doudi
Bonjour,

J'ai lu quelques un de vos articles et cours mais j'ai un petit problème concernant ma page de connexion pour entrer dans la page membre.

Voici le code de ma page "login.php" :

http://www.lephpfacile.com/wall/wall.php?id=2011

Avec deux conditions ça fonctionne bien !

Si la personne a tapé les bons identifiants alors elle est redirigée sur la page membre nommée "page_membre.php" sinon la personne est redirigée sur la page inscription.php

J'ai ajoutée une 3e condition mais la ça bug ! smiley Ma 3e condition serait : si la personne tape le bon "login" mais le mauvais "pass" alors la rediriger sur la page login.html

Peut etre que je me casse trop la tete pour chercher des conditions ! si vous avez des idées faites moi en part :-)

Merci

P.S. : bonne st valentin à toutes et à tous !

smiley
XTremTourist
le 14/02/2005 à 15:54
XTremTourist
heu

if
else
else

gnia !?! smiley

en general c plutot du style

if(xxx)
elseif(xxxx)
else

essai plutot comme sa

<?php
//Recuperation des donnees du formulaire
$login = $_POST['login'];
$pass = md5(addslashes($_POST['pass']));

//verification si le Login existe
$query_login = "SELECT id FROM membres WHERE login='$login'";
$result_login = mysql_query($query_login, $connection) or die('error making query');
$nombre_result = mysql_num_rows($result_login);

if($nombre_result == 1)
{
//le login existe verification des donnees
$query_pwd = "SELECT * FROM membre WHERE login='$login' AND pass='$pass'";
$result_pwd = mysql_query($query_pwd, $connection) or die('error making query');
$result_pwd = mysql_num_rows($result_pwd);
if($result_pwd == 1)
{
//Verification ok
$_SESSION['login'] = $_POST['login'];
$_SESSION['pass'] = $_POST['pass'];
header ('location: page_membre.php');
}
else
{
//Erreur le mot de passe n est pas bon
echo '<meta http-equiv="refresh" content="0;URL=login.html">';
}
}
else
{
//Le membre n existe pas
echo 'Veuillez vous inscrire';
echo '<meta http-equiv="refresh" content="0;URL=inscription.php">';
}
?>
zebden
le 14/02/2005 à 16:06
zebden
Y a une requete qui ne sert a rien la.

<?php
$sql = 'SELECT login,pass FROM `membres` WHERE `login` = "'.$login.'"';
$req = mysql_query($sql, $connection) or die('error making query '.$sql.''.mysql_error());

// On teste s'il trouve bien le login rentrée
if(mysql_num_rows($req) == 1) {

$tab = mysql_fetch_assoc($req);

// On test si le pass correspond.
if($_POST['pass'] == $tab['pass']) {

$_SESSION['login'] = $tab['login'];
$_SESSION['pass'] = $tab['pass'];
header ('location: page_membre.php');

}
else {
// On ne précise pas si c'est le login ou le pass qui est mauvais.
echo 'Votre login ou votre pass ne sont pas bons';
echo '<meta http-equiv="refresh" content="0;URL=login.html">';
}
}
else {
echo 'Veuillez vous inscrire';
echo '<meta http-equiv="refresh" content="0;URL=inscription.php">';
}

?>


Il faudra un peu plus securiser le code quand meme
je te montre juste la base en partant de ton code.
zebdinou pour les intimes / Blog : http://www.zebden.fr
doudi
le 14/02/2005 à 16:39
doudi
merci pour vos réponses

zebden > pourquoi on ne doit pas préciser si c'est le login ou le pass qui est mauvais? ça permet à la personne de faire attention lorsqu'elle retape ses identifiants après s'être trompée. Si c'est bien codé il n'y a pas de risque smiley
keitarosan
le 14/02/2005 à 16:46
keitarosan
oui, il faut securiser ton code, sinon tu te retrouve avec du sql injection ^^.

autrement dit, je peux rentrer sur ton site rien qu'en voyant ta requete, sans avoir de login et password...

Alors faut faire super gaffe...

De plus, evite les balise <meta>, c'est pas terrible.

Tu as deja un header("Location: xxx.php"), alors utilise les meme pour rafrachir la page actuelle, c'est un peu plus propre :)
Pense aussi a mettre un exit(0); juste apres le header();, comme ca, pas besoin de continuer a faire des verif sur le restant du script et de la page :)

Enfin, tu peux tout simplement faire pour la requete:

<?php

$sql = "
SELECT
login,
pass
FROM
membres
WHERE
login = '$login' AND
pass = '$pass'
";

?>

ensuite, tu verifie que $req est different de 0, et si c'est le cas, c'est que c'est le bon login et password.
Pas besoin de faire un fetch_assoc puisque le user a deja fait saisi le login et password.

d'ou:
<?php

$req = mysql_query($sql, $connection) or die('error making query '.$sql.''.mysql_error());

// On teste s'il trouve bien le login rentrée
if($req !== 0)
{
$_SESSION['login'] = $login;
$_SESSION['pass'] = $pass;
header ('Location: page_membre.php');
}
else
{
echo 'Votre login ou votre pass ne sont pas bons';
echo '<meta http-equiv="refresh" content="0;URL=login.html">';
}

?>


Voila, je précise aussi que votre enchainement n'est pas logique ;)

S'il ne trouve pas le login, on va a la page inscription. (1ere indication pour une personne malveillante: ce login existe pas...)

Si le login existe mais pas le bon mot de passe, hop, on met un message 'Login ou Pass incorect', et ca, c'est pas logique, vu que dans ce cas la, une personne malveillante saura forcément que c'est le pass qui n'est pas bon.


Enfin, pour terminer, il est inutile de stocker le password en session, et c'est meme plutot dangereux.
Car si une personne malveillante trouve le moyen de recup l'info, dans ce cas il a le mot de passe. Bon, celui ci est hashé en md5(), certe, mais on peut toujours faire trouver un dico des équivalence md5()/mot en clair.
Le login suffit, et a la limite, un nombre aléatoire ^^.
D'ailleur, pour le login, c'est pas terrible non plus, le pseudo serait plus logique, et moins dangereux.
Un utilisateur basique mettra bien souvent un login/password identique.
(j'ai fait le test avec mon patron, ca a marché :D)

Donc voila voila, gaffe a la securité, car une session de login, c'est toujours un point sensible, et plus le site fonctionnera, plus on tentera de l'attaquer...

KeitaroSan
>> http://projectopensource.free.fr/index.php?m=2&m2=5&s=8 <<
zebden
le 14/02/2005 à 16:54
zebden
Ok pour le pass et login en session , ca ne sert pas à grand chose.
Personellement je met juste en session une clef (qui correspond a l'user).

Pas ok pour le pass dans la requete (injections SQL)

md5() effectivment pour crypter ton pass.
zebdinou pour les intimes / Blog : http://www.zebden.fr
doudi
le 14/02/2005 à 17:03
doudi
bah en fait pour moi le "login" c'est la meme chose que le "pseudo".

Sinon pour ce qui est du code, j'ai commencé le php hier smiley Quand j'aurais terminé ma zone d'authentification je demanderai à une personne calé en php pour me sécuriser tout ça !! :-)

Merci pour les infos
keitarosan
le 14/02/2005 à 17:04
keitarosan
le sql injection et le password, ca n'a rien a voir ;)

Le sql injection, c'est juste le fait d'avoir une requete a un moment, dont certaines valeurs sont des variables php.

Si ces variables ne sont pas protégées, (avec des addslashes(), et mieux encore mysql_escape_string()), alors toute personne malintentionnée qui connait la methode, peut faire un peu ce quelle veut, et descendre toute la base de données ;)

Donc qu'on est que le login, ou que le password, ou les deux, c'est exactement pareil :)
>> http://projectopensource.free.fr/index.php?m=2&m2=5&s=8 <<
zebden
le 14/02/2005 à 17:09
zebden
Nan imagine tu fais un truc du genre dans le champs login " admin" OR 1=1'# " du coup il ne teste que le login et peut acceder au compte "admin" ..

Le password devient obsolète donc je prefere un verification apres que directement dans la requete.

Mais la ou je suis ok, c'est le addslashes et le mysql_escape_string et meme plutot mysql_real_escape_string que j'utilise.
zebdinou pour les intimes / Blog : http://www.zebden.fr
keitarosan
le 14/02/2005 à 17:13
keitarosan
euh, t'a pas du saisir ;)

si tu utilise mysql_escape_string() ou autre, de toute facon, il peut pas faire de sql injection ^^

justement, c'est pour enpecher cela :)

Car meme avec juste le login, si c'est pas protégé, on fait du sql injection :)
>> http://projectopensource.free.fr/index.php?m=2&m2=5&s=8 <<
Répondre
LoadingChargement en cours