2010-05-21 115 views
4

我正在编写一个非常简单的CRUD应用程序,它将用户素材存储到数据库中,以便其他同伴编码人员可以将它们组织为我们正在处理的项目。但是,在将用户输入保存到数据库之前,我遇到了一个消毒用户输入的问题。我无法从Story模型中调用sanitize()函数去除所有html /脚本。它要求我做到以下几点:用Ruby on Rails消毒用户输入

def sanitize_inputs 
    self.name = ActionController::Base.helpers.sanitize(self.name) unless self.name.nil? 
    self.story = ActionController::Base.helpers.sanitize(self.story) unless self.story.nil? 
end 

我想验证用户输入已经被消毒,而且我不确定的两件事情: 1)如果用户输入验证发生?在保存数据之前很明显,我认为,在我验证用户输入没有脚本/ html标记之前,我应该在验证之前,在验证之前或者在其他一些非明显区域处理这些东西? 2)为这个模型编写单元测试,除了比较“这是恶意代码示例”和sanitize(example)输出之外,我将如何验证脚本/ html是否被删除?

在此先感谢。

+2

不完全是一个答案,但提醒:rails 3默认清理用户输入。 – kikito 2010-05-21 15:19:20

回答

5

有消除XSS漏洞2点的方法:

A.To过滤器在数据库存储它(什么你正在尝试做的)之前的内容。这里有2个插件可以为你做到这一点。

xss_terminate

acts_as_sanitiled

B.To过滤内容时显示它(Rails 3的默认完成它)。您可以使用h函数或使用rails_xss。我认为你的单元测试应该只测试消毒方法被调用,而不是功能本身(所以一个简单的断言在基本的例子应该做的伎俩)。消毒功能/插件默认已经过很好的测试。

+0

感谢指向acts_as_sanitized和xss_terminate的指针。这也归结为,我想我需要使用xss_terminate或滚动我自己的。 – phreakre 2010-05-21 15:25:22

+1

我刚刚发现了xss_terminate在Ruby 1.9中疯狂出现的难题,并将所有数据库字符串作为“[]”返回。如果您使用HTML5libSanitize,另一个问题是它依赖于极其缓慢且不再受支持的Ruby HTML5lib实现。 – simianarmy 2011-09-30 23:40:43

1

我认为关于消毒输入的普遍共识是 - 不要。将输入存储为用户输入的内容,并在输出中使用帮助器sanitize。 (例如,<%=h @author.filthy_nasty_data %>

这就是说,你总是可以使用strip_tags助手在this answer提及。

+9

我不同意没有消除用户输入的普遍共识。遵循这个想法,我们不会在驱动器上扫描病毒文件。我认为在这种情况下深度妥善的防御是尽力保护投入和产出的卫生。由于这个应用程序不会有任何特殊的标记(没有bb代码等),我没有理由不把任何看起来可疑的任何东西从输入中剥离出来,并且不会让数据库中的逻辑炸弹等待执行。 总有人比你更聪明,你呢? – phreakre 2010-05-21 15:28:06

+1

永远不要冒用户输入的风险。如果你没有在输出中捕捉到坐在数据库中的“逻辑炸弹”,那么无论如何你都不会在输入中捕获它。 – coreyward 2010-11-04 17:20:11

+2

坏人可以插入代码来利用插入数据库,所以你必须在插入之前对它进行消毒! – fuzzyalej 2012-02-01 16:00:11