你在哪里进行webapp(后端)验证?

时间:2009-08-10 18:15:33

标签: web-applications coldfusion

您在哪里进行webapp(后端)验证?

选项#1:服务层?

UserService.validate(FORM);  // verify and returns struct of errors

选项#2:对象层,在setter上?例如

user.setEmail(email);    // throws invalid/used e-mail

选项#3:对象层,validate()? e.g。

user.init(FORM);    // accept any values, no type checking
user.validate();    // returns struct of errors

你有什么看法?谢谢!

4 个答案:

答案 0 :(得分:4)

您在每个阶段都进行验证,但原因略有不同。

您可以验证用户何时设置值,以便向用户提供有关输入是否有效的即时反馈。该验证仅应用于增强用户体验。如果合适,您可以在用户输入时进行验证,但请确保不要阻止用户输入无效的部分输入,因为可能会有更多内容输入,并且您不希望验证妨碍使用。

您在用户提交表单之前进行验证,以确保提交有效,而不会产生完整往返服务器的时间成本。这主要是针对在用户输入期间未验证或无法验证的事物,并且可能涉及与服务器的一些通信,以检查用户名是否可用,例如,而无需重新加载页面。这个阶段也主要是为了用户的利益。无论您是在输入期间还是在提交时验证每个项目都取决于您,并且应该取决于哪个项目提供更好的用户体验并更好地适应用户的心理模型。

最后,您需要在返回服务器时验证所有内容,因为您无法信任浏览器。此验证主要用于安全性。您永远不能假设来自客户端的任何数据都是干净的,因为它可能不是来自您的客户端。它可能来自一个模仿你的客户的敌对代理人。因此,无论是否在客户端验证,都可以完全验证所有潜在漏洞和其他无效条件。

希望有所帮助。

答案 1 :(得分:0)

首先,来自我的+1为jborque。

我想补充一点,输入类型验证非常重复,例如

UI:不允许Name超过30个字符 BIZ:如果名称超过30个字符,则抛出异常/创建损坏的规则 DB:Make Name列30个字符宽 单元测试:测试名称< 30,> 30,正好30个字符

这是代码生成的绝佳选择。如果30突然变为40并且您正在使用代码生成,那么进行更改就像重新运行代码生成器一样简单(并为任何生产数据创建数据库升级脚本)。

我过去使用UML建模工具来捕获C#中的输入规则和部分类,以便将UML模型生成的代码与我自己的手写代码分开。在许多开发环境中,可以轻松应用相同的概念。

答案 2 :(得分:0)

+1 jbourqu也。很好的答案。 无处不在,无需承担不合理的性能成本。我经常验证后端函数的输入,如果其他代码使用意外值调用它们或者混合参数顺序,则不会直接暴露。

答案 3 :(得分:0)

我通常将表单验证保留在服务层中,而不是对象本身。我这样做并不是因为我不同意保持对象被完全封装,我这样做是因为它符合我选择在我的网站中用于处理表单提交的方法/设计模式。

我认为像Transfer这样的框架鼓励你在对象中保持对象验证,因为像Alegad's Validat之类的引擎/框架被设计为在其之外进行验证。我不认为这两种方法都是错误的,它实际上只是你喜欢的问题(以及适合应用的方法)。

在3个选项中,选项#2是在您有预期结果的情况下错过使用异常处理。通过使用验证方法(无论是在对象上还是在服务中),您可以更好地控制错误的验证情况,而不是捕获异常并被动地冒泡(捕获并返回带有失败信息的结构)或明确地(重新抛出)等等。)。