从Web服务调用返回空值
我有一个Web服务API。某些调用返回包含文本字段的对象,这些文本字段包含用户提供的信息。从设计和安全的角度来看,当没有提供任何信息时,在这些字段中返回null有何不利之处?始终返回一个空字符串是否有明显的优势,而不是通过不需要客户端代码检查null来简化API,这是否有明显的优势?
解决方案
我不认为返回null与返回空字符串有关的安全问题。
对于那些没有任何信息表示空值表示的字段,返回空值没有任何实际的缺点。
我们可以通过使用简化客户端代码
string.IsNullOrEmpty()
(假设这是.NET)
这完全取决于我们是否将空字符串值在语义上与空字符串区别对待。
如果null和empty string都表示该字段没有数据,那么我没有理由不通过检查和返回空字符串来简化客户端的工作。
空值仅表示空值。那里没有固有的安全性问题。
由于Web服务是公共API,因此我们应严格检查所有输入数据,并期望发生格式错误的输入。我们永远不能假设客户端代码做对了,并且不会(恶意或者以其他方式)不向我们发送null。
因此,Empty字符串或者其他哨兵值不会使我们免于检查输入,它们也不一定使生活更轻松。语义上空的字符串也不是null,而是空的。
就其价值而言,.net SoapFormatter为null生成的xml简直就是一无所有,并且与空字符串不同。这是一个简单的例子,但内容丰富。如果发送null,则发送的数据也较少,这可能是要考虑的问题。
{ [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; } }
产生以下xml响应。注意响应中的" OtherString"和" NullNested"是如何完全丢失的,这与" BlankString"不同。
<MyClass> <IsValid>false</IsValid> <HelloString>Hello World</HelloString> <BlankString /> <Nested> <Name>Bob</Name> </Nested> </MyClass>
简短答案:请不要在网络服务中使用null。
通常,除非含义是零个字符,否则我建议在null之前使用空字符串。我宁愿只将null用作"未定义"。例如,在用户输入的情况下,如果用户输入该字段且未键入任何内容,则该字符串将为空。但是,如果用户只是跳过该字段,则该字段可能为null。
在定义null的含义之前,我倾向于返回一个空字符串并在处理端使用String.IsNUllOrEmpty,因为代替任何将来的知识,我应该假定null和empty相同。
但是Web服务有一个特殊的转折,即在<element /> 、、 <element> </ element>中的差异与根本就缺失的元素之间存在着很多错误的工具。令人困惑的是,除非我控制整个事情,否则我不相信互操作性是可以接受的。
因此,如果我有一个需要表示的像null这样的概念,我将创建一个单独的布尔元素来表示存在/不存在。
我个人更喜欢返回null而不是空字符串。
如果数据库具有空值,则理想情况下,返回该值的Web服务应返回空值而不是空字符串。
话虽如此,我遇到了这样的问题:像Adobe Flex这样的Web服务客户端不能真正使用null,如果无法修改客户端,则可能必须传递一个空字符串。
无论哪种方式,我都看不到任何安全问题。