对所有内容进行后端(数据库端)验证是否切实可行?

时间:2013-06-11 08:47:52

标签: sql database

使用后端验证我的意思是,在触发器,检查,过程(插入,更新,删除)等过程中。 现在是多么实际或必要,现在大多数这些验证都是在前端严格处理的。 有多少后端验证对程序有用?是否应该从后端验证中删除一些小问题?

例如:让我们说人们有年龄障碍输入数据。这可以使用触发器或年龄列中的检查在后端完成。它可以/也可以在前端完成。因此,当前端严格验证年龄时,是否有必要进行后端验证?

6 个答案:

答案 0 :(得分:23)

这是一个概念性问题。一般而言,现代程序分为3层:

  1. 演示
  2. 商业逻辑
  3. 数据库
  4. 通常,第1层可能选择验证现代应用程序中的所有输入,为用户提供有关可能问题的快速反馈(例如,JS弹出说“这不是有效的电子邮件地址“)。

    第2层 始终 必须进行完全验证。它是后端的网关,它可以检查复杂的关系约束。它确保任何损坏的数据都不会以任何方式进入数据库,并根据应用程序的约束进行验证。这些限制比你在数据库中检查的更复杂(例如,荷兰的银行帐号必须是3到7个数字, 9或10并且匹配{ {3}})。

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

    这个问题没有明确的答案,这取决于你的应用程序做了什么以及它有多重要。在银行应用程序中 - 验证所有3个级别。在互联网论坛中 - 仅检查需要的位置,并为具有性能优势的额外用户提供服务。

答案 1 :(得分:11)

这可能会有所帮助:

  1. 前端(接口)验证用于数据输入帮助和上下文消息。这确保了用户具有轻松的数据输入体验;并最小化验证正确性所需的往返

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

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

答案 2 :(得分:5)

后端验证是必要的!

如果前端使用JavaScript验证,并且用户在浏览器中禁用JavaScript,则关闭验证。因此需要进行后端验证。

答案 3 :(得分:4)

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

您正在讨论的验证是业务验证,此类验证应位于您的业务层中,例如在您的域中,并且应该是主要的验证来源。如果这些规则发生更改,您将在业务层中修改它们,并立即影响所有客户端。

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

答案 4 :(得分:2)

古老的答案:取决于

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

您仍应在客户端进行验证,以方便客户。

答案 5 :(得分:0)

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