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

MS SQL Server Discussion :

Eviter Injection SQL


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Eviter Injection SQL
    Bonjour
    Dans une application Csharp avec ADO.NET pour SQL Server je construit des requetes de recherche sur base de critéres variable introduits pas l'utilidsateur dans un formulaire

    En gros l'utilisateur donne des valeurs a certains champ predifinis et si le champ contient quelque chose on ajoute un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where champ='Valeur introduite'
    Mais cela offre evidement une porte d'entrée oux indésirables

    Existe-il un outil ou une methode permettant de valider que le contenu du champ est safe ?

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Oui , aussi loin que je me souvienne, il existe des méthodes pour cela.
    Vous devez par exemple considérer votre combox comme étant un paramètre de votre requête et non construire votre requête avec ces mêmes valeurs.

    Exemple :

    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
    -- Mauvais code
    string cmdStr = "insert into maTable (col1, col2) values ('" + 
          combobox1.Text + "', '" + combox2.Text + "')";
     
    -- Code plus sécurisé :
    string cmdStr =
          "insert into maTable (col1, col2) values (" +
          "@param1, @param2)";
     
    using (SqlConnection conn = new SqlConnection(connStr))
       using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
          {
              // add parameters
              cmd.Parameters.AddWithValue
                 ("@param1", combox1.Text);
              cmd.Parameters.AddWithValue("@param2", combobox2.Text);
     
             ...
          }
    Je vous invite à aller voir du côté du forum CSharp pour plus d'informations

    ++

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci MikeDavem

    Oui c'est le principe de la requete parametrée
    Mais dans ce contexte c'est beaucoup plus fastidieux a a mettre en oeuvre
    car il ne s'agit pas d'un insert ou d'un update avec des variables connues

    Mais d'un where avec un nombre de condition indéterminé

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- Code plus sécurisé :
    string cmdStr =
          "insert into maTable (col1, col2) values (" +
          "@param1, @param2)";
    Et qu'est-ce qui se passe si je parviens à réaliser une injection SQL en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- Code plus sécurisé :
    string cmdStr =
          "SHUTDOWN;insert into maTable (col1, col2) values (" +
          "@param1, @param2)";
    ou plus probable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -- Code plus sécurisé :
    string cmdStr =
          "DELETE FROM maTable; insert into maTable (col1, col2) values (" +
          "@param1, @param2)";
    L'utilisation de procédures stockées n'est-il pas le meilleur moyen d'eviter cela ?

    @++

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Tout à fait d'accord avec toi !!

    Dans le cas de olibara je pense qu'une procédure stockée peut être un choix judicieux.

    ++

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonjour

    Merci a vous, mais je ne crois pas non plus courrir autant qe risque que vous présentez

    1- Le coeur de la commande sql est fixée dans l'aplication
    2- La partie WHERE et variable et définie par les champs eventuellements remplis d'un tableau
    3- Je traite chaque champ individuellement pour construire la chaine where a l'aide d'une AddWhere que j'appelle en boucle (ci apres)

    Donc ma question est : comment puis-je remplacer cela par une procédure stockée et quelle sécurité suplémentaire cela offre ?

    Dans ma methode, je peux evidement aussi eliminer de la chaine de parametre toAdd tout ';' dangereux !


    Merci de vos conseils


    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
        // *********************************************************************************
        /// <summary>
        /// Ajout where argument from string type string (operateur AND)
        /// </summary>
        /// <param name="curWhere"></param>
        /// <param name="Item"></param>
        /// <param name="toAdd"></param>
        /// <returns></returns>
        public string addWhereTxt(string curWhere, string Item, string toAdd)
        {
          if (toAdd.Length <= 0)
          {
            return curWhere;
          }
          toAdd = toAdd.Replace("'", "''");
          string Add = string.Format(" {0}='{1}' ", Item, toAdd);
          if (curWhere.Length == 0)
          {
            return " WHERE " + Add;
          }
          return curWhere + " AND " + Add;
        }

Discussions similaires

  1. [MySQL] Eviter les failles XSS et les injections SQL
    Par johnson95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/09/2010, 15h30
  2. [Oracle] Eviter les injections sql oracle
    Par Sh4dow49 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/07/2008, 17h03
  3. Réponses: 20
    Dernier message: 03/02/2006, 10h55
  4. Réponses: 10
    Dernier message: 25/10/2005, 16h09
  5. gerer les ' dans une chaine pour eviter erreur sql
    Par Malone dans le forum Langage
    Réponses: 3
    Dernier message: 24/08/2005, 14h27

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