Securité Pseudo Password

Petit nouveau ! | 4 Messages

14 juin 2005, 20:34

Bonjour tous le monde,

Je suis en train de faire un site ou j'ai besoin d'une identification par pseudo et mots de passe.
j'ai créer ma base de donné, mon formulaire html, et ma verification en php.

ce qui ressemble à ça :

Pour le formulaire.html

Code : Tout sélectionner

<form action="verification.php" method="POST"> <input type="text" name="pseudo"> <input type="password" name="password"> </form>


Pour le verification.php

Code : Tout sélectionner

$pseudo=$_POST['pseudo']; $password=$_POST['password']; // Connexion a la base de donnée ... // Ecriture de quelques renseignements sur l'utilisateur

Le problème que je rencontre c'est que dans la barre des adresse j'ai verification.php?pseudo=pseudo&&password=password

Donc n'importe quel personne regardant l'historique peut facilement recuperer le mots de passe et le pseudo.

Il me semblait pourtant que la methode POST empeché cela...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

14 juin 2005, 20:51

effectivement il doit y avoir une coquille quelque part car avec la méthode POST les variables ne sont pas visibles dans l'url

poste un peu plus de code si tu veux qu'on cherche avec toi, car avec ce que tu donnes ici tu ne devrais pas avoir ce problème

Petit nouveau ! | 4 Messages

14 juin 2005, 21:42

Voici les codes complets de mes deux pages

formulaire.html

Code : Tout sélectionner

<html> <head> </head> <body> <?php include("menu_head.html"); // Feuille de style du menu echo'BODY {background-image: url("../images/fond.jpg")} '; // image de fond include("menu_body.html"); // menu ?> <form name="log" action="autentification.php" method="post"> <table> <tr> <td>Pseudo : </td> <td><input type="text" name="pseudo" size="40" maxlength="256"></td> </tr> <tr> <td>Password :</td> <td><input type="password" name="password" size="40" maxlength="256"></td> </tr> </table> <input type="submit" value="Valider"></center> </form> </body> </html>
pour le fichier autentification.php

Code : Tout sélectionner

<?php include("../menu_head.html"); echo'BODY {background-image: url("../images/fond.jpeg")} '; include("../menu_body.html"); $pseudo=$_POST['pseudo']; $password=$_POST['password']; if ($pseudo!=''") { $liendb=mysql_connect( "localhost","root"); mysql_select_db("produit",$liendb); $query = "SELECT * FROM pseudo WHERE pseudo='$pseudo'"; $resultat = mysql_query($query,$liendb); $ligne=mysql_fetch_array($resultat); if ($password==$ligne['password']) { echo 'Bienvenue M.'.$ligne['Nom'].' '.$ligne['Prénom']; echo'<a href="menu_menbre0.php">Veuillez cliquer ici pour acceder au menu</a>'; } else echo 'mauvais password '; } else echo "Veuillez entrer votre pseudo"; ?>

Mammouth du PHP | 19672 Messages

14 juin 2005, 21:54

À première vue, ton formulaire est correct et je ne vois pas pourquoi les valeurs du formulaire passeraient par l'url, vérifie que tu affiches bien le bon fichier dans ton navigateur. Juste un détail, il manque une balise d'ouverture <center> juste avant le bouton submit.

En revanche, tu risques fort d'avoir des surprises avec le fichier de traitement, voici une proposition de correction:
<?php
include("../menu_head.html");
echo"BODY {background-image: url(\"../images/fond.jpeg\")} ";
include("../menu_body.html");

$pseudo = isset($_POST['pseudo'])?$_POST['pseudo']:"";
$password = isset($_POST['password'])?$_POST['password']:"";

if ($pseudo != "")
{
    $liendb = mysql_connect( "localhost","root");
    mysql_select_db("produit",$liendb);
    $query = "SELECT * FROM pseudo WHERE pseudo='". $pseudo ."'";
    $resultat = mysql_query($query,$liendb);
    $ligne = mysql_fetch_array($resultat);

    if ($password == $ligne['password'])
    {
        echo "Bienvenue ".$ligne['Prénom']." ".$ligne['Nom'];
        echo"<a href=\"menu_menbre0.php\">Veuillez cliquer ici pour acceder au menu</a>";
    }
    else
    {
        echo "mauvais password ";
    }
}
else
{
    echo "Veuillez entrer votre pseudo";
}

?> 
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 4 Messages

14 juin 2005, 22:08

Pour information :

Quel est la difference entre

- $pseudo=$_POST['pseudo']

et

- $pseudo = isset($_POST['pseudo'])?$_POST['pseudo']:"";

Si l'explication n'est pas facile, pas besoin de te casser la tête je ferais une recherche sur de la documentation ....

En tout cas Merci pour ton aide.

Mammouth du PHP | 19672 Messages

14 juin 2005, 22:21

Ce que j'ai mis va t'éviter une notice ou un warning sirla valeur $_POST est vide, donc j'initialise la valeur $pseudo par exemple soit avec $_POST['pseudo'] si elle existe soit une chaine vide;

La formulation:
$pseudo = isset($_POST['pseudo'])?$_POST['pseudo']:""; 
Est complètement équivalente à:
if(isset($_POST['pseudo']))
{
    $pseudo = $_POST['pseudo'];
}
else
{
    $pseudo = "";
}
Un peu plus long ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 199 Messages

14 juin 2005, 22:56

Exactement ? est l'operateur ternaire, il fonctionne comme ca :

Code : Tout sélectionner

( condition )? "valeur_si_vrai" : "valeur_si_faux";
Les 2 font la paire : coder ET commenter :wink:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

14 juin 2005, 23:33

if (isset($_POST['pseudo']))
   $pseudo = $_POST['pseudo'];
   else
   $pseudo = "";
Tu me l'enlèves de la bouche ! :lol:

Ce devrait être à moi d'expliquer ça.
Après tout, c'est moi le spécialiste de cet opérateur !
C'est vrai, quoi ! Pour une fois que je maîtrise un truc...
:langue:

Mammouth du PHP | 19672 Messages

15 juin 2005, 07:58

Ce devrait être à moi d'expliquer ça.
Après tout, c'est moi le spécialiste de cet opérateur !
C'est vrai, quoi ! Pour une fois que je maîtrise un truc...
:langue:
Fallait pas me le montrer :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
pjl
ViPHP | 2119 Messages

15 juin 2005, 09:38

Et puisque l'on parle de sécurité; 2 points importants :
- vérifier les variables issues du formulaire avant de les utiliser ;
- crypter les mots de passe stockés dans la base de données.

Petit nouveau ! | 4 Messages

16 juin 2005, 00:33

Re ...
crypter les mots de passe stockés dans la base de données.
Comment crypte t'on les mots de passes dans la base de donnés ?

Mammouth du PHP | 19672 Messages

16 juin 2005, 00:39

Tu peux utiliser un hachage avec md5() ou sha1()
Attention cependant, le hachage est irréversible, ça veut dire qu'in internaute qui a perdu son mot de passe ne pourra pas le récupérer parce qu'on ne peut pas faire l'opération inverse.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 120 Messages

19 avr. 2006, 10:33

slt a tous,
je remet ce sujet a jour car j'y travaille en ce moment, et j'ai une question cocernant ce cryptage de mdp sur la bdd, comment peut on faire de controles d'autentifications si le mdp est crypté sur la bdd ? ce que je comprend dans ca c'est que le mot de passe est crypté dans la base meme, donc illisible, et donc pas moyen de faire de tests dessus. mais je suis sure ke j'ai compri le truc de travers, donc j'aimerai bien y voir un peu plus clair svp.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 avr. 2006, 10:42

ce que je comprend dans ca c'est que le mot de passe est crypté dans la base meme, donc illisible, et donc pas moyen de faire de tests dessus. mais je suis sure ke j'ai compri le truc de travers, donc j'aimerai bien y voir un peu plus clair svp.
Il te suffit simplement de crypter le mot de passe saisie par l'utilisateur et de vérifier que le résultat est le même que celui que tu as en base :)

Eléphant du PHP | 120 Messages

19 avr. 2006, 10:48

dans ce cas le mdp n'est pas crypté dans la bdd, mais c uniquement le mdp saisi qui est crypté.
Tu peux utiliser un hachage avec md5() ou sha1()
Attention cependant, le hachage est irréversible, ça veut dire qu'in internaute qui a perdu son mot de passe ne pourra pas le récupérer parce qu'on ne peut pas faire l'opération inverse.
c quoi ce hachage qui empeche de récuperer le mdp sur la base ? et pourquoi crypter un mdp dans la base ?