Rails清理用户输入

时间:2016-05-12 00:00:45

标签: ruby-on-rails

对于用户输入的数据,我在保存之前采取了消毒方法,以删除任何HTML或任何恶意内容(即标签)。

我有一个before_validation回调:

before_validation    :sanitize_fields

def sanitize_fields
  full_sanitizer = Rails::Html::FullSanitizer.new
  white_list = Rails::Html::WhiteListSanitizer.new

  # Only text allowed
  self.fname = full_sanitizer.sanitize(self.fname)
  self.lname = full_sanitizer.sanitize(self.lname)
  self.company = full_sanitizer.sanitize(self.company)

  # Some HTML Allowed
  self.description = white_list.sanitize(self.description)
end

我遇到的问题是,当保存类似" Smith&amp ;;公司"作为名称,它作为Smith & Company存储在数据库中。这本身并不是问题,但它在表单的编辑视图中也显示为Smith & Company,这对最终用户来说似乎很有趣且令人困惑。

有没有比我采取的方法更好的方法?这"气味"对我不对。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您确信数据已清理,可以在视图中声明html_safe,以避免数据显示为&;它将完全按照提供的方式呈现。

这当然引出了一个问题:不是跳过箍来预先消毒,然后告诉它已被消毒的观点,为什么不仅仅允许视图像默认情况下那样清理字符串呢?如果在视图中呈现字符串"<tag>some_stuff</tag>",它将为您转义它。您是否担心除了在您控制的视图中出现在其他地方的未经过清理的字符串?

答案 1 :(得分:1)

它闻起来有异味的原因是因为它。

除了pe-rendering大文本(markdown等)块到html之外,我会避免以这种方式清理你的模型数据。以下rails最佳实践将保护您免受SQL注入,默认情况下,视图中的文本输出将以安全的方式呈现。

如果您需要允许用户输入html,请在输出(在您的视图中)而不是输入中对其进行清理。

关注点分离是一个原因,但最重要的是你要做的事情根本就不是惯用的铁轨。如果您选择继续沿着这条路走下去,那么您将不断地与框架作斗争。