2010-11-11 24 views
2

Si vous regardez this la documentation MSDN il y a un exemple avec le code suivant:Intercepteurs de requête WCF: cet exemple MSDN présente-t-il un risque de sécurité?

// Define a change interceptor for the Products entity set. 
[ChangeInterceptor("Products")] 
public void OnChangeProducts(Product product, UpdateOperations operations) 
{ 
    if (operations == UpdateOperations.Add || 
     operations == UpdateOperations.Change) 
    { 
     // Reject changes to discontinued products. 
     if (product.Discontinued) //<-- IS THIS BASED ON UNVERIFIED CLIENT DATA??? 
     { 
      throw new DataServiceException(400, 
         "A discontinued product cannot be modified"); 
     } 
    } 
    else if (operations == UpdateOperations.Delete) 
    { 
     // Block the delete and instead set the Discontinued flag. 
     throw new DataServiceException(400, 
      "Products cannot be deleted; instead set the Discontinued flag to 'true'"); 
    } 
} 

Regardez le commentaire en majuscules. Ma question est: «Cette ligne est-elle dépendante des données fournies par le client ... et si oui, que pouvons-nous faire pour avoir une validation sécurisée»?

+0

Merci d'avoir signalé un problème éventuel dans la documentation! –

Répondre

1

L'intercepteur de changement devrait obtenir l'entité APRÈS que les modifications du client lui aient été appliquées. Donc, le comportement dépend du fournisseur. Si votre fournisseur implémente cette propriété en lecture seule (ce qui signifie généralement que les mises à jour sont ignorées), la vérification ci-dessus ne pose aucun problème. Je suis d'accord que l'échantillon pourrait être mieux à cet égard cependant. En fonction de votre fournisseur, si cette propriété n'est pas en lecture seule, vous devez demander au fournisseur la valeur inchangée/précédente. La façon de le faire dépend du fournisseur. Donc, si c'est EF, il s'agit plus d'une question EF comment déterminer la valeur d'origine d'une propriété modifiée (l'instance d'entité sera suivie sur la source de données actuelle).

+1

"après que les modifications lui ont été appliquées" ... cela signifie-t-il qu'un poste HTTP client va arrondir certaines (éventuellement) données invalides, il s'applique à (a) l'EF ou (b) au fournisseur. Si le cas "b" alors, le serveur SQL obtiendra-t-il une "écriture" et annulera la transaction? – LamonteCristo

+0

Si le fournisseur est EF, l'implémentation applique les modifications aux entités EF côté serveur (instances des classes générées EF, la classe Product dans l'exemple ci-dessus), mais ces modifications ne sont pas encore transmises, car SaveChanges n'était pas appelé sur le contexte EF sous-jacent. –

+0

Si le fournisseur n'est pas EF, le comportement réel dépend de l'implémentation de l'interface IUpdatable par le fournisseur, mais s'il suit la spécification de celui-ci, il doit se comporter de la même manière que SaveChanges n'a pas encore été appelé. devrait être juste mis en cache localement sur le serveur et non appliqué à tout stockage persistant. –