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

 .NET Discussion :

Récupérer un datatable filtré à partir d'un service web


Sujet :

.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 37
    Par défaut Récupérer un datatable filtré à partir d'un service web
    Bonjour,
    j'ai un service web qui veut exposer un filtre d'un datatable
    j'aimerais bien savoir comment le consommateur du service puisse récupérer le résultat désiré ???
    la solution que j'avais en tête c'est de laisser la responsabilité au consommateur de construire une string 'filtre' et d'effectuer un select(filtre) sur la datatable coté serveur, exemple:

    service web:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function getdata(filtre as string) as datarow()
     dim dt as datatable = new MyData()
     return dt.select(filtre)
    end function
    client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'supposons que la table contient 3 colonnes nom, prenom et sex
    dim filtre as string = " ( nom='Fred' and prenom='Kami' ) or sex = 'F' "
    dim sw as new adresse.WebService
    dim resultat as datarow() = sw.getdata(filtre)
    Donc ma question, y a t il une autre méthode meilleure que celle-ci ?????
    l'inconvénient de cette méthode c'est que ça oblige que le client connaisse les noms des colonnes.

    Merci

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Cette méthode est la pire envisageable puisqu'elle autorise les attaques par injection SQL.

    [ame]http://fr.wikipedia.org/wiki/Injection_SQL[/ame]

    Le mieux est de toujours spécialiser tes WebServices.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GetUser( string login );
    GertUsers();
    Il est indispensable que les paramètres de tes WebServices soient sécurisés.

    http://msdn.microsoft.com/en-us/libr...rs(VS.71).aspx

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 37
    Par défaut
    merci d'avoir répondu,
    à ma connaissance aucune sql inject est possible dans ce cas parceque le select est effectué sur un objet de type datatable.
    SVP si vous avez d'autre suggestion n'hésitez pas.

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Bonjour siimpatiico,

    Ta DataTable devrait effectivement te protéger des débordements (accès a l'information d'autres tables) mais pas de l'accès à certaines données protégée par des wheres . Par exemple, Imaginons que dans ta liste d'utilisateur tu ne veuilles pas que l'on puisse voir les utilisateurs blacklistés ou détruits logiquement. Potentiellement un utilisateur mal intentionné pourrait en avoir la liste (etc...) en modifiant le where qu'il envoie (OR 1=1). Le risque existe donc et je te déconseille toujours de recourir à cette méthode

    Dans ton cas de filtre, soit tu fixe les colonnes a rechercher dans ton WebServices, soit tu envoies une liste de classe représentant un filtre :

    Methode 1 : Semi dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public GetUsersByFilters(string firstname, OperationComparaison Operation, OperationLogical logical, string lastname, OperationComparaison Operation...)
    {
        // à l'aides des filtres on reconstruit la requete  SQL.
        // il est indispensable de protéger les valeurs entrantes (en remplacant les simples quotes des valeurs en double simples quotes)
    }

    Methode 2 : dynamique

    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
     
    public class Filter
    {
       public string Name
       {
           get;
           set;
       }
     
       public OperationComparaison Operation
      {
        get;
        set;
      }
     
      public object Value
      {
         get;
         set;
      }
    }
     
    public GetUsersByFilters(List<Filter> filters )
    {
        // à l'aides des filtres on reconstruit la requete  SQL.
        // il est indispensable de protéger les valeurs entrantes (en remplacant les simples quotes des valeurs en double simples quotes)
    }
    Je te fournis le code a titre indicatif mais il faudrait le renforcer avec les opérateurs logiques (AND et OR) pour la méthode 2, unes bonnes gestions des valeurs de la requêtes et bien d'autres choses encore avant qu'il soit robuste.

    Comme tu le vois, le filtrage par webservice est un sujet assez complexe par sa nature critique en terme de sécurité et la multiplicité des cas possibles (lié au grand nombre de possibilités offertes par un Where).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 37
    Par défaut
    Effictivement c'est un sujet trés complex,
    en tous cas, merci pour ton aide.

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Je t'en prie. Bon courage pour la réalisation de ton filtre.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 37
    Par défaut
    voila un bon article qu'on peux utiliser pour construire le requête sql coté client et la récupérer coté service web:

    http://www.codeproject.com/KB/databa...h_c_sharp.aspx

  8. #8
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Très interessant.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2013, 12h20
  2. recupérer un datatable à partir d'un service web
    Par dab29 dans le forum Services Web
    Réponses: 6
    Dernier message: 30/04/2010, 18h19
  3. acceder a une fichier XML à partir d'un service web
    Par khallou2007 dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 01/12/2008, 21h00
  4. Réponses: 5
    Dernier message: 09/02/2007, 18h46
  5. Récupérer le type de démarrage d'un service
    Par Nathan dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 09/04/2004, 15h07

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