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