Bonjour tous le monde,
j'ai un petit soucis, j'essais de sécurisé ma page connexion mais ça ne fonctionne pas.
Voici le code
$pseudo = mysqli_real_escape_string(htmlspecialchars(trim($_POST['pseudo'])));
if(preg_match('#^[a-z\d_-]+$#i', $pseudo))
{
$errors[] = "Veillez saisir un vrai pseudo";
}
if($_POST)
{
/* debug($_POST); */
$selection_membre= executeRequete("SELECT * FROM membre WHERE pseudo = '$_POST[pseudo]'");
if($selection_membre ->num_rows !=0) // s'il y a un (ou plus) résultat, le pseudo existe en BDD
{
$membre = $selection_membre->fetch_assoc();
if($membre['mdp'] == $_POST['mdp'])
{
$msg .='<div class="barre success"><p>Mot de passe OK</p></div>';
foreach($membre AS $indice => $element) // ici cela permet d'inscrire les infos sauf le mdp dans la session
{
if($indice != 'mdp')
{
$_SESSION['utilisateur'][$indice] = $element;
}
}
header('location:profil.php'); // le pseudo et le mdp étant correct nous voyons l'utilisateur sur la page profi. toujours mettre apres la declaration de la session .
}
else
{
$msg .='<div class="barre danger"><p> Erreur de mot de passe</p></div>';
}
$msg .='<div class="barre success"><p>Pseudo OK</p></div>';
}
else
{
$msg .='<div class="barre danger"><p> Erreur de pseudo</p></div>';
}
}
quand j'entre ça:
'OR 1=1 OR 1='
ca me met pseudo ok !
Merci à vous
Bonsoir,
je vois déjà une erreur dans le preg_match, le test est inversé
if(!preg_match('#^[a-z\d_-]+$#i', $pseudo))
{
$errors[] = "Veillez saisir un vrai pseudo";
}
(au passage, c'est '"Veillez à saisir" ou "Veuillez saisir")
Pour la différence entre les deux domaines, je pense que ton domaine n'affiche pas les E_NOTICE
dans la fonction executeRequete, je soupçonne que tu utilises $mysqli->query(...)
qui renvoie soit un booléen (false) soit un objet résultat
dans ton cas il renvoie false, donc pas un objet
la ligne suivante :
if($selection_membre ->num_rows !=0)
lève un NOTICE car $selection_membre n'est pas un objet !!!
A toi à nous dire ce qu'il y a dans la fonction executeRequete
@huggy dans ma fonction execute requete il y a
function executeRequete($req)
{
global $mysqli; // permet de récupérer $mysqli depuis l'espace global
$resultat = $mysqli->query($req); // on exécute la requete reçue en argument
if(!$resultat) // si cela renvoie false, c'est qu'il y a une erreur de requete
{
die('Erreur sur la requete SQL. <br /> Message : ' .$mysqli->error .'<br />Code : '.$req);
}
return $resultat;
}
merci
oui dans le chanp pseudo pour me connecter
il y a pseudo et mot de passe
du coup quand j'entre 'OR 1=1 OR 1=' avec un bon mot de passe ça me connect
Jai opté pour utilisé : mysql_real_escape_string
Mais il y a un soucis sur ma requete je pense car ca n'ajoute pas les slashes
$pseudo = mysql_real_escape_string($_GET['pseudo']);
$requete = mysql_query("SELECT * FROM membre WHERE pseudo='$pseudo'");
if($_POST)
{
/* debug($_POST); */
$selection_membre= mysql_query("SELECT * FROM membre WHERE pseudo='$pseudo'");
if($selection_membre ->num_rows !=0) // s'il y a un (ou plus) résultat, le pseudo existe en BDD
{
$membre = $selection_membre->fetch_assoc();
if($membre['mdp'] == $_POST['mdp'])
{
$msg .='<div class="barre success"><p>Mot de passe OK</p></div>';
foreach($membre AS $indice => $element) // ici cela permet d'inscrire les infos sauf le mdp dans la session
{
if($indice != 'mdp')
{
$_SESSION['utilisateur'][$indice] = $element;
}
}
header('location:profil.php'); // le pseudo et le mdp étant correct nous voyons l'utilisateur sur la page profi. toujours mettre apres la declaration de la session .
}
else
{
$msg .='<div class="barre danger"><p> Erreur de mot de passe</p></div>';
}
$msg .='<div class="barre success"><p>Pseudo OK</p></div>';
}
else
{
$msg .='<div class="barre danger"><p> Erreur de pseudo</p></div>';
}
}
Pour commencer, il y a quelque chose qui ne va pas dans ton système.
Tu veux connecter un utilisateur et tu ne limites pas ta requête.
Tu dois donc commencer par faire en sorte qu'il ne puisse pas y avoir plusieurs utilisateurs qui aient le même pseudo.
Ensuite, tu as une erreur de message, car dans le cas ou aucun enregistrement ne correspond au pseudo soumis, tu dis que le pseudo est incorrect, ce qui n'est pas forcément un message correct, tu ferais mieux de dire que les identifiants sont incorrect.
Ta condition doit être incorrecte alors, fais plutôt quelque chose comme :
$req = executeRequete("SELECT * FROM membre WHERE pseudo = $pseudo");
if (isset($req) {
// Suite du code ...
}
Par contre, ce qui ne me plait vraiment pas, c'est que vous êtes deux à poster le même sujet pour le même problème, dans deux forums différents (Voir ici : Gros problème ! probleme de sécurité), du coup il y a des suivies de réponses qui ne sont pas regroupés, vous ne devriez pas exagérer comme-ça.
Il ne faut pas revenir à l'ancien API mysql, ça risque d'être supprimé bientôt, reste en mysqli ou passe en pdo
$mysqli = new mysqli("localhost", $dbuser, $dbpwd, "mabase");
if ($mysqli->connect_errno) {
echo "Echec lors de la connexion à MySQL : (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$pseudo = $mysqli->real_escape_string(htmlspecialchars(trim($_POST['pseudo'])));
if(!preg_match('#^[a-z\d_-]+$#i', $pseudo)) die("veillez à saisir un pseudo");
if($_POST)
{
$selection_membre= $mysqli->query("SELECT * FROM membre WHERE pseudo = '$_POST[pseudo]'");
if($selection_membre) // c'est soit false , soit un résultat si le pseudo existe en BDD
{
...
Le plus propre est quand même de passer par une requête preparée
$stmt = $mysqli->prepare("SELECT * FROM membre WHERE pseudo = ? ");
$stmt->bind_param('s', $_POST['pseudo']);
$stmt->bind_result($selection_membre);
...
@huggy bind_param et Bin_param et bind_result
sont obselete depuis la version 5.4 :-(
Re jai trouvé avec mysqli_real_escape_string
(vu que c'est pédagogique et que c'est un site ficitf je veux faire simple)
if($_POST)
{
/* debug($_POST); */
$selection_membre= "SELECT * FROM membre WHERE pseudo = '".mysqli_real_escape_string($_POST['pseudo'])."'";
if($selection_membre ->num_rows !=0) // s'il y a un (ou plus) résultat, le pseudo existe en BDD
{
$membre = $selection_membre->fetch_assoc();
if($membre['mdp'] == $_POST['mdp'])
{
$msg .='<div class="barre success"><p>Mot de passe OK</p></div>';
foreach($membre AS $indice => $element) // ici cela permet d'inscrire les infos sauf le mdp dans la session
{
if($indice != 'mdp')
{
$_SESSION['utilisateur'][$indice] = $element;
}
}
header('location:profil.php'); // le pseudo et le mdp étant correct nous voyons l'utilisateur sur la page profi. toujours mettre apres la declaration de la session .
}
else
{
$msg .='<div class="barre danger"><p> Erreur de mot de passe ou Psudo</p></div>';
}
$msg .='<div class="barre success"><p>Pseudo OK</p></div>';
}
else
{
$msg .='<div class="barre danger"><p> Erreur de mot de passe ou Psudo</p></div>';<br> }
}
J'ai juste une erreur
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in /home/users6/d/diallo/www/connexion.php on line 19
pourqui mettre 2paramètres si ca me va comme ça?
Merci :-)
Non, ce sont les alias mysqli_bind_param et mysqli_bind_result qui ont été supprimés
mais les vraies fonction mysqli_stmt_bind_param et mysqli_stmt_bind_result sont toujours d'actualité.
dans mon exemple, je ne fais pas de procédural car je passe par un objet statement, donc c'est bon
ok dac finalement j'ai trouver mais quand le pseudo est ok ca ne me connect pas grrr
if(UtilisateurEstConnecte())
{
header('location:profil.php');
}
include ('inc/header_nav.inc.php');
if(!empty($_POST['pseudo']) && !empty($_POST['mdp']))
{
include ('inc/init.inc.php');
$sql = "SELECT * FROM membre WHERE pseudo = '".mysqli_real_escape_string($mysqli, $_POST['pseudo'])."' AND mdp = '".sha1($_POST['mdp'])."'";
/*echo $sql."<br/>";*/
$co = mysqli_query($mysqli, $sql);
if(mysqli_num_rows($co) > 0)
{
echo"<br/>header('location:profil.php'); // le pseudo et le mdp étant correct nous voyons l'utilisateur sur la page profi. toujours mettre apres la declaration de la session .";
}
else{
echo "<div class='barre danger'><p>Erreur de mot de passe ou Pseudo</p></div>";
}
}
fait un var_dump($sql) pour voir la tête de ta requête, puis compare avec les valeurs de ta table
@huggy super merci
ça me mais ça
string(99) "SELECT * FROM membre WHERE pseudo = 'admin223' AND mdp = '9a2bcfca51e613a7257c3ae093b5a8842ebdc830
le soucis viens de ```
if(!empty($_POST['pseudo']) && !empty($_POST['mdp']))
{
include ('inc/init.inc.php');
$sql = "SELECT * FROM membre WHERE pseudo = '".mysqli_real_escape_string($mysqli, $_POST['pseudo'])."' AND mdp = '".($_POST['mdp'])."'";
/*echo $sql."<br/>";*/
$co = mysqli_query($mysqli, $sql);
if(mysqli_num_rows($co) > 0)
{
$user = mysqli_fetch_assoc($co);
$_SESSION['utilisateur']['pseudo'] = $user['mdp'];
header('location:profil.php');
}
/*le pseudo et le mdp étant correct nous voyons l'utilisateur sur la page profil. toujours mettre apres la declaration de la session */
}
else{
echo "<div class='barre danger'><p>Erreur de mot de passe ou Pseudo</p></div>";
}
debug($_POST);
cette partie la
$_SESSION['utilisateur']['pseudo'] = $user['mdp'];
quand je fais un debug
Array
(
[pseudo] => admin223
[mdp] => tata
[connexion] => connexion
)
il m'affiche pas le bon mdp
c'est bon j'ai reussi
jai une autre erreur:
Erreur sur la requete SQL.
Message : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
Code : SELECT * FROM membre WHERE id_membre=
if(!empty($_POST['pseudo']) && !empty($_POST['mdp']))
{
include ('inc/init.inc.php');
$sql = "SELECT * FROM membre WHERE pseudo = '".mysqli_real_escape_string($mysqli, $_POST['pseudo'])."' AND mdp = '".($_POST['mdp'])."'";
/*echo $sql."<br/>";*/
$co = mysqli_query($mysqli, $sql);
if(mysqli_num_rows($co) > 0)
{
$user = mysqli_fetch_assoc($co);
$_SESSION['utilisateur']['pseudo'] = $user['pseudo'];
header('location:profil.php');
}
/*le pseudo et le mdp étant correct nous voyons l'utilisateur sur la page profil. toujours mettre apres la declaration de la session */
}
else{
echo "<div class='barre danger'><p>Erreur de mot de passe ou Pseudo</p></div>";
}
sorry tellement stréssé
Ton problème de syntaxe vient probablement du mot de passe.
Je te conseillerais plutôt de faire tes traitements de chaînes avant la requête :
$pseudo = mysqli_real_escape_string($mysqli, $_POST['pseudo']);
$mdp = sha1($_POST['mdp']);
// Et tu injectes les variables dans ta requête
Tu avais mis ($_POST['mdp'])
au lieu de sha1($_POST['mdp'])
.
@lartak merci
if(!empty($_POST['pseudo']) && !empty($_POST['mdp']))
{
include ('inc/init.inc.php');
$pseudo = mysqli_real_escape_string($mysqli, $_POST['pseudo']);
$mdp = sha1($_POST['mdp']);
$sql = "SELECT * FROM membre WHERE pseudo = '".mysqli_real_escape_string($mysqli, $_POST['pseudo'])."' AND mdp = '".($_POST['mdp'])."'";
/*echo $sql."<br/>";*/
$co = mysqli_query($mysqli, $sql);
if(mysqli_num_rows($co) > 0)
{
$user = mysqli_fetch_assoc($co);
$_SESSION['utilisateur']['pseudo'] = $user['pseudo'];
header('location:profil.php');
}
/*le pseudo et le mdp étant correct nous voyons l'utilisateur sur la page profil. toujours mettre apres la declaration de la session */
}
else{
echo "<div class='barre danger'><p>Erreur de mot de passe ou Pseudo</p></div>";
}
toujours pareil:
Erreur sur la requete SQL.
Message : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
Code : SELECT * FROM membre WHERE id_membre=
Heu. ce n'est pas du tout cette requête qui est mise en cause alors, il n'y a pas de champ id_membre
dans celle-ci (je n'avais pas fais attention).
Regardes plutôt à la ligne 1.
Tu sais quoi ?
Je te conseille de visionner les deux tutoriels vidéos suivants, car je n'ai pas trop l'impression que tu fasse attention à ce que tu fais et de les suivre, ça t'aidera certainement : PHP » Gestion d'un espace membre et PHP » Gestion d'un espace membre (refactorisation).
Les gens utiliser la Pdo est la fonction prepare c'est largement plus simple ;)