Accès page membre

stephelle Messages postés 56 Date d'inscription mercredi 14 septembre 2011 Statut Membre Dernière intervention 7 octobre 2012 - 13 déc. 2011 à 10:19
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 - 14 déc. 2011 à 08:55
Bonjour, un petit problème. Ma page d'accès tourne en rond en me disant "mauvais login ou mot de passe" alors que je suis bien enregistrer dans ma base sql. Où est cette petite erreur qui me pose tant de problème?!!

ma page "identification":

<?php
if (isset($_GET["m"]))
{
?>
<form action="securite.php" method="post">


Login :




Mot de passe :






<?php
if ($_GET["m"]=="1")
{
echo "Mauvais login ou mot de passe !

";
}
?>
<?php
?>
[validation.php S'inscrire]




<?php
}
?>




Ma "securite"


<?php
session_start();
if ($_POST["userid"] && $_POST["password"])
{
require "connect.inc.php";
$res = @mysql_query("SELECT userid FROM users WHERE userid='".mysql_real_escape_string($userid)."' AND password='".mysql_real_escape_string($password)."' AND level='registered'");
if(@mysql_num_rows($res) != 0)
{
$verified_user = $_POST["userid"];
session_register("verified_user");
Header("Location: ../".$page_redirection);
}
else
{
Header("Location: identification.php?m=1");
}
}
else
{
Header("Location: identification.php?m=1");
}
?>

Merci par avance pour vos réponses.

5 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
13 déc. 2011 à 11:03
Salut,

$res = @mysql_query("SELECT userid FROM users WHERE userid='".mysql_real_escape_string($userid)."' AND password='".mysql_real_escape_string($password)."' AND level='registered'");

Les variables $userid et $password ne sont pas définies, tu devrais remplacer respectivement par $_POST['userid'] et $_POST['password'].

J'en profite pour soulever quelques points :
- C'est une très mauvaise idée de stocker les mots de passe en clair dans ta base de données, et dans pas mal de pays c'est même illégal.
- Ta variable $verified_user ne sert à rien du tout.
- A première vue la sécurité de ton système laisse à désirer, par exemple on semble pouvoir facilement faire du XSS.
0
stephelle Messages postés 56 Date d'inscription mercredi 14 septembre 2011 Statut Membre Dernière intervention 7 octobre 2012
13 déc. 2011 à 13:02
C'était un vieux code que j'avais.
T'as raison je vais en refaire un autre, c'est plus sûr.

Merci pour ton éclairage.
0
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
13 déc. 2011 à 20:37
Salut,

petit message aux codeurs débutants,

J'appuie le propos de TychoBrahe, à propos de mots de passe en clair : j'ai repris il y à quelques années, une base existante, et j'ai trouvé plein de mots de passe et adresses mail. Il y a fort à parier que certaines personnes avait le même mot de passe pour d'autres applications...
J'ai évidement supprimé tout cela, et utilisé depuis une fonction de codage depuis, type md5...

Par ailleurs, la sécurité merite un peu plus d'effort :
- un test if (isset($_POST['userid'])) est une idée,
- utilisation des ' au lieu des " dans les $_POST
- un fichier de log des tentatives réussies et ratées,
- un appel mysql_query ( ) ; suivi d'un test if ( mysql_error() ) sans le mortel die ! - heureusement absent ici. - car une erreur sql dans un process de sécurité est inquiétant !
- un compteur d'essais (erreur) par IP, pour les tentatives par dictionnaire
- ...


Je me permets d'en parler, car le "vieux code" de stephelle est plein d'enseignement.

Bon boulot donc,
MC
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
13 déc. 2011 à 23:20
Salut,
un test if (isset($_POST['userid'])) est une idée,

empty() est encore mieux pour ce genre de cas. Mais je ne vois pas de rapport avec la sécurité.

utilisation des ' au lieu des " dans les $_POST

Ici non plus aucun lien avec la sécurité, à part un gain négligeable de performance ce n'est pas vraiment utile de changer ça.

un fichier de log des tentatives réussies et ratées,

Mieux, tu sépare totalement le système de log du reste, permettant de stocker les logs dans une entité que cette portion du code ignore totalement (txt, xml, bdd ou autre).

un appel mysql_query ( ) ; suivi d'un test if ( mysql_error() ) sans le mortel die ! heureusement absent ici. - car une erreur sql dans un process de sécurité est inquiétant !

Non, c'est le résultat de mysql_query() qu'on test à la recherche d'une erreur. Et le die() n'a rien de choquant, ce qui l'est est de fournir au visiteur les détails de l'erreur. Et si on veux bien faire, on commence par ne pas utiliser les fonctions mysql_* ;)

un compteur d'essais (erreur) par IP, pour les tentatives par dictionnaire

Pas mal mais il faut faire très attention à la manière d'implémenter ceci, il y a pas mal de pièges.
0

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

Posez votre question
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
14 déc. 2011 à 08:55
Merci TychoBrahe pour la qualité de ta réponse,
j'en prend bonne note.


a+
0
Rejoignez-nous