繁体   English   中英

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

[英]How do I learn to verify that user input is sane?

我不确定这里的术语,所以让我指定当我说“验证”用户输入时,我的意思是当心那些声称2021年2月30日为生日的用户,而不是防止注入攻击。

是否有任何正确执行此操作的指南,或人们做错的常见方法列表? 确保在输入之前就正确输入的策略(例如,从日历中挑选而不是在文本字段中输入)?

请注意,我对特定于语言的答案(例如,ASP.NET验证控件)不感兴趣,而对常规策略和原理感兴趣。

您要查找的术语是输入验证

如您所指出的,如果使用无法输入无效数据的控件,则可以帮助客户端,但仍需要在服务器上实施适当的验证。

我的意思是提防那些声称2021年2月30日为生日的用户,而不是防范注射攻击

为什么不两者都做? 您是否有特定原因想要让自己容易受到注射攻击?

假设用户向服务器发送了一个字符串,要么是他们自己输入的字符串,要么是由您放置在页面上的控件发送的字符串。 第一部分是找到用于将字符串解析为类型化数据的库函数。 在您的示例中,您可以使用DateTime.TryParse将字符串解析为日期。 对于给定的示例,这将失败,因为给定的日期无效。 如果找不到要解析的库函数,则可以尝试自己编写解析器。 对于简单的验证,您可以将其表示为正则表达式。 对于更复杂的输入,您可能需要编写一些执行验证的代码,如果输入语言特别复杂,甚至可能使用解析器库来帮助您。

第二部分是实施针对您需求的业务验证规则。 例如,你知道,出生日期必须是在过去,但在过去并不太远 这将需要做出一些判断,因为使用您网站的人并非不可能有100岁,但由于他们被认为没有这个年龄,因此200岁的可能性很小。

输入字段越自由,检查的内容就越多。 某些语言可以使您轻松验证文本字段是否为有效日期; 其他人可能不会。

然后,某些用户将再次讨厌单击日历控件或三个下拉菜单来输入其生日。 他们可能更喜欢直接输入。这是一个折衷。

我建议使用一种称为“策略”的设计模式。 这是“四人帮”(简称“ gof”)创建的模式之一。 您可能已经听说过这种模式的一些副本和变体,例如“控制反转”和“依赖注入”。

无论如何,对于面向对象的语言,您要做的是创建一个名为“ validator”的类,该类通过一种称为“ validate”的方法来验证数据。 您必须使validate接受某种相关形式的输入,或者重载它以对不同种类的数据使用不同的方法。 或者如果您可以访问某种形式的泛型,则可以使用它。

接下来,此类的构造函数应使用“ validatorstrategy”对象作为参数。 然后实际的验证将通过策略对象传递。

为了更进一步,您可以创建某种输入表单生成器系统,在其中使用自己的类型名称指定输入字段。 然后,它们将根据您的前端语言(html / android xml / java swing)生成不同的输入字段,并且它们还将影响验证输入的方式。

嗯..我想知道如何使用需要完全相同的内容来验证的两个密码输入字段来解决该问题。 在表单生成系统中看起来如何? 也许会有一种名为“ password”的输入类型,它将生成一个不显示输入且没有验证的输入字段,而另一种名为“ passwordsetter”的类型将生成两个不显示输入的输入字段,并具有比较两个字段中数据的验证策略。 通过D创建验证策略可能非常棘手:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM