目标 mailto:链接 Rails::Html::TargetScrubber

Target mailto: links with Rails::Html::TargetScrubber

我正在尝试清除 mailto 链接,同时允许其他人使用 Rails::HTML Scrubbers。

参见:https://github.com/rails/rails-html-sanitizer

我有一个这样的 Loofah 片段:

Loofah.fragment('<a href="mailto:e@example.test">tis but a scratch</a>')

我的 Scrubber 是这样的:

class TargetedHtmlScrubber < Rails::Html::TargetScrubber
  def initialize
    super
    self.tags = %w[a]
  end

  def allowed_node?(node)
    ...
  end

  def scrub_attribute?(name)
    ...
  end
end

但是当我 运行 scrub! 在我的规范中时,我看不到任何方法 allowed_node?scrub_attribute 被调用 documentation.

我的规格是这样的。它擦洗一切...,.

require 'rails_helper'

RSpec.describe TargetedHtmlScrubber do
  describe 'targeting html tags' do
    it 'ignores <a>' do
      fragment = html_fragment('<a href="http://example.test">Greg! the stop sign!!</a>')
      expect(
        fragment.scrub!(subject).to_s
      ).to eq '<a href="http://example.test">Greg! the stop sign!!</a>'
    end

    it 'targets <a href=mailto:>' do
      fragment = html_fragment('<a href="mailto:e@example.test">tis but a scratch</a>')
      expect(
        fragment.scrub!(subject).to_s
      ).to eq 'tis but a scratch'
    end
  end
end

我希望在 class.

中的两种方法之一中实现一些东西

好的,我解决了。要调用这些方法,您需要设置标签和属性数组:

  def initialize
    super
    self.tags = %w[a]
    self.attributes = %w[href]
  end

然后它将调用 allowed_node?(node)scrub_attribute?(name)。所以在这种情况下,我只需要标签。

删除 mailto: 个链接:

class TargetedHtmlScrubber < Rails::Html::TargetScrubber
  def initialize
    super
    self.tags = %w[a]
  end

  def allowed_node?(node)
    href(node) !~ /^mailto:/
  end

  private

  def href(node)
    node.try(:attributes)['href'].try(:value)
  end
end