2008-09-30 11 views
3

J'ai une API de service Web. Certains appels renvoient des objets contenant des champs de texte avec des informations fournies par l'utilisateur. Du point de vue de la conception et de la sécurité, quels sont les inconvénients de renvoyer une valeur nulle dans ces champs lorsqu'aucune information n'a été fournie? Y a-t-il un avantage évident à retourner une chaîne vide à la place, sinon à simplifier l'API en ne demandant pas au code client de vérifier les valeurs nulles?Retour des valeurs null à partir d'un appel de service Web

Répondre

0

Je ne pense pas qu'il y ait un problème de sécurité lié au retour de null par rapport à une chaîne vide.

Il n'y a pas de réel inconvénient à retourner null pour les champs pour lesquels il n'y a pas d'information - c'est un peu ce que les valeurs nulles sont censées indiquer.

Vous pouvez simplifier votre code client en utilisant

string.IsNullOrEmpty() 

(en supposant que c'est .NET)

1

Tout dépend si vous traitez une valeur de chaîne vide comme sémantiquement différent d'une chaîne vide. Si la chaîne vide et la chaîne vide signifient toutes deux qu'il n'y a pas de données pour ce champ, je ne vois aucune raison de ne pas simplifier la vie du client en n'ayant pas à vérifier et retourner la chaîne vide.

0

Null signifie simplement null. Il n'y a pas de problème de sécurité inhérent là-bas.

Comme un service Web est une API publique, vous devez vérifier rigoureusement toutes les données d'entrée et attendre une entrée mal formée. Vous ne pouvez jamais supposer que le code du client fait la bonne chose et ne vous envoie pas null (malicieusement ou autrement). Par conséquent, les chaînes vides ou d'autres valeurs sentinelles ne vous épargnent pas de vérifier les entrées, et elles ne facilitent pas nécessairement la vie. Les chaînes sémantiquement vides ne sont pas non plus nulles, elles sont vides.

Pour ce que ça vaut, le xml généré par le .net SoapFormatter pour un null est tout simplement vieux, et ce n'est pas la même chose qu'une chaîne vide. C'est un exemple trivial, mais instructif. Si vous envoyez null, vous envoyez également moins de données, ce qui peut être quelque chose à considérer.

{ 
    [WebMethod] 
    public MyClass HelloWorld() 
    { 
     MyClass val = new MyClass() 
     { 
      IsValid = false, 
      HelloString = "Hello World", 
      BlankString = "", 
      Nested = new NestedClass { Name = "Bob" } 
     }; 

     return val; 
    } 

} 

public class MyClass 
{ 
    public bool IsValid { get; set; } 
    public string HelloString { get; set; } 
    public string BlankString { get; set; } 
    public string OtherString { get; set; } 
    public NestedClass Nested { get; set; } 
    public NestedClass NullNested { get; set; } 
} 

public class NestedClass 
{ 
    public string Name { get; set; } 
} 

donne la réponse xml suivante. Notez comment OtherString et NullNested manquent entièrement de la réponse, ce qui est différent de BlankString.

<MyClass> 
    <IsValid>false</IsValid> 
    <HelloString>Hello World</HelloString> 
    <BlankString /> 
    <Nested> 
    <Name>Bob</Name> 
    </Nested> 
</MyClass> 
1

Réponse courte: Ne pas utiliser nulle dans les services web.

En général, je conseille de coller des chaînes vides sur null sauf si la signification est zéro caractères. Je préférerais utiliser null uniquement comme "indéfini". Par exemple, avec une entrée utilisateur, si l'utilisateur entre dans le champ et ne tape rien, ce sera une chaîne vide. Mais si l'utilisateur saute simplement le champ, cela peut être nul. Jusqu'à ce que je définisse une signification pour null, je préfère retourner une chaîne vide et utiliser String.IsNUllOrEmpty du côté du traitement, car au lieu de toute connaissance future, je devrais supposer que null et vide sont les mêmes.

Mais web-services ont une touche spéciale, qui est qu'il ya eu plus d'une part d'erreurs dans les outils entre les différences dans <element/>, <element></element> et l'élément simplement disparition. Assez de confusion que si je ne contrôle pas tout, je ne crois pas que l'interopérabilité soit acceptable. Donc si j'ai un concept comme null que j'ai besoin de représenter, je vais créer un élément booléen séparé pour indiquer présent/non présent.

1

Personnellement, je préfère retourner des valeurs nulles au lieu de chaînes vides. Si la base de données a une valeur nulle, un service Web renvoyant cette valeur devrait idéalement renvoyer null au lieu d'une chaîne vide. Cela dit, j'ai rencontré des problèmes où les clients de services Web comme Adobe Flex ne peuvent pas vraiment travailler avec des valeurs nulles, et vous devrez peut-être passer une chaîne vide si le client ne peut pas être modifié.

Je ne vois aucun problème de sécurité de toute façon.

Questions connexes