8790 sujets

Développement web côté serveur, CMS

Pages :
Bonjour a tous,
j'ai un problème sur mon site, uqi dispose d'une zone membre.
le formulaire d'inscription permet le choix d'un mot de passe contenant des caractères accentués (é, è, à, ',...) et tout fonctionne très bien, c'est enregistré dans la base de données (je ne vois pas le mot de passe choisi car il est crypté), donc ils sont admis.
or, dès que l'on essaye de se logguer avec le même mot de passe (qui a des accents), impossible de se connecter.

une idée ? il vous en faut plus ?

Merci d'avance...
Modifié par Gryzzly (06 Jun 2007 - 12:40)
la page de login as-t-elle bien sont sa balise meta qui la met dans le bon encodage? (le même que pour l'inscription )

sinon cherche sur les fonctions que tu appliques a ton entrée. y a surement quelquechose qui encode differemment.

verifie aussi que tu utilises mysql_query("SET NAMES 'utf8'"); (si c'est de l'utf-8) pour ressortir les requetes sql sous le bon format....

etc..,etc..
Modifié par CPascal (04 Jun 2007 - 12:26)
Salut,

toutes mes pages sont déclarées :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

c'est un header commun appelé par les pages, le login etant lui meme inclus dans toutes les pages.

la base de données est encodée :
latin1_general_cs


peut être faut il que je transforme mes saisies avec la fonction
htmlspecialchars()
??

J'enregistre le mot de passe ainsi :
$encrypted = md5(md5($user_password).$salt);


Dans le login, l'utilisateur rempli $user_password, et je teste :
$encrypted_pass = md5(md5($user_password).$user['user_salt']);

// On teste l'utilisateur avec login et mot de passe crypté
$query = "SELECT user_id, user_name, user_email FROM user WHERE user_name='$user_name' AND user_password='$encrypted_pass'";
$result = mysql_query($query);


Une idée ?
Modifié par Gryzzly (04 Jun 2007 - 12:52)
as-tu fait un echo des hash md5 issus de tes login posant pb afin de les comparer avec les valeurs stockées dans la base mysql ??
La balise META est renseignée, mais l'en-tête HTTP, l'est-il aussi ?

Si non, ajouter cette ligne avant tout envoi de code HTML (echo, print, etc.) :
header("Content-Type:text/html; charset=iso-8859-1");

L'encodage de la base, de toute façon, on s'en fiche ici : un hachage md5 contient toujours 32 caractèrs qui ne sont que des lettres et des chiffres.
Heu là j'ai pas compris... tu parles de quoi en disant l'entete http ?

le doctype et la declaration html ?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >

???
Je dois y rajouter quelque chose ??

Si la meta declare le type d'encodage, ce n'est pas suffisant ? je vois pas pourquoi les login avec accents sont valides, mais pas les pass, j'ai vérifié, je n'ai transformé ni les uns, ni les autres. le type d'input (text/password) influerait il ?
quand on parle d'entete dans ce contexe il s'agit là des infos entre <head> </head>

sur un appel a ta page va y avoir des trucs du genre:
HTTP/1.1 patati patata
date: ...
Server: Apache...
Content-Length:...
Connection:...
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE ...

ta page ne commence pas par le doctype mais par des infos dis d'entete qui permettent au navigateur de comprendre ce qu'il reçoit.

la balise <meta> arrivant en dessous provoque en général des ajustements.

mais, comme le dit quentinC, il est en général conseillé d'agir directement sur l'entete du début avec la fonction header. c'est un peu plus sûr.
Modifié par CPascal (04 Jun 2007 - 15:34)
Bon, je comprend pas...

Pour moi, et pour de nombreuses personnes, voisci l'architecture d'une page web valide :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Bienvenue sur mon site !</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   </head>
   <body>
       <!-- Rappel : c'est ici que l'on écrit le contenu de notre page web -->
   </body>
</html>


Donc une page web commence bien par le doctype pour etre reconnue. Puis viens le html. et seulement après le head ! donc le doctype n'est PAS dans le head...

Je n'ai jamais vu nulle par le type de présentation que tu me proposes Smiley ohwell Ce serait possible d'avoir une page web avec un exemple ? je n'ai jamais vu déclarer ce type d'info :
HTTP/1.1 patati patata
date: ...
Server: Apache...
Content-Length:...
Connection:...
Content-Type: text/html; charset=iso-8859-1

Ces infos passent dans les méta habituellement... bien que j'ai rarement vu serveur ou connection dedans.

Je comprend pas, serait il possible d'approfondir un peu plus s'il te plait ?

Merci Smiley cligne
ce qui commence par <!doctype c'est ton document.

mais n'oublie que pour que ta page s'affiche sur l'internet il faut utiliser le protocole HTTP.

voir ce lien que j'ai cherché et qui decrit le format d'une requete et d'une reponse HTTP.

maintenant fais nous confiance Smiley biggrin si on te le dit c'est qu'on y crois Smiley lol .
Ensuite essai avec <?php header("Content-Type:text/html; charset=iso-8859-1"); ?> au debut de ta page et tu verras bien si le problème viens de là.
Modifié par CPascal (04 Jun 2007 - 16:08)
Je suis tout ouie pour vous faire confiance, mais c'est surprenant quand on tombe sur un truc pareil pour la première fois ! Jamais entendu parler de ça avant... donc forcément je suis sceptique au départ Smiley langue

Je teste ca ce soir (j'ai pas de connection ftp au bureau) et je vous tiens au courant Smiley smile

Dans tous les cas, session_start(); reste en premier malgré ce header ?
Modifié par Gryzzly (04 Jun 2007 - 16:13)
je crois que c'est sans importance mais les deux doivent avoir lieu avant tous commençement d'affichage sur la page.
Hello,

M'est avis que c'est plutôt "l'interclassement" des tables de la base MySQL qui est à vérifier.

Cheers,

Jmm.
Bon, voilà, c'est testé :
<?php header("Content-Type:text/html; charset=iso-8859-1"); ?>
en entete...

Ca m'aurait paru bizarre que ca vienne de la, mais bon, j'ai essayé --> ce n'est PAS ca ! lol

Pour Helios :
l'interclassement de ma table est partout latin1_general_cs, c'est pas bon ??

au final, j'en suis toujours au même point... c'est mon dernier problème sur ma zone de login, j'aimerais pouvoir régler ce soucis !
Salut,

testes un truc dans le genre :

"SELECT login  FROM `o2_user` WHERE BINARY `login` = '". utf8_encode($_POST['login']) . "'"
Salut Smiley cligne ,

Je trouve tout ça bien compliqué Smiley rolleyes . Même si tu avais des différences d'encodage entre tes pages et ta base il suffirait (il me semble) que celle qui sert à enregistrer le password et celle qui sert à le saisir avant de vérifier dans la base soient les mêmes (à priori iso-8859-1) pour que ça fonctionne... D'où ma question : es-tu sûr d'avoir la même valeur dans ta variable $salt au moment où tu enregistres ton password et celui où tu le testes ? Et la question subsidiaire : as-tu fais un test sans le double md5 du style :
$encrypted = md5($user_password);
puis
$encrypted_pass = md5($user_password);
histoire de "débroussailler" un peu Smiley smile
Modifié par Heyoan (04 Jun 2007 - 22:05)
Heyoan a écrit :
D'où ma question : es-tu sûr d'avoir la même valeur dans ta variable $salt au moment où tu enregistres ton password et celui où tu le testes ?

Oui, car :
lors de l'enregistrement, je crée le $salt et je le stocke dans la bdd ;
lors de la vérification login pour la connection, je récupère le $salt dans la bdd, correspondant au login spécifié.

pour la question subsidiaire :
je vais tester... faut que je revoies mes fonctions et je reviens prevenir
bon, c'est testé... j'ai viré le salt et le double crytage pour revenir à un simple hash md5 --> meme probleme, ca passe pas

je vais tester sans cryptage...

--edit--

ok, testé sans aucun cryptage, ca fonctionne :s

si je passe en md5, ca fonctionne plus. encore moins si je repasse le salt et que que je hash md5 encore une fois :s
Modifié par Gryzzly (04 Jun 2007 - 22:28)
Re'

C'est pour le moins bizarre Smiley murf

Tu pourrais mettre ton code complet (enregistrement et lecture) ?

Et si c'est trop gros faire un lien vers un .txt...

A+
promis on te demanderas pas les mots de passe Smiley lol

j'avais pourtant cherché sur le net si le md5+accents posait pb. sans rien voir de particulier

sinon une solution serait d'encoder avec htmlentities ou autre les accents avant.....enfin a condition que les & % et ; passe mieux.
Modifié par CPascal (04 Jun 2007 - 22:52)
Bon... finalement j'ai repris l'intégralité en pas a pas.

Je suis parti du mot de passe non crypté. ok.
j'ai crypté md5... ok.
j'ai concaténé un salt non aléatoire...ok
j'ai crypté mdr le tout... ok
j'ai généré un salt aléatoire... ok (enfin ca semble fonctionner, va falloir poursuivre les tests pour confirmer).

Alors maintenant voici la situation :
je peux enregistrer login et mdp avec accents -> je peux me logguer
je peux enregistrer login avec caractères spéciaux comme par exmple "'@ , idem mot de passe avec caractères spéciaux --> avec mot de passe accentué et mot de passe avec caractères spéciaux, impossible de se logguer, mot de passe non reconnu...

En conclusion provisoire:
les accents c'st bon, les caractères spéciaux, c'est pas bon.

code enregistrement :
function user_register($user_name, $user_password, $user_email)
{
     // Obtenir une clé salt avec notre fonction generate_salt()
     $salt = generate_salt();

     // On crypte le mot de passe par méthode md5 et en incluant la clé salt
     $encrypted = md5(md5($user_password).$salt);

     // On récupère le timestamp
     $timestamp = time();

     // Pour finir, on enregistre les informations dans la base de données
     $query = "INSERT INTO user (user_name, user_password, user_salt, user_email, user_timestamp) VALUES ('$user_name', '$encrypted', '$salt', '$user_email', '$timestamp')";
     mysql_query ($query) or die ('Impossible de créer l\'utilisateur.' .mysql_error());
}


code de login :
function user_login($user_name, $user_password)
{
     // Tester et récupérer la clé salt de la base grace au login
     $query = "SELECT user_salt FROM user WHERE user_name='$user_name' LIMIT 1";
     $result = mysql_query($query);
	 if (mysql_num_rows($result) == 0)
     {
     echo 'Etes vous inscrits ? Avez vous suivi les indications incluses dans le mail de confirmation ?';
     }
     if (mysql_num_rows($result) > 0)
     {
          // On récupère l'utilisateur
          $user = mysql_fetch_array($result);

          // On encryte le mot de passe en utilisant la clé salt et on vérifie si ça correspond à la base
          $encrypted_pass = md5(md5($user_password).$user['user_salt']);

          // On teste l'utilisateur avec login et mot de passe crypté
          $query = "SELECT user_id, user_name, user_email FROM user WHERE user_name='$user_name' AND user_password='$encrypted_pass'";
          $result = mysql_query($query);

          if (mysql_num_rows($result) > 0)
          {
               $user = mysql_fetch_array($result);

               // On crypte les informations à stocker dans la session
			   $user_id = $user['user_id'];
               $encrypted_id = md5($user['user_id']);
               $encrypted_name = md5($user['user_name']);
               $user_email = $user['user_email'];
			   
               // Store the data in the session
               $_SESSION['userid'] = $user_id;
               $_SESSION['username'] = $user_name;
               $_SESSION['useremail'] = $user_email;
               $_SESSION['encrypted_id'] = $encrypted_id;
               $_SESSION['encrypted_name'] = $encrypted_name;

               // Return ok code
               return 'Correct';
          }
          else
          {
               return 'Le mot de passe est incorrect';
          }
     }
	 else
     {
     return 'Etes vous inscrits ? Avez vous suivi les indications incluses dans le mail de confirmation ?';
     }
}

Modifié par Gryzzly (04 Jun 2007 - 23:16)
Pages :