我如何学习验证用户输入是否合理?

我不确定这里的术语,所以让我指出,当我说“验证”用户输入时,我的意思是提醒用户声称2021年2月30日为他们的生日,而不是防止注入攻击。 是否有正确执行此操作的指南,或人们做错的常见方法列表?即使在输入之前确保正确输入的策略(例如,选择日历而不是键入文本字段)? 请注意,我对语言特定的答案(例如,ASP.NET验证控件)不感兴趣,而是对一般策略和原则感兴趣。     
已邀请:
您输入字段越自由,您就越需要检查。某些语言可以让您轻松验证文本字段是否为有效日期;其他人可能没有。 然后,一些用户将重新点击日历控件或三个下拉菜单以输入他们的生日。他们可能更喜欢只输入它。这是一种权衡。     
您正在寻找的术语是输入验证。 当您指出如果您使用无法输入无效数据的控件时,您可以帮助客户端,但您仍需要在服务器上实现正确的验证。   我的意思是提醒用户声称2021年2月30日为他们的生日,而不是防止注射攻击 为什么不两个都做?你有什么特别的理由想让自己接受注射攻击吗? 假设用户向服务器发送一个字符串,可以是他们自己输入的字符串,也可以是您放置在页面上的控件发送的字符串。第一部分是找到一个库函数,用于将字符串解析为类型化数据。在您的示例中,您可以使用
DateTime.TryParse
将字符串解析为日期。由于给定日期无效,因此您的示例将失败。如果找不到要解析的库函数,可以尝试自己编写解析器。对于简单的验证,您可以将其表达为正则表达式。对于更复杂的输入,您可能需要编写一些执行验证的代码,如果输入语言特别复杂,甚至可能使用解析器库来帮助您。 第二部分是实现特定于您需求的业务验证规则。例如,您知道出生日期必须是过去,但过去并不太远。这将需要一些判断,因为使用您的网站的人可能已经100岁了,但他们200岁的可能性很小,因为没有人被认为是这么久。     
我建议使用一种名为“策略”的设计模式。这是“四人帮”或简称“gof”所创造的模式之一。您可能听说过这种模式的一些副本和变体,例如: “控制倒置”和“依赖注入”。 无论如何,对于面向对象的语言,你要做的是创建一个名为“validator”的类,它在一个名为“validate”的方法中验证数据。你必须让验证接受一些相关的输入形式,或者重载它以便为不同种类的数据提供不同的方法。或者如果您可以访问某种形式的泛型,您可以使用它。 接下来,这个类的构造函数应该将“validatorstrategy”对象作为参数。然后实际验证将通过策略对象传递。 为了更进一步,您可以创建某种输入表单生成器系统,您可以使用自己的类型名称指定输入字段。这些将根据您的前端语言(html / android xml / java swing)生成不同的输入字段,它们也会影响输入的验证方式。 嗯..我想知道如何用两个密码输入字段解决问题,这些字段需要具有完全相同的内容才能验证。如何看待表单生成系统?也许会有一个名为“password”的输入类型生成一个输入字段,它不显示输入并且没有验证,另一个类型名为“passwordsetter”,它会产生两个不显示输入的输入字段,并且具有比较来自两个领域的数据的验证策略。 D:创建验证策略可能相当棘手     

要回复问题请先登录注册