我应该在'before_validate'或'before_save'上清理用户输入吗?

时间:2009-08-18 17:20:58

标签: security web-applications

如果我收到用户输入,如果我先验证然后在保存到数据库之前进行清理会有什么不同吗?

或者验证未经过抽样的输入有任何风险吗?

(当我说'清理'时,我主要是指剥离任何HTML标签)

更新&澄清:

我不会将HTML标记放入数据库。我会在保存之前清理输入 - 但是在验证我的模型之后。验证和清理是分开的原因是因为它们是独立的库 - 唯一的问题是我是否应该在'before_validate'或'before_save'上调用'sanitize'。

3 个答案:

答案 0 :(得分:1)

我能想到的唯一风险是你是否正在进行广泛的客户端验证。如果您在错误消息中验证然后将值吐回到页面上,则可能会出现问题。

例如,如果您的文本框必须只包含数字,并且用户在该文本框中输入了一个字母。如果您的客户端脚本生成错误消息,例如“'somevalue'是此文本框的无效值”,那么您将向用户输入的任何内容注入该页面。无论哪种方式,它只会影响该用户的会话。

答案 1 :(得分:0)

为什么要将HTML剥离(或转义)与其他验证分开?这不是一回事吗?

为什么要将HTML标记放入数据库只是为了以后剥离它们?这是否意味着您的数据库暂时不正确?

我不明白为什么要将“验证”与“消毒”分开。它们是同一枚硬币的两面。在将数据提交到数据库之前,确保数据是完美的所有


“唯一的问题是我是否应该在'before_validate'或'before_save'上调用'sanitize'。”

区别对于言语来说太微妙了。你必须两个都做。通常,您不想尝试验证HTML。

因此,只有当你(1)“清理”剥离HTML标签然后(2)验证剩下的内容时,才有意义。

我不确定你还能怎么做。

答案 2 :(得分:0)

在提交数据库之前,请务必进行验证和清理。如果不这样做,您可能会将数据库暴露给SQL注入攻击。

您这样做的顺序取决于您希望用户体验的目标。如果您先验证,那么您可以更容易地向用户提供验证(您可以使用javascript和正则表达式来执行此操作)

必需的xkcd漫画:

alt text