15

对于后端验证,我的意思是,在触发器、检查、过程(插入、更新、删除)等期间。 它们现在有多实用或必要,现在大多数这些验证都是在前端严格处理的。有多少后端验证对程序有益?后端验证是否应该忽略小事?

例如:假设我们有年龄障碍来输入数据。这可以在后端使用触发器或年龄列中的检查来完成。它可以/也可以在前端完成。那么当前端有严格的年龄验证时,是否需要后端验证呢?

4

6 回答 6

37

这是一个概念问题。一般来说,现代程序构建在 3 层中:

  1. 介绍
  2. 商业逻辑
  3. 数据库

通常,第 1 层可以选择验证现代应用程序中的所有输入,为用户提供有关可能问题的快速反馈(例如,JS 弹出窗口说“这不是一个有效的电子邮件地址”)。

第 2 层始终必须进行全面验证。它是后端的网关,它可以检查复杂的关系约束。它确保没有损坏的数据可以以任何方式进入数据库,并根据应用程序的约束进行验证。这些限制通常比您可以在数据库中检查的内容更复杂(例如,荷兰的银行帐号必须是 3 到 7 个数字,或者9 或 10 并匹配校验位测试)。

第 3 层可以进行验证。如果只有一个“客户”,它本身不是必需的,如果有更多(特别是如果同一数据库有“不太受信任的”用户),它肯定也应该在数据库中。如果应用程序是关键任务,还建议使用触发器和约束在数据库中进行全面验证,以双重防范业务逻辑中的错误。数据库的工作是确保其自身的完整性,而不是遵守特定的业务规则。

对此没有明确的答案,这取决于您的应用程序做什么以及它的重要性。在银行应用程序中 - 在所有 3 个级别上进行验证。在互联网论坛中 - 只检查需要的地方,并为额外的用户提供性能优势。

于 2013-06-11T08:53:39.647 回答
15

这可能会有所帮助:

  1. 前端(界面)验证用于数据输入帮助和上下文消息。这确保了用户拥有无忧无虑的数据输入体验;并最大限度地减少验证正确性所需的往返。

  2. 应用程序级验证用于业务逻辑验证。这些值是正确的,但它们是否有意义。这就是你在这里所做的验证,你的大部分努力应该在这个领域。

  3. 数据库不做任何验证。它们提供了约束数据的方法,其范围应该是确保参照完整性。参照完整性确保您的查询(尤其是跨表查询)按预期工作。就像没有数据库服务器会阻止您输入4000数字列一样,它也不应该是检查年龄是否小于 40 的地方,因为这对数据的完整性没有影响。但是,确保删除的行不会留下任何孤儿 - 这是参照完整性,应该在数据库级别强制执行。

于 2013-06-11T08:57:23.910 回答
5

后端验证是必要的!

如果前端使用 JavaScript 验证,并且用户在浏览器中禁用 JavaScript,则验证将被关闭。所以需要后端验证。

于 2013-06-11T08:50:36.113 回答
4

在您的数据库上放置约束。这不是业务验证,更像是数据验证,例如 - 外键约束,或确保您的主键是唯一的。它确保您的数据是一致的。

您说的验证是业务验证,这种验证应该在您的业务层,例如在您的域中,并且应该是验证的主要来源。如果这些规则发生变化,您在业务层修改它们,您的所有客户端都会立即受到影响。

在 UI 中,您还可以/应该进行基本的输入验证 - 例如检查必填字段或电子邮件地址的有效性;并基于此更新或禁用 UI 控件。我会说这是一种不会改变(很多)的验证。

于 2013-06-11T08:52:28.273 回答
2

古老的答案:这取决于

这真的取决于你的需求。如果用户将直接修改数据库,我会说你绝对需要约束你的数据库。也就是说,大量数据库仅由 Web 应用程序修改。虽然您肯定需要在 Web 应用程序本身中进行服务器端验证,因为用户可以绕过您的网页,但您可能不需要数据库约束。

为了方便客户,您仍然应该在客户端进行验证。

于 2013-06-11T08:52:35.890 回答
0

如果您担心安全性,则应在服务器上验证所有内容,以防止有人创建替代客户端来访问/操作您的数据库。前端也是必要的,因为它可以提高效率并防止服务器被不适当的数据访问。

于 2013-06-11T08:51:46.880 回答