我正在编写一个非常简单的CRUD应用程序,该应用程序将用户故事存储到数据库中,以便其他编码人员可以为我们正在处理的项目组织它们。但是,在将用户输入保存到数据库之前,我遇到了清理用户输入的问题。我无法从Story模型中调用sanitize()函数来去除所有的html /脚本。它要求我做以下事情:
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标记之前,我应该在验证之前处理Controller中的这些内容,还是其他一些非显而易见的区域? 2)为此模型编写单元测试,除了将“这是恶意代码示例”与清理(示例)输出进行比较之外,如何验证脚本/ html是否被删除?
提前致谢。
答案 0 :(得分:5)
有两种方法可以消除XSS漏洞:
A.在将内容存储到数据库中之前过滤内容(您要做的是什么)。这里有2个插件可以帮到你。
B.在显示内容时过滤内容(Rails 3默认情况下会这样做)。您可以使用h
功能或使用rails_xss。
与您的第二个问题一样,我认为您的单元测试应该只测试是否调用了清理方法,而不是功能本身(因此基本示例上的简单断言应该可以解决)。默认情况下,清理功能/插件已经过很好的测试。
答案 1 :(得分:2)
我认为关于消毒输入的普遍共识是 - 不要。在用户输入时存储输入,并在输出时使用sanitize
帮助器。 (例如<%=h @author.filthy_nasty_data %>
)
也就是说,您可以随时使用this answer中提到的strip_tags
帮助器。