DAO 是不是应该验证输入

Posted

技术标签:

【中文标题】DAO 是不是应该验证输入【英文标题】:Should DAO's validate the inputDAO 是否应该验证输入 【发布时间】:2011-07-11 15:46:34 【问题描述】:

由于 DAO 层通常负责在给定特定输入(如 user_id 等)的情况下从 DB 访问数据,它是否应该关注检查其输入的有效性?

例如如果有一个 DAO 方法可以根据 user_uid 获取用户,这是一个(> 0)主键,那么 DAO 方法是否应该在进行必要的 DB 调用之前始终检查这个约束?还是应该假设调用此方法的任何更高层都会处理约束并且永远不会传递-ve id? DAO 方法可以在其文档中发布此约束,以便编写更高层的程序员了解它。

您通常会使用哪种方法以及为什么?

感谢和问候!

【问题讨论】:

【参考方案1】:

DAO 层不应检查输入的有效性。在持久层检查数据的完整性和一致性(例如:外键),在业务层检查“业务”相关的有效性。 DAO 层的唯一职责是与持久层通信以存储或检索数据。

【讨论】:

【参考方案2】:

答案取决于业务层(大概在数据层之上)是否正在验证这些值,以及是否可以从任何其他层(例如工作流层)调用数据层。

一般来说,最好在业务层进行捆绑验证,并限制层通信,使数据层只能通过业务层调用。

我们还在存储过程中添加了 key/null 验证检查,以防将来另一个服务决定尝试放入无效数据。

【讨论】:

以上是关于DAO 是不是应该验证输入的主要内容,如果未能解决你的问题,请参考以下文章

servlet一个简单的验证输入的用户名和密码是不是和数据库的一样(不用session)

在保护评论表单和相关 API 端点时,是不是应该在浏览器、服务器或两者中对输入进行清理、验证和编码?

如何根据选定的无线电验证文本输入以及是不是可见

输入字段表单验证 - 复选框

mvc3 验证输入“不等于”

在字段纯PHP退出时验证输入字段