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 :

Requete SQL ou procédure stockée?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 64
    Par défaut Requete SQL ou procédure stockée?
    Bonjour,
    J'ai une application C# (VS 2008) qui depuis un filtre doit retourner un résultat issu d'une BDD.
    Pour cela, j'ai développé une procédure stockée dans SQL Server 2005.
    Les paramètres de mon filtre sont envoyés lors de l'appel de la procédure depuis C#.
    Pour l'instant, rien de bien compliqué.

    Suite à une évolution, je dois inclure un nouveau paramètre sur mon filtre de mon application.
    Cette fois, ce n'est plus un paramètre du type date début, date fin, numéro, etc.. mais un groupe de valeur auquel le résultat doit au moins appartenir à une de ces valeurs. (exemple: je cherche toutes les personnes dont le prénom et 'Jean' ou 'Pierre' ou 'Paul')

    Pour cela, je modifie ma procédure pour y placer un IN (maColonne IN ('Jean', 'Pierre', 'Paul')
    Bien entendu, j'ai un soucis pour passer mon paramètre à ma procédure pour qu'il soit exploitable. (@param2 = '''Jean'', ''Pierre'', ''Paul''' et maColonne IN (@param2)). Ca, c'est pas possible et j'ai pas d'autre solution.

    On me conseille donc de transformer toute ma procédure stockée pour en faire une concaténation de chaine SQL que j'exécute avec exec.
    => exec @Select + @From + @Where + @ GroupBy où chaque variable est un morceau de la procédure sous forme de chaine de caractères.

    Ceci marche super bien mais alors voici ma question:
    Quel est alors l'intérêt de faire une procédure stockée qui fait un exec d'une chaine de caractère, plutôt que de créer et d'éxécuter directement cette chaine depuis mon appli C#??

    Dans les 2 cas, SQL devra recompiler la requête => plus d'interêt d'utiliser la procédure stockée.

    J'espère avoir été clair
    Merci de m'éclaircir ce point en tout cas.

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par cyril6910 Voir le message
    Quel est alors l'intérêt de faire une procédure stockée qui fait un exec d'une chaine de caractère, plutôt que de créer et d'éxécuter directement cette chaine depuis mon appli C#??
    Aucun, d'autant plus que la procédure en question devient alors très très dangereuse car l'injection SQL est grandement facilitée !!!

    Il suffit d'un simple appel comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaProcedure("DELETE * FROM MaTable", "", "", "")
    pour faire n'importe quoi.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 64
    Par défaut
    Le problème d'injection de code est possible dans les 2 cas si mon code C# n'est pas verrouillé mais je suis d'accord sur le principe.
    Merci pour votre réponse.

    Je pars sur une requête SQL lancée depuis C# plutôt qu'une procédure stockée.

  4. #4
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Citation Envoyé par cyril6910 Voir le message

    Je pars sur une requête SQL lancée depuis C# plutôt qu'une procédure stockée.
    pourquoi? parce que ça te semble plus simple? alors qu'à la moindre modif, correction, il te faudra recompiler, et redéployer ton code.


    De façon générale, il faut passer par les SP lorsque possible. Ta problématique, c'est que tu veux passer une liste variable de paramètre à une requête et malheureusement, SQL ne gère pas les string array.
    ca ne veut pas dire qu'il n'existe pas de solution.

    La plus sécurisée des méthodes selon moi (qui prend 4 lignes de code de plus) est de passer une chaine formatée et utiliser des séparateurs pour tes paramètres. ces paramètres, tu les découpes et reforme une requête coté SQL.
    Ca semble donner plus de boulot mais au moins, tu ne passes que des valeurs sûres (a-Z + séparateur) et donc ca se protège très facilement coté code lorsque tu formes ta chaine et surtout, tu te protèges plus facilement contre le SQL injection car avec ta méthode, je vois pas comment tu peux te protéger si dans l'une des cases de champ non, je te donne quelque chose du genre
    "");DELETE * FROM matable--
    A partir du moment où tu autorise la saisie d'autre chose que des alphanumériques coté code, une personne douée pourra toujours trouver moyen de faire planter la chose.

    Au final, moi je te propose coté code de créer une chaine de type
    "toto, tata, tutu", de la vérifier avec une regex toute simple [a-Z,]*, puis de la réutiliser côté sql serveur ou splittant puis concaténant comme souhaité.

    plus lourd certes mais plus facile à contrôler selon moi.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 64
    Par défaut
    Bonjour,
    On oublie le problème d'injection de code car cela est déjà géré depuis mon application (uniquement caractère alpha numérique).

    Je passe bien mes paramètres par une chaine formatée exactement de cette façon : "toto, tata, tutu".

    Par contre, en faisant comme ceci, je suis obliger de faire ma requête sous forme d'une chaine de caractère que j'execute à l'aide de 'exec' à cause de mon IN. C'est ça qui me gène. Je trouve ça moche.

    Mais si c'est pas choquant, pourquoi pas. Surtout que en effet, en cas de modif, il n'y a pas à recompiler le code c#.

    Merci.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/10/2007, 08h38
  2. [SQL SERVER] Procédures stockées et mise en oeuvre de vues
    Par boby2600 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/06/2006, 09h13
  3. [SQL-Server] Sous requete dans une procédure stockée
    Par Worldofdada dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 09/02/2006, 11h18
  4. [PL/SQL] Appel procédure stockée dans trigger
    Par Félia dans le forum Oracle
    Réponses: 3
    Dernier message: 24/01/2005, 17h25
  5. SQL dans Procédure stockée
    Par julure dans le forum Oracle
    Réponses: 13
    Dernier message: 02/11/2004, 16h57

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