防御性地检查客户的输入。这是一个好习惯吗?

时间:2013-11-15 21:05:17

标签: java web-services

在客户端防御性地检查空/空输入是一种好习惯吗?在服务器中,如果客户端也进行检查以避免调用webservice,则会检查输入是否为null并且相应地抛出异常?

3 个答案:

答案 0 :(得分:3)

在最好的情况下,这是一项绩效改进,没有别的。

在最糟糕的情况下,客户端检查可能会偏离服务器接受的内容,实际上由于部署不一致而引入了错误。

在任何一种情况下,您通常无法控制客户端环境,因此您无法假设已执行客户端检查。恶意用户可以注入自己的客户端代码,这将允许将无效的输入发送到服务器,因此仍然强烈要求进行服务器端检查。

我建议您进行客户端检查,但我还建议您注意确保客户端检查与服务器端检查同步,以便客户端不会开始过滤以与服务器不同的方式输入。如果这有问题,那么在使服务器端检查正确时会出错。这是唯一真正的防守点。

答案 1 :(得分:2)

最好不要做任何你需要做的事情来保护你的服务器。

始终检查服务器端,您永远不知道数据来自何处。

如果您有任何理由在将数据发送到服务器之前通知用户他们的错误,请检查客户端。例如,整数输入的客户端验证可以例如在用户键入时更新警告标签,而不需要对服务器进行往返验证。客户端检查本质上是向用户显示明确验证错误的第一行操作,但实际上它们只不过是UI性能改进。如果您不想这样做,那么您不需要这样做。如果您只想对某些值执行此操作,则只需对某些值执行此操作。

也许您的服务器已经生成了有关验证错误的合理信息,在这种情况下,您可以将这些信息显示给客户端。这实际上取决于你的情况和需求。

例如,假设客户端在最终向服务器发送请求之前显示一系列要求输入的对话框。如果用户在 之后没有得到无效输入的通知,那么这会让用户感到恼火,因为他们会经历整个系列的对话框。这是在输入的每个步骤进行客户端验证的好例子。

请注意,客户端验证的成本是,如果它们发生变化,您需要确保维护它以匹配实际的服务器端规则。

考虑一下您的具体要求并选择适当的行动方案以确保满足这些要求,而不是询问关于通用的,与情境无关的“良好做法”的模糊问题,这也是一种好习惯。

就个人而言,我尽力让服务器端验证报告有用的信息,我不做任何初始的客户端验证。然后,在更高优先级的工作完成之后以及在确定UX明显受益于它之后,我稍后添加客户端验证。

答案 2 :(得分:0)

是的,为了尽可能降低带宽和服务器负载,您应该始终添加客户端验证。即使是瘦客户端也可以进行简单的验证,例如null / empty-checks。

如果您根据许多不同的输入(交叉验证)或可能是复杂的校验和计算进行了一些复杂的验证,则可能会跳过客户端验证并仅在服务器端进行验证。

但总是需要服务器端验证,因为如您所见,如果您现在决定不进行验证,则无法信任客户端。