如何处理层之间的输入和参数验证?

jps*_*ook 8 c# asp.net

如果我有一个3层Web表单应用程序,它接受用户输入,我知道我可以使用表示层中的验证控件来验证该输入.我是否还应该在业务和数据层中进行验证,以防止SQL注入和问题?每层应该进行哪些验证?

另一个例子是传递ID以返回记录.数据层应该确保id有效还是应该在BLL/UI中发生?

Pau*_*ner 7

您应该在应用程序的所有层中进行验证.

每层进行的验证特定于层本身.每个层都应该安全地向"坏"请求发送并获得有意义的响应,但是在每个层执行哪些检查将取决于您的特定要求.

宽广地:

  • 用户界面 - 应验证用户输入,提供有用的错误消息和纠正它们的视觉线索; 它应该保护您的较低层免受无效的用户输入.
  • 业务/域层 - 应该检查方法的参数是否有效(丢弃ArgumentException时抛出和类似),并且应该检查在业务规则的约束内是否可以进行操作; 它应该保护您的域免受编程错误.
  • 数据层 - 应检查您尝试插入或更新的数据在数据库的上下文中是否有效,它是否满足所有关系约束和检查约束; 它应该保护您的数据库免受数据访问中的错误.

每层的验证将确保只允许该层认为正确的数据和操作进入.这为您提供了大量的可预测性,知道信息必须符合某些标准才能通过您的数据库,操作必须符合逻辑才能通过您的域层,并且用户输入已经过清理并且更容易工作用.

它还为您提供安全保护,知道如果您的任何图层被破坏,则会有另一个图层在其后面执行检查,这会阻止任何您不想进入的图层.


Ode*_*ded 5

Should I also validate in the business and data layers as well to protect against SQL injection and also issues?

是的,是的.

在业务层代码中,您需要再次验证输入(因为客户端可以被欺骗),还需要验证业务逻辑,确保条目对您的应用程序有意义.

至于数据层 - 您还需要确保数据对数据库有效.使用参数化查询,因为这将确保不会发生SQL注入.

至于您关于ID的具体问题 - 数据库将知道是否存在ID.这是否有效取决于它是否对您的业务层有意义.如果它纯粹是一个DB artefact(不是你的对象模型的一部分),而不是DB需要处理它,如果它你的对象模型的一部分并且对它有意义,那么业务层应该处理它.