假设您有一个网页表单,其中包含您要验证的某些字段,只是字母数字的某个子集,最小或最大长度等。
您可以在客户端使用javascript进行验证,您可以将数据发回服务器并通过ajax或不通过回复报告给用户。您可以在数据库中使用验证规则,并以这种方式将错误消息推送给用户。
或以上所有的任何组合。
如果您希望单个位置保留持久保存到数据库的Web应用程序用户数据的验证规则,那么这些最佳实践,模式或一般好建议是什么?
[编辑]
我编辑了问题标题以更好地反映我的实际问题!到目前为止,一些很棒的答案顺便说一句。
答案 0 :(得分:17)
以上所有内容:
编辑:我看到你编辑了问题,要求为验证规则提供单点规范。这被称为“数据字典”(DD),并且是拥有并用于在不同层中生成验证规则的好事。然而,大多数系统都没有,所以如果你从来没有开始构建这样的东西,那就不要感觉不好; - )
现代3层系统DD的一种可能/简单设计可能只包括 - 以及通常的max-size / min-size / datatype信息 - 一个Javascript表达式/函数字段,C#assembly / class / method字段和sql表达式字段。 javascript可以插入到客户端验证中,C#info可以用于服务器端验证的反射加载/调用,sql表达式可以用于数据库验证。
虽然理论上这一切都很好,但我不知道在实践中真正做到这一点的任何真实系统[尽管它听起来像是一个好主意]。
如果你这样做,请告诉我们它是怎么回事!
答案 1 :(得分:3)
回答实际问题:
首先,数据库限制与客户端限制相匹配并非总是如此。因此,将自己限制为仅基于数据库约束进行验证可能是个坏主意。
但话又说回来,您确实希望数据库约束能够反映在您的数据模型中。因此,第一个近似可能是定义一些小的变量,它们既可以检查约束,也可以检查系统语言和javascript。
或者您只是注意在同一个地方加密三个表示,这样您就可以在更改内容时保持同步。
但是假设您确实需要在特定上下文中使用的另一组限制,其中域模型不够严格,或者它的数据根本不在模型中。如果您可以使用相同的框架来定义模型限制来定义其他类型的限制,那将是一个好主意。
也许要走的路是为描述限制的定义者定义一个小的可管理的DSL。然后,您生成“编译器”,解析此DSL并提供您需要的表示。
“DSL”不一定是那种花哨的,简单的字符串和int验证不是那么大的问题。如果您的数据库不支持它,RegEx验证可能是一个问题。您可以将此DSL设计为一组类或您的系统语言提供的可以通过简单的布尔代数组合到表达式中。
答案 2 :(得分:2)
要在一个地方保留验证规则,我只使用服务器端验证。为了使它更加用户友好,我只是向服务器发出异步发布请求,服务器以JSON格式返回错误信息,如:
{ "fieldName1" : "error description",
"fieldName2" : "another error description" };
如果服务器返回空对象,则提交表单,否则我可以使用服务器中的信息来显示错误。它的工作方式与这些注册表单非常相似,它们会在您提交表单之前检查您的登录是否存在,但有两个主要区别:请求是在提交时发送的,并发送所有字段值(输入类型=“文件”除外)。 / p>
如果JavaScript验证因任何原因无效,则使用相同的服务器端脚本进行常规服务器端验证方案(带有错误信息的页面重新加载)。
此解决方案不像纯客户端验证那样响应(需要时间在客户端和服务器之间发送/接收数据),但是非常简单,并且您不需要将验证规则“转换”为JavaScript。
答案 3 :(得分:1)
始终验证每个输入服务器端。你不知道他们的客户端“正确”支持javascript,或者他们没有欺骗他们的http请求并完全绕过你的javascript。
我建议您不要将支票限制在一个位置 - javascript中的其他检查可以让您的用户更加敏感。
答案 4 :(得分:1)
正如其他人所说,您需要在服务器端验证安全性和数据完整性的原因,并且在客户端进行验证将改善用户体验,因为用户将有机会更快地解决他们的错误。 / p>
似乎问题是如何更多地询问如何定义验证,以便验证的每个地方都是同步的。我建议在一个地方定义验证规则,例如XML文件或其他东西,并拥有一个读取该文件的框架,并生成javascript函数以在客户端上进行验证。然后,它可以使用相同的规则在服务器上进行验证。
这样,如果你需要更改规则,你就有一个地方可以去。
答案 5 :(得分:1)
正如其他人所说,您必须在数据库,客户端和服务器层进行验证。您要求一个地方进行验证,以便所有这些都同步。
一些Web开发框架使用的方法(包括CakePHP) 是将您的代码组织成Model,View,Controller对象。
您可以将所有数据代码(包括验证)放在模型层中(如果需要,可以对数据库表结构或存储过程进行注释)。
接下来,在此模型中为验证定义每个字段的正则表达式(以及通用的max-size,min-size,required字段)。
最后,使用此正则表达式在javascript(视图)和服务器表单处理代码(Controller)中进行验证。
如果正则表达式不够 - 即你必须检查数据库以查看用户名是否可用,你可以在模型上定义验证方法直接在表单处理代码中使用它,然后使用javascript调用它ajax和一个小验证页面。
我会插入一个以良好框架开头的插件,这样你就不必自己连接所有这些了。</ p>
答案 6 :(得分:0)
良好的数据验证解决方案可以使用基于XML Schema的数据类型定义,然后客户端和服务器都将重用这些类型,因为它们都需要执行它。值得注意的是,Backbase Ajax Framework基于XML Schema数据类型(内置和用户定义的数据类型)实现客户端用户输入验证
答案 7 :(得分:0)
答案 8 :(得分:0)
我们尝试在它到达数据库服务器之前继续进行验证,特别是对于面向公共互联网的应用程序。如果在数据到达数据库之前未进行验证,则会使数据库面临SQL注入攻击的风险。我们通过混合使用javascript和代码隐藏来验证。
答案 9 :(得分:0)
过去,我使用XSLT进行验证。我们将创建值的XML文档并针对XSLT运行它。 XSLT是由XPath“规则”构建的。生成的XML文档由一系列破坏的规则和破坏它们的字段组成。
我们能够: