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

Lan*_*fee 2 ruby-on-rails sanitize ruby-on-rails-3

我如何使用sanitize,但是告诉它禁止某些默认标签启用?该文件规定,我可以把这个在我application.rb

config.after_initialize do
  ActionView::Base.sanitized_allowed_tags.delete 'div'
end
Run Code Online (Sandbox Code Playgroud)

我可以将此作为消毒的参数传递给我吗?

mu *_*ort 19

是的,您可以指定允许基于每个呼叫的标签和属性.从精细手册:

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

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

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

sanitize文件说,到

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

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

所以,像往常一样,我们必须深入挖掘源代码,希望他们不要默默地改变界面.跟踪代码有点产生这个:

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
Run Code Online (Sandbox Code Playgroud)

输入的options[:tags]in 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
Run Code Online (Sandbox Code Playgroud)

您应该能够添加自己的帮助程序,执行类似这样的操作(未经测试的顶级代码):

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
Run Code Online (Sandbox Code Playgroud)

然后你可以

<%= sensible_sanitize @stuff, :not_tags => [ 'div' ] %>
Run Code Online (Sandbox Code Playgroud)

使用标准默认标签除外<div>.