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

Windows Forms Discussion :

Aide conception update et verification duplicat [Débutant]


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut Aide conception update et verification duplicat
    Salut !
    Je voulais savoir comment faire un update.
    J'ai pour exemple une table "Produit" avec Colonnes "nom, foto"

    Au moment de lancer le update il me vérifie qu'il n'y a pas de produit avec le meme nom.
    Sauf que que veux changer la photo du produit et évidement comme le produit existe il me le dit.

    Y'a t'il moyen de contourne ce problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    If TextBox7.Text = 1 Then
                    'Guardar Imagen'
                    Dim mstream As New System.IO.MemoryStream()
                    PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                    Dim arrImage() As Byte = mstream.GetBuffer()
                    mstream.Close()
                    'Guardar Imagen'
                    If READER.HasRows Then
                        MsgBox("Product Duplicated !", MsgBoxStyle.Critical)
                        Me.Show()
                        MysqlConn.Close()
                    Else
                    Try
                        MysqlConn.Open()
                        COMMAND.Connection = MysqlConn
                        COMMAND.CommandText = "update product set 
                                name=@Value3, 
                                foto=@foto
                                where id = '" & TextBox1.Text & "'"
                        COMMAND.Parameters.AddWithValue("@Value3", If(String.IsNullOrEmpty(TextBox2.Text), DBNull.Value, TextBox2.Text))
                        COMMAND.Parameters.AddWithValue("@foto", arrImage)
                        READER = COMMAND.ExecuteReader
                        MessageBox.Show("Datos Guardados")
                        MysqlConn.Close()
                    Catch ex As Exception
                        MessageBox.Show(ex.Message)
                    Finally
                        MysqlConn.Dispose()
                    End Try

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    La requête qui teste l'existence d'un produit de même nom doit aussi tester que l'Id trouvé est différent de ton Id produit que tu veux modifier. Sinon, c'est que tu es sur le même produit et que tu peux le modifier.

    Petite remarque : Dans ta requête d'update, tu mélanges requête paramétrée et concaténation de chaîne. Utilise des paramètres partout afin d'éviter l'injection SQL !
    Petite remarque bis : Evite les Textbox1 et autres PictureBox1. Affecte des noms explicites à tes controls faute de quoi le programme deviendra vite inmaintenable.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Petite remarque : Dans ta requête d'update, tu mélanges requête paramétrée et concaténation de chaîne. Utilise des paramètres partout afin d'éviter l'injection SQL !
    Meme avec un programme VB on peux faire de l'injection SQL ?

    Citation Envoyé par ebastien Voir le message
    Petite remarque bis : Evite les Textbox1 et autres PictureBox1. Affecte des noms explicites à tes controls faute de quoi le programme deviendra vite inmaintenable.
    Plus tard une fois que cela fonctionne correctement.

    Sinon, je vais tester cela de suite. Merci.

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Citation Envoyé par superthx Voir le message
    Meme avec un programme VB on peux faire de l'injection SQL ?[..]
    Si tu pars du principe qu'une utilisation frauduleuse de ton appli peut être faite alors il faut s'en protéger.
    Et oui, l'injection SQL est tout à fait possible dans ton programme.
    Si dans TextBox1 je saisis '; DROP TABLE product; je pense que tu vas pas trop apprécier ce qu'il va se passer ^^
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    Si dans TextBox1 je saisis '; DROP TABLE product; je pense que tu vas pas trop apprécier ce qu'il va se passer ^^
    Je demanderai plus tard comment faire alors.

    Par contre je reviens sur mon update.

    Je bloque sur la commande Mysql. Car je sais pas comment faire pour qu'il verifie si cs valeurs existent.
    Cela doit bloquer sur IF READER.HasRows. Car si je comprend bien, si il ya des colonnes il dit que "Product Duplicated !".
    Alors comment le faire verifier ? Je tourne un peux en rond.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    COMMAND.CommandText = "select * from product where name <> '" & TextBox2.Text & "' and id <> '" & TextBox1.Text & "'"
                    READER = COMMAND.ExecuteReader
                    If READER.HasRows Then
                        MsgBox("Product Duplicated !", MsgBoxStyle.Critical)
    Je vais tester If READER.HasRows >0

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    On va commencer par préciser ton besoin : que veux-tu faire exactement ?
    Ensuite il faut la DESC de la table (ou son CREATE) pour connaitre les contraintes que tu as mises en place (PRIMARY, UNIQUE, FOREIGN ...).
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Je ne comprends pas bien ta requête. Tu cherches tous les enregistrements pour lesquels le nom et l'id sont différents de tes Textbox ?? Ce n'est pas plutôt une recherche d'un enregistrement pour lequel le nom est égal et l'id différent afin de vérifier qu'un autre produit ne porte pas le même nom ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Ok j'ai réussi enfin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    'Check Name
                MysqlConn.Open()
                COMMAND.CommandText = "select * from product where name = '" & TextBox2.Text & "' and id = '" & TextBox1.Text & "'"
                READER = COMMAND.ExecuteReader
                If READER.HasRows = True Then
                    'Check Name
                    Try
                        Dim mstream As New System.IO.MemoryStream()
                        PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
                        Dim arrImage() As Byte = mstream.GetBuffer()
                        mstream.Close()
     
                        MysqlConn.Close()
                        MysqlConn.Open()
                        COMMAND.Connection = MysqlConn
                        COMMAND.CommandText = "update product set 
                                id_maker=@Value1, 
                                id_types=@Value2, 
                                name=@Value3, 
                                foto=@foto 
                                where id = '" & TextBox1.Text & "' and name = '" & TextBox2.Text & "'"
                        COMMAND.Parameters.AddWithValue("@Value1", If(String.IsNullOrEmpty(ComboBox1.Text), DBNull.Value, ComboBox1.Text))
                        COMMAND.Parameters.AddWithValue("@Value2", If(String.IsNullOrEmpty(ComboBox2.Text), DBNull.Value, ComboBox2.Text))
                        COMMAND.Parameters.AddWithValue("@Value3", If(String.IsNullOrEmpty(TextBox2.Text), DBNull.Value, TextBox2.Text))
                        COMMAND.Parameters.AddWithValue("@foto", arrImage)
                        READER = COMMAND.ExecuteReader
                        MessageBox.Show("Datos Guardados")
                        MysqlConn.Close()
                    Catch ex As Exception
                        MessageBox.Show(ex.Message)
                    Finally
                        MysqlConn.Dispose()
                    End Try
                    MysqlConn.Close()
                    MysqlConn.Open()
     
                ElseIf TextBox15.Text <> TextBox2.Text = True Then
                    'Check Name
                    'MysqlConn.Open()
                    MysqlConn.Close()
                    MysqlConn.Open()
     
                    COMMAND.CommandText = "select * from product where name = '" & TextBox2.Text & "' and id = '" & TextBox1.Text & "'"
                    READER = COMMAND.ExecuteReader
                    If READER.HasRows Then
                        MsgBox("Product Duplicated !", MsgBoxStyle.Critical)
                        Me.Show()
                        MysqlConn.Close()
                    Else
                        Try
                            Dim mstream As New System.IO.MemoryStream()
                            PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
                            Dim arrImage() As Byte = mstream.GetBuffer()
                            mstream.Close()
                            MysqlConn.Close()
                            MysqlConn.Open()
                            COMMAND.Connection = MysqlConn
                            COMMAND.CommandText = "update product set 
                                id_maker=@Value1, 
                                id_types=@Value2, 
                                name=@Value3, 
     
                                foto=@foto  
                                where id = '" & TextBox1.Text & "'"
                            COMMAND.Parameters.AddWithValue("@Value1", If(String.IsNullOrEmpty(ComboBox1.Text), DBNull.Value, ComboBox1.Text))
                            COMMAND.Parameters.AddWithValue("@Value2", If(String.IsNullOrEmpty(ComboBox2.Text), DBNull.Value, ComboBox2.Text))
                            COMMAND.Parameters.AddWithValue("@Value3", If(String.IsNullOrEmpty(TextBox2.Text), DBNull.Value, TextBox2.Text))
                            COMMAND.Parameters.AddWithValue("@foto", arrImage)
                            READER = COMMAND.ExecuteReader
                            MessageBox.Show("Datos Guardados")
                            MysqlConn.Close()
                        Catch ex As Exception
                            MessageBox.Show(ex.Message)
                        Finally
                            MysqlConn.Dispose()
                        End Try
                        MysqlConn.Close()
                        MysqlConn.Open()
                    End If
                End If
            End If
    le textbox15 fais le contrôle si textbox2 a changer et update le nouveau. Comme sa plus d'erreur d'un produit avec le meme nom et id

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Par contre pour ce qui est de l'injection SQL.... As tu des exemples ??
    Des exemples concrets ?
    Merci.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    La concaténation de chaine est propice à l'injection SQL. Cela veut dire que tu laisses la possibilité à l'utilisateur de saisir dans la Textbox du code SQL qui sera exécuté par ta requête.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cmd = "Select * from Product where Categorie = @CategorieAutoriseePourUser and name = '" & TextBox1.Text&"'"
    La requête doit retourner l'ensemble des produits ayant pour nom Textbox1.Text d'une catégorie spécifique (voiture par exemple) pour laquelle l'utilisateur est habilité (bon c'est un cas d'école)

    Tout va bien si l'utilisateur étant habilité pour les produits de catégorie voiture (CategorieAutoriseePourUser = "Voiture") saisi dans Textbox1 "Renault" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Product where Categorie = 'Voiture' and name = 'Renault'
    Maintenant, si l'utilisateur s'amuse à saisir dans Textbox1 "Renault' or '1'='1" , la requête deviendra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Product where Categorie = 'Voiture' and name = 'Renault' or '1'='1'
    Comme '1'='1' retourne True, la requête retournera tous les produits quelque soit leur nom et leur catégorie. Il pourra visualiser l'ensemble des produits dont ceux pour lesquels il n'est pas habilité (Avions, Bateaux, Outillage, Electroménager, Manèges et j'en passe)

    Ca c'est le cas le moins grave. Comme le mentionnait jopopmk, l'injection sql peut carrément faire s'exécuter des scripts graves pour ta base de données.
    Bref, toujours utiliser des requêtes paramétrées qui empêchent ce type d'attaque.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    ok donc pour reprendre j'ai lu l'article http://webman.developpez.com/article...rameter/vbnet/

    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    myCommand.Parameters("@id_article").Value = CInt(maTextBox1.Text)                      
    myCommand.Parameters("@prix_article").Value = CDbl(maTextBox2.Text)              
    myCommand.Parameters("@nom_article").Value = maTextBox3.Text
    Quel la difference entre un entier et Double ?

    Aussi pour je comprend pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Add(New SqlParameter("@nom_article", SqlDbType.VarChar, 25))
    Qu'il faut specifier que c'est Varchar de 25

    Mais qu'en est il du Longblob et longtext ? On met pour lon text ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Add(New SqlParameter("@nom_article", SqlDbType.longtext))
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. aide conception image + texte
    Par maysa dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 29/11/2007, 13h37
  2. Aide conception Dataset et performance
    Par chnew dans le forum ASP.NET
    Réponses: 1
    Dernier message: 29/06/2007, 09h59
  3. Aide conception diagramme de classes Projet Web
    Par alves.seb dans le forum Diagrammes de Classes
    Réponses: 9
    Dernier message: 12/06/2007, 14h29
  4. [Conception] Update records écrasent plusieurs lignes
    Par JLDR69 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 17/09/2006, 19h13

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