0

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

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

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

4

3 回答 3

0

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

再说一次,一些用户会讨厌点击日历控件或三个下拉菜单来输入他们的生日。他们可能更喜欢只输入它。这是一个权衡。

于 2011-03-03T22:00:12.720 回答
0

您正在寻找的术语是输入验证

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

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

为什么不两者都做?您是否有特定的原因要让自己对注入攻击持开放态度?

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

第二部分是针对您的需求实施业务验证规则。例如,您知道出生日期必须是过去,但不能太远。这将需要一些判断,因为使用您网站的人可能有 100 年的历史并非不可能,但他们极不可能有 200 岁,因为据信没有人这么老。

于 2011-03-03T21:56:05.000 回答
0

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

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

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

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

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

于 2011-03-03T22:25:04.807 回答