INTEGER UNSIGNED AUTOINCREMEN

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 févr. 2008, 16:40

Eh bien, au lieu de faire un COUNT(1), tu récupères tout les champs en doublons et tu les testes en PHP si la requête a retourné un enregistrement.
Est-ce un problème de sécurite ou de vitesse d'opération sur la base si je laisse la table comme ça ?
Les deux ... :?
Pour les raisons exprimées par Sekiltoyai, c'est à dire les mots de passes en clair et la place qu'occupe ta base de données avec les champs en trop
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

09 févr. 2008, 16:55

De plus avec md5()

par exemple un mot de passe ressemble à 875eh5tdcc81da7a423fde85352f435e

comment je fait pour que le membre puisse taper 54896585 au lieu de 875eh5tdcc81da7a423fde85352f435e dans le script de connexion ?

J'ai essayé de mettre en md5() sont mot de passe lors de la connexion mais sa marche pas...
Cordialement zaknaou

ViPHP
ViPHP | 5924 Messages

09 févr. 2008, 18:24

Alors les raisons pour lesquelles ton shéma est mauvais sont multiples :
- Sécurité : Pour le mot de passe, cela pose un problème s'il est en clair
- Performances : S'il y a des champs inutiles, ou des index mal placés ou inexistants, ou des colonnes mal typées, les perfomances seront amoindries. De même, le calcul de l'identifiant par le moteur est de loin plus rapide et plus fiable que par l'application.
- Fonctionnalités : Si tu n'utilises pas les bons types de champ, tu te prives de certaines fonctionnalités (gestion des dates, auto incrémentation). Et avec ton schéma actuel, tu ne peux pas vérifier que 2 personnes ont inscrit le même email, ou le même numéro de téléphone, car, quoi que tu fasses, si quelqu'un remplit le champ email_1 avec le même email qu'un champ email_2 d'un autre enregistrement, je ne vois pas comment tu veux le vérifier de manière fiable et efficace avec ta solution actuelle, l'avantage d'une structure divisée en plusieures tables serait alors de pouvoir poser des contraintes d'unicité fiables sur l'email ou les autres champs de ce style.

Ensuite, pour le md5, sachant que la même chaine donnera toujours le même md5, si dans ta base tu as un mot de passe chiffré, il suffira de chiffrer le mot de mot que tu auras reçu de l'utilisateur, et de vérifier qu'il est bien égal au hash que tu as en base.

Eléphant du PHP | 88 Messages

09 févr. 2008, 20:30

En fait quand je retape mon code dans le champs mot de passe de la CONNEXION et que je valide mon code n'est pas trouvée dans la base pourtant il existe !!

Je tape 54896585 que je réception dans le code ci-dessous et qui devient avec md5 : 875eh5tdcc81da7a423fde85352f435e et pourtant un enregistrement avec pour mot de passe 875eh5tdcc81da7a423fde85352f435e existe bien dans la base de donnée...

Et je certifie que le code ci-dessous fonctionne avec un mot de passe en clair (testé)

Le code :
<?php

//-->> RECEPTION DES CHAMPS
$identifiant = $_POST['identifiant'];
$mot_de_passe = $_POST['mot_de_passe'];

//-->> MISE EN MINUSCULE DE L'IDENTIFIANT
$identifiant = strtolower($identifiant);

//-->> CRYPTAGE DU MOT DE PASSE
$mot_de_passe = md5($mot_de_passe);

//-->> PREPARATION
function stripgpc($value)
{
	if(get_magic_quotes_gpc()) $value = stripslashes($value);
	return $value;
}

//-->> SELECTION DU COMPTE
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant']))); 

$query = mysql_query($selection) or die(mysql_error());
$totalReponse = mysql_fetch_assoc($query);

if ($totalReponse['compte'] == 1 )
{
	echo"CONNEXION REUSSI";
}
else 
{
	echo"CONNEXION ECHOUEE";
}

?>
D'où vient l'erreur ?

Merci
Modifié en dernier par zaknaou le 10 févr. 2008, 10:51, modifié 1 fois.
Cordialement zaknaou

Eléphant du PHP | 88 Messages

10 févr. 2008, 20:15

J'ai affiché ma requête... En Page 2

Le code :
<?php

//-->> RECEPTION DES CHAMPS
$identifiant = $_POST['identifiant'];
$mot_de_passe = $_POST['mot_de_passe'];

//-->> MISE EN MINUSCULE DE L'IDENTIFIANT
$identifiant = strtolower($identifiant);

//-->> CRYPTAGE DU MOT DE PASSE
$mot_de_passe = md5($mot_de_passe);

//-->> PREPARATION
function stripgpc($value)
{
	if(get_magic_quotes_gpc()) $value = stripslashes($value);
	return $value;
}

//-->> SELECTION DU COMPTE
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant']))); 

$query = mysql_query($selection) or die(mysql_error());
$totalReponse = mysql_fetch_assoc($query);

if ($totalReponse['compte'] == 1 )
{
	echo"CONNEXION REUSSI";
}
else 
{
	echo"CONNEXION ECHOUEE";
}

?>
Et je sais maintenant pourquoi sa ne marchais pas, c'est parce que J'ai l'or de ma requête travailler à partir de $POST au lieu de $mot_de_passe qui au contraire des £POST est passé par MD5...

Si sa à afficher CONNEXION ÉCHOUÉE c'est parce que j'ai comparé un mot de passe passé par md5 avec une autre qui n'est pas passé par md5...
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant']))); 
Merci, quand même

Bonne soirée... :evil: :evil: :evil: :evil: :!:
Cordialement zaknaou

ViPHP
ViPHP | 928 Messages

10 févr. 2008, 21:08

Bonsoir,
c'est pourtant pas compliqué de comprendre pourquoi tu n'arrives pas à te connecter avec ta requête. Tu as :
$mot_de_passe = md5($mot_de_passe);
tu hash donc ton mot de passe ici.

Et dans ta requête tu n'utilises même pas cette variable $mot_de_passe (donc tu n'utilises pas le mot de passe que tu as hashé) :
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant'])));
Forcément ça peut pas marcher.

Donc la solution :
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($mot_de_passe)),
mysql_real_escape_string(stripgpc($identifiant)));
tout simplement ... tu as pas du chercher car je n'ai jamais vu de personne pratiquant le PHP butter sur un problème aussi simple aussi longtemps.


D'autant plus que tu aurais pu comprendre tout de suite ton problème si tu avais fait
echo $selection;
en dessous de ta requête, ça t'aurait affiché ta requête SQL avec le mot de passe non hash et tu en aurais déduis en même pas 1 microseconde que tu utilisais les mauvaises variables.

A mon avis :
  1. soit ce code n'est pas de toi (et dans ce cas à mon avis ça recoupe le 3ème choix)
  2. soit tu n'as tout simplement pas cherché à résoudre ton problème
  3. soit tu n'as absolument aucune logique (et donc je te conseil de te réorienté définitivement vers autre chose que le développement).
Il est difficile de répondre agréablement à une personne qui ne cherche même pas à essayer de comprendre ses problèmes.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 févr. 2008, 23:49

Modération : sujet nettoyé.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer