Mdp PHP

Signaler
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010
-
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010
-
Bonjour, j'ai un problème de mot de passe dans mon code PHP le voici :
<script type="text/javascript"><?php
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
        if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

                $base = mysql_connect ('localhost', 'user', 'mdp');
                mysql_select_db ('membre', $base);

                // on teste si une entrée de la base contient ce couple login / pass
                $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
                $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
                $data = mysql_fetch_array($req);

                mysql_free_result($req);
                mysql_close();

                // si on obtient une réponse, alors l'utilisateur est un membre
                if ($data[0] == 1) {
                        session_start();
                        $_SESSION['login'] = $_POST['login'];
                        header('Location: membre.html');
                        exit();
                }
                // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
                elseif ($data[0] == 0) {
                        $erreur = 'Compte non reconnu.';
                }
                // sinon, alors la, il y a un gros problème 
                else {
                        $erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
                }
        }
        else {
                $erreur = 'Au moins un des champs est vide.';
        }
}
?>
</script>


je voudrait sécuriser mes info :
 $base = mysql_connect ('localhost', 'user', 'mdp');
pour que mes visiteur un peu curieux ne puiss pas voir mon mdp ...
merci de m'aider

13 réponses

Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
18
bonsoir

//avant

$sql = 'SELECT count(*) FROM membre
WHERE login="'.mysql_escape_string($_POST['login']).'"
AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"'
;

//aprés
//fait des variables intermediares ça evitera d'injecter direct dans la requete
//injection sql
//strip_tags pour le xss

$login=mysql_real_escape_string(strip_tags($_POST['login']));
$pass=mysql_real_escape_string(strip_tags($_POST['pass']));
$pass=md5($pass);

$sql = 'SELECT count(*) FROM membre
WHERE login="'.$login.'"
AND pass_md5="'.$pass.'"'
limit 1; /* le premier trouvé est c'est tout */
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
18
mais des exit; ou die();
voir header('Location:http://????');exit; si le test est négatif
n'affiche pas les erreurs ...
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
53
Je comprends pas :
[quote=Cod57]fait des variables intermediares ça evitera d'injecter direct dans la requete/quote

En quoi :
$login=mysql_real_escape_string($_POST['login']);
SELECT count(*) FROM membre WHERE login='".$login."'
est différent de :
SELECT count(*) FROM membre WHERE login='".mysql_real_escape_string($_POST['login')."'

??




______________________________________________________________________
Messages postés
240
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
19 juillet 2012
2
Bonjour;

Premier cas : tu range $_POST['login'] dans une variable $login "nettoyée" que tu peut réutilisé tel que dans tes requêtes.
Deuxième cas : Tu devras utilisé le code à chaque fois que tu voudras passer ta variable $_POST['login'] dans une requête.

Ensuite pour "sécurisé" tes mots de passe etc

Créer un fichier config.php qui contient ceci
DEFINE('SRV_NAME','localhost');
DEFINE('SRV_USER','user');
DEFINE('SRV_PASS','mdp');
DEFINE('BSE_WORK','membre');

en début de fichier tu ajoute require_once('config.php');
Tu remplace alors

$base = mysql_connect ('localhost', 'user', 'mdp');
mysql_select_db ('membre', $base);

par

$base = mysql_connect (SRV_NAME, SRV_USER,SRV_PASS);
mysql_select_db (BSE_WORK, $base);


Avantage, si tu change ton mot de passe de base de données; tu n'auras à le modifié que dans config.php; cela sera pris en compte ensuite dans tout les scripts qui utilise la connexion.

Sans maitrise, la puissance n'est rien
Il ne faut pas vendre la peau de l'ours, non il ne faut pas.
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010

Premier cas : tu range $_POST['login'] dans une variable $login "nettoyée" que tu peut réutilisé tel que dans tes requêtes. 
Deuxième cas : Tu devras utilisé le code à chaque fois que tu voudras passer ta variable $_POST['login'] dans une requête. 


c'est a dire que je doit faire comment ?
Messages postés
240
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
19 juillet 2012
2
Bonjour,

Tout dépend de la longueur de ton code ... et du nombre de requête ...

L'idéal reste encore de faire,

$login=mysql_real_escape_string($_POST['login']);
SELECT count(*) FROM membre WHERE login='".$login."' 


Pour prendre de bonne habitude.

Sans maitrise, la puissance n'est rien
Il ne faut pas vendre la peau de l'ours, non il ne faut pas.
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010

D'accord merci de votre aide.
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010

j'ai aussi un autre problème avec le script :
<?php
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') { 
   if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) { 
 
      $base = mysql_connect ('localhost', 'name', 'mdp'); 
      mysql_select_db ('membre', $base); 
 
      // on teste si une entrée de la base contient ce couple login / pass
      $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"'; 
      $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error()); 
      $data = mysql_fetch_array($req); 
 
      mysql_free_result($req); 
      mysql_close(); 
 
      // si on obtient une réponse, alors l'utilisateur est un membre
      if ($data[0] == 1) { 
         session_start(); 
         $_SESSION['login'] = $_POST['login']; 
         header('Location: membre.php'); 
         exit(); 
      } 
      // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
      elseif ($data[0] == 0) { 
         $erreur = 'Compte non reconnu.'; 
      } 
      // sinon, alors la, il y a un gros problème :)
      else { 
         $erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.'; 
      } 
   } 
   else { 
      $erreur = 'Au moins un des champs est vide.'; 
   }  
}  
?>


sur ma page quand je m'identifie (j'ai fait mon compte admin) et bien sa me marque sa :

Warning: session_start() [function.session-start]: open(/mnt/169/sdd/f/2/thenavy/sessions/sess_0819b82c099ad34c2b0b1977ae68ebb3, O_RDWR) failed: No such file or directory (2) in /mnt/169/sdd/f/2/thenavy/index.php on line 19

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /mnt/169/sdd/f/2/thenavy/index.php:19) in /mnt/169/sdd/f/2/thenavy/index.php on line 19

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /mnt/169/sdd/f/2/thenavy/index.php:19) in /mnt/169/sdd/f/2/thenavy/index.php on line 19

Warning: Cannot modify header information - headers already sent by (output started at /mnt/169/sdd/f/2/thenavy/index.php:19) in /mnt/169/sdd/f/2/thenavy/index.php on line 21

Warning: Unknown(): open(/mnt/169/sdd/f/2/thenavy/sessions/sess_0819b82c099ad34c2b0b1977ae68ebb3, O_RDWR) failed: No such file or directory (2) in Unknown on line 0

Warning: Unknown(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/mnt/169/sdd/f/2/thenavy/sessions) in Unknown on line 0

Merci de m'aider
Messages postés
240
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
19 juillet 2012
2
Bonjour,

La fonction session_start() doit être au tout début de ton script.
comme ceci :

<?php
session_start();
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') { 




Sans maitrise, la puissance n'est rien
Il ne faut pas vendre la peau de l'ours, non il ne faut pas.
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010

Bonjour, alors j'ai fait ce que vous m'avez dit mais sur ma page membre.php j'ai ce code :
<?php 
session_start();
if (!isset($_SESSION['login'])) {
header ('Location: membre.php');
exit();
}
?>


et sa me met aussi un probleme de
session_start();
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010

parce que enfaite quand j'enleve les session_start() de mes page index.php et inscription.php sa me redirige bien vers ma page membre.php, mais c'est cette derniere qui a un probleme de session_start() ...
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
53
Ce problème a déjà été traité sur le forum, à multe reprise. Une petite recherche te fera pas de mal.
Notamment dans la DOC PHP : php.net

Ton problème n'est rien de bien méchant, c'est juste qu'il y a une façon d'utiliser les entêtes.
Par ailleurs il existe une manière de contourner ce genre de souci avec les fonctions de bufferisation de sortie.



______________________________________________________________________
Messages postés
7
Date d'inscription
dimanche 19 juillet 2009
Statut
Membre
Dernière intervention
24 décembre 2010

D'accord merci, j'ai trouvé la solution, il manquait un dossier " sessions ", depuis sa fonctionne super bien, merci a vous.