Rails清理删除默认允许的标记

时间:2011-09-24 22:25:25

标签: ruby-on-rails ruby-on-rails-3 sanitize

我如何使用sanitize,但是告诉它禁止某些默认标签启用? documentation表示我可以将其放入application.rb

config.after_initialize do
  ActionView::Base.sanitized_allowed_tags.delete 'div'
end

我可以将此作为参数进行消毒吗?

2 个答案:

答案 0 :(得分:18)

是的,您可以在每次通话的基础上指定允许的标签和属性。来自fine manual

  

自定义使用(仅允许提及的标签和属性,没有其他内容)

<%= sanitize @article.body, :tags => %w(table tr td), :attributes => %w(id class style) %>

但问题是:tags必须包含所有您想要允许的标记。

sanitize文档说明

  

有关可用选项的完整文档,请参阅ActionView :: Base。

但文档是谎言,ActionView::Base对可用选项一无所知。

所以,像往常一样,我们必须深入挖掘源代码,希望他们不要默默地改变界面。跟踪代码yields this

def tokenize(text, options)
  options[:parent] = []
  options[:attributes] ||= allowed_attributes
  options[:tags]       ||= allowed_tags
  super
end

def process_node(node, result, options)
  result << case node
    when HTML::Tag
      if node.closing == :close
        options[:parent].shift
      else
        options[:parent].unshift node.name
      end

      process_attributes_for node, options

      options[:tags].include?(node.name) ? node : nil
    else
      bad_tags.include?(options[:parent].first) ? nil : node.to_s.gsub(/</, "&lt;")
  end
end

options[:tags]tokenize的默认值以及options[:tags]中使用process_node的方式很有意义,并告诉我们如果options[:tags]有任何内容,那么它必须包含整套允许的标签,并且没有任何其他选项来控制标签集。

另外,如果我们查看sanitize_helper.rb,我们会发现sanitized_allowed_tags只是白名单清理程序中allowed_tags的包装器:

def sanitized_allowed_tags
  white_list_sanitizer.allowed_tags
end

您应该能够添加自己的帮助程序,这样做的事情就像这样(未经测试的非常有用的代码):

def sensible_sanitize(html, options)
    if options.include? :not_tags
        options[:tags] = ActionView::Base.sanitized_allowed_tags - options[:not_tags]
    end
    sanitize html, options
end

然后你可以

<%= sensible_sanitize @stuff, :not_tags => [ 'div' ] %>

使用除<div>以外的标准默认代码。

答案 1 :(得分:2)

我知道你正在寻找一种传递标签的方法,因为那个mu的答案看起来不错!

我很想全局设置它们比我希望的更棘手,因为ActionView :: Base已经覆盖了sanitized_allowed_tags =来追加而不是替换!

我最终将以下内容发送到我的application.rb:

SANITIZE_ALLOWED_TAGS = %w{a ul ol li b i}
config.after_initialize do
  ActionView::Base.sanitized_allowed_tags.clear
  ActionView::Base.sanitized_allowed_tags += SANITIZE_ALLOWED_TAGS
end