Aide securisation d'un code de connexion

Fermé
geoffreyvp - 12 mars 2011 à 11:01
avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 - 13 mars 2011 à 19:49
Bonjour a tous,
voila j'ai recemment recu dans ma base de donnees , une injection sql "\'"

je l'ai recu car mon ami s'est inscrit avec celle ci pour voir mes failles.

Mais voila j'essaie de le securiser avec mes mysql_real_escape_string(htmlspecialchars

mais maintenant ma page ne marche plus...

est ce que vous trouvez une erreur dans ce code ci dessous??

<?php
session_start();
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
$_SESSION['pseudo'] =  "$pseudo";
?>
<?php
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
if($pseudo == "");
{
echo 'bien essayé mais ca marchera pas';
}
else
{
--> la connexion <--
$sql = "SELECT password FROM membres WHERE pseudo='".$pseudo."'";
$req = mysql_query($sql) or die('Erreur SQL !');
$data = mysql_fetch_assoc($req);
if($data['mot_passe'] == $pass)
{
echo 'connexion reussie';
header ('location: zonemembre.php');
}
else
{
echo 'votre mot de passe est incorrect ou bien inconnu';
} 

}
?>


j'ai recopié 2 fois la ligne avec $ pseudo au debut mais je crois que une suffit amplement non??



A voir également:

7 réponses

personne n'aurait une idée??
0
avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 4 505
12 mars 2011 à 18:33
Salut.

- Ligne 4 : Inutile
- Lignes 5 et 6 : Elles ne servent à rien
- Ligne 7 : copie de la ligne 3 : $pseudo est déjà protégée
- Ligne 8 : Il ne faut pas de point-virgule dans les structures conditionnelles
- Ligne 14 : On utilise deux slashes pour mettre une ligne en commentaire

Dans ta requêtes SQL : 'SELECT password [...]'
Dans la condition : $data['mot_passe']
Toujours dans la condition, d'où vient $pass ?

Pour finir, tu ne peux pas utiliser header() après l'envoie du texte au navigateur (cf. ligne précédente).
0
je sais pas du tout mais mon $ pass marche parfaitement...
0
avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 4 505
12 mars 2011 à 19:31
L'option register_globals est sans doute activée sur ton serveur.
Je te conseille quand même de déclarer la variable comme tu l'as fais avec $pseudo, cette option n'est pas activée sur tous les serveurs.
D'ailleur, je te conseille aussi d'éviter cette option pour des raisons de sécurité.
0
donc je fais un $pass = ... comme le $pseudo c'est ca??
0
avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 4 505
12 mars 2011 à 22:01
oui, et n'oublie pas de remplacer $_POST['pseudo'] par $_POST['pass']
0
bizarrement j'ai toujours le meme probleme
0
<?php
session_start();
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
if($pseudo == "")
{
echo 'bien essayé mais ca marchera pas';
}
else
{
mysql_connect('sql200.hebergratuit.com','rober_6835970','florian');
mysql_select_db('rober_6835970_codcmoh');
$sql = "SELECT password FROM membres WHERE pseudo='".$pseudo."'";
$req = mysql_query($sql) or die('Erreur SQL !');
$data = mysql_fetch_assoc($req);
if($data['mot_passe'] == $_POST['password'])
{
header ('location: zonemembre.php');
}
else
{
echo 'votre mot de passe est incorrect ou bien inconnu';
} 

}
?>


voila un code corrigé mais ca ne marche toujours pas . (ca me met toujours mon "bien essayé mais ca marchera pas"

y aurait il un probleme avec ma condition ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Voici l'evolution de mon code :

<?php
session_start();
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
$password = md5(mysql_real_escape_string(htmlspecialchars($_POST['password'])));
?>
<?php
if(empty($pseudo))
{
echo 'bien essayé mais ca marchera pas';
}
else
{
//la connexion invisible bien sur
$sql = "SELECT password FROM membres WHERE pseudo='".$pseudo."'";
$req = mysql_query($sql) or die('Erreur SQL !');
$data = mysql_fetch_assoc($req);
if($data['password'] == $password)
{
echo 'Vous etes connecté';
header ('location: zonemembre.php');
}
else
{
echo 'votre mot de passe est incorrect ou bien inconnu';
} 

}
?>
0
avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 4 505
13 mars 2011 à 13:47
Salut.

- Pour utiliser mysql_real_escape_string(), une connexion à MySQL doit être active.

- Avant d'utiliser les variables $_POST, il faut vérifier si elles existent.

- Pour le pseudo, il faut également supprimer les espaces en début et fin avec trim()

- Il faut aussi vérifier si le membre existe sinon mysql_fetch_assoc() retournera false, donc $data['password'] n'existera pas, et tu auras une erreur "index is not defined"

- Pour des raisons de sécurité, j'ai pour habitude de n'afficher qu'un seul message en cas d'erreur, sans préciser si ce qui pose problème est le mot de passe ou si le membre n'existe pas.

Essaye avec ça :
https://gist.github.com/406ec42f9994c93cd2f0
(je ne l'ai pas testé avant, il peut y avoir des erreurs)
0
Mihawk Messages postés 4315 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 846
13 mars 2011 à 16:59
Hello,

Tu peux aussi utiliser des requêtes préparées avec la méthode bindParam qui te permet de définir le type de paramètre de ta requête (entier, string...) et d'éviter ainsi que les utilisateurs rentrent n'importe quoi !
0
avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 4 505
13 mars 2011 à 19:49
Les requêtes préparées, à la base, ne sont pas conçues dans le but de sécuriser mais plutôt pour optimiser les performances.
0