IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

C# + MySQL + Varbinary


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut C# + MySQL + Varbinary
    Bonsoir à tous!

    Je me décide à poster car je n'en peux plus d'essayer des trucs en vain...Je vous expose mon souci:

    J'utilise une BDD MySQL pour mon projet, laquelle contient une table qui contient un champs VARBINARY(24), dans lequel je voudrais insérer un mot de passe utilisateur depuis un formulaire C#.
    Donc pour l'INSERT je converti d'abord le STRING récupéré d'un textbox en UTF8 de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] passwordByte = System.Text.Encoding.UTF8.GetBytes(MotDePasse);
    L'INSERT se passe bien (je veux dire, pas d'erreur de syntaxe ni rien)
    Dans la BDD, je vois apparaitre System.Byte[].

    Première question: le System.Byte[] est-il normal?

    Lorsque ensuite je veux récupérer cette valeur dans un autre formulaire, je fais un SELECT motdepasse, et que je l'affiche dans un messageBox, j'obtiens: 53-79-73-74-65-6d-2e-42-79-74-65-5b-5d --> ce qui est en base. Voici le code pour récupérer la valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    command.CommandText = @"SELECT motDePasse
                            FROM useragenda";
    Reader = command.ExecuteReader();
     
    while (Reader.Read())
    {
          byte[] test = (byte[])Reader["motDePasse"];
          MessageBox.Show(System.BitConverter.ToString(test));
    }
    Mais si j'affiche la chaine du textbox convertie en UTF8 (celle que j'envoie dans le INSERT) j'obtiens: 74-65-73-74

    Comparons ces 2 résultats:
    Récupéré de la base: 53-79-73-74-65-6d-2e-42-79-74-65-5b-5d
    Chaine brute convertie: 74-65-73-74

    Je ne sais pas trop pourquoi mais je sens que ce n'est pas une coincidence et la fin est surement assez proche!

    En vous souhaitant une bonne soirée (nuit en fait...), et en vous remerciant d'avance!

    Tib!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    53-79-73-74-65-6d-2e-42-79-74-65-5b-5d, c'est la représentation en UTF-8 de "System.Byte[]". Donc a priori il y a un problème avec la façon dont tu insères les données en base : tu passes ton tableau de bytes à la BDD en tant que String et non en tant que byte[]... Poste ton code d'insertion ; je soupçonne que tu construis ta requête par concaténation, au lieu d'utiliser une requête paramétrée.

    D'autre part, on n'enregistre jamais un mot de passe en clair dans la base de données : on enregistre plutôt un hash (MD5 ou SHA1 par exemple).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut
    Pour l'insert je fais juste un INSERT INTO de passwordByte, (voir le code de mon message précédant). Sur SQLServer ça fonctionne parfaitement c'est ça que je comprend pas.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Tibà22 Voir le message
    Pour l'insert je fais juste un INSERT INTO de passwordByte, (voir le code de mon message précédant).
    Bah justement, dans ton message tu ne montres pas le code qui fait l'insertion... c'est bien pour ça que je te le demande

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut
    Voici le code que tu demandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string MotDePasse = txtbox_Mdp.Text;
     
    byte[] passwordbyte = System.Text.Encoding.UTF8.GetBytes(MotDePasse);
     
    string command = "INSERT INTO useragenda (motDePasse) values ('" + passwordbyte + "');";

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Oui, donc c'est bien ce que je disais... et ça m'étonnerait que ça fonctionne sous SQL Server.

    Avec ce code, la requête que tu génères est la suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO useragenda (motDePasse) values ('System.Byte[]');

    (la concaténation de passwordByte dans la requête revient à appeler passwordByte.ToString(), ce qui donne "System.Byte[]")

    Il ne faut pas construire les requêtes par concaténation. C'est déjà risqué pour les nombres, chaines ou dates, mais pour les tableaux d'octets ça ne peut pas marcher. Il faut utiliser des requêtes paramétrées, comme expliqué ici

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut
    Contrairement a tes attentes ça fonctionne bien sous SQL Server

    Je regarde du côté des requêtes paramétrées et te tiens au courant, en tout cas merci pour ton aide!

    EDIT: enfin avec SQL Server j'utilise SSIS aussi, ça joue peut-être

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut
    Bon j'ai utilisé les requêtes paramétrées, c'est exactement le même résultat. Voici mon code d'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string MotDePasse = txtbox_Mdp.Text;
    byte[] mdp = System.Text.Encoding.UTF8.GetBytes(MotDePasse);
     
    MySqlCommand cmd = connexion.CreateCommand();
    cmd.CommandText = "INSERT INTO useragenda (motDePasse) values (@mdp);";
    cmd.Parameters.Add("@mdp", MySqlDbType.VarBinary).Value = mdp.ToString();                   
     
    cmd.ExecuteNonQuery();
    et mon code de récupération:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    command.CommandText = @"SELECT motDePasse
                            FROM useragenda;";
    Reader = command.ExecuteReader();
     
    while (Reader.Read())
    {
          byte[] test = (byte[])Reader["motDePasse"];
          MessageBox.Show(System.BitConverter.ToString(test));
    }
    Toujours le System.Byte[] dans la base et la même valeur récupérée que dans mon premier post
    Une idée?


    EDIT: En faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.Add("@mdp", MySqlDbType.VarBinary).Value = mdp;
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.Add("@mdp", MySqlDbType.VarBinary).Value = mdp.ToString();
    je récupère les mêmes résultats! Cependant dans la base, je vois le mot de passe brut saisi par l'utilisateur. Ex: si l'utilisateur a saisi pour mot de passe "Test", je vois "Test" dans ma colonne... et ce n'est pas le but, le but étant que ceux qui ont accès à la BDD voient le code UTF8

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Tibà22 Voir le message
    Contrairement a tes attentes ça fonctionne bien sous SQL Server
    Je vois pas comment c'est possible... tu vois bien que l'erreur est au niveau de la construction de la requête, donc au niveau du code C# : la requête est déjà fausse avant même que tu ne l'envoies à la DB, et elle ne contient pas les données du mot de passe... A mon avis, tu dois faire une autre erreur ailleurs qui donne l'illusion que ça fonctionne, mais si tu t'y prends de la même manière que dans le code que tu m'as montré, je pense que tous tes utilisateurs ont "System.Byte[]" comme mot de passe enregistré...

    Citation Envoyé par Tibà22 Voir le message
    EDIT: enfin avec SQL Server j'utilise SSIS aussi, ça joue peut-être
    Bah dans ce cas tu ne t'y prends pas de la même manière, ce qui pourrait expliquer que ça fonctionne


    Citation Envoyé par Tibà22 Voir le message
    Bon j'ai utilisé les requêtes paramétrées, c'est exactement le même résultat. Voici mon code d'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string MotDePasse = txtbox_Mdp.Text;
    byte[] mdp = System.Text.Encoding.UTF8.GetBytes(MotDePasse);
     
    MySqlCommand cmd = connexion.CreateCommand();
    cmd.CommandText = "INSERT INTO useragenda (motDePasse) values (@mdp);";
    cmd.Parameters.Add("@mdp", MySqlDbType.VarBinary).Value = mdp.ToString();                   
     
    cmd.ExecuteNonQuery();
    Je te l'ai déjà dit : en appelant ToString sur un tableau de byte, ça donne "System.Byte[]", pas le contenu du tableau...


    Citation Envoyé par Tibà22 Voir le message
    EDIT: En faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.Add("@mdp", MySqlDbType.VarBinary).Value = mdp;
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.Add("@mdp", MySqlDbType.VarBinary).Value = mdp.ToString();
    je récupère les mêmes résultats! Cependant dans la base, je vois le mot de passe brut saisi par l'utilisateur. Ex: si l'utilisateur a saisi pour mot de passe "Test", je vois "Test" dans ma colonne...
    Bah oui, ça me semble logique... ce n'est pas une bonne chose (il faut enregistrer le hash, pas le mot de passe), mais ça correspond bien à ce que je pensais que tu voulais faire.

    Citation Envoyé par Tibà22 Voir le message
    et ce n'est pas le but, le but étant que ceux qui ont accès à la BDD voient le code UTF8
    Comment ça le "code UTF8" ? Que tu mettes le mot de passe directement dans une colonne varchar, ou les octets UTF-8 du mot de passe dans une colonne varbinary, ça revient exactement au même... Je ne comprends pas quel est ton problème.

Discussions similaires

  1. [Kylix] [cgi] pb déploiement appli avec connexion MySQL [rés
    Par Nepomiachty Olivier dans le forum EDI
    Réponses: 3
    Dernier message: 06/08/2002, 20h09
  2. Probleme C++Builder et Mysql
    Par noname dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 13h40
  3. connection a une BDD MySql
    Par delire8 dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2002, 18h18
  4. [Kylix] Pb connection à Mysql
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 25/04/2002, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo