Заставьте Rails 3 дезинфицировать вывод по умолчанию, а не экранировать его.

По умолчанию Rails 3 экранирует строки, которые вы выводите напрямую, например, <%= '<h1>' %> отображается как &lt;h1&gt;.

Из-за этого мне приходится много раздражающе делать это:

<%= sanitize @post.body %>

Можно ли как-то сделать это по умолчанию? То есть я хочу это:

<%= @post.body %>

быть эквивалентным:

<%= sanitize @post.body %>

вместо:

<%= h @post.body %>

как это по умолчанию


person Tom Lehman    schedule 01.01.2012    source источник
comment
См. stackoverflow.com /вопросы/6951062/   -  person Reactormonk    schedule 01.01.2012
comment
Этот вопрос касается полного отключения экранирования HTML. Я хочу заменить экранирование HTML на очистку HTML, поэтому мне это не помогает.   -  person Tom Lehman    schedule 01.01.2012


Ответы (2)


class ActiveSupport::SafeBuffer
  def concat(value)
    super(ERB::Util.h(value))
  end
  alias << concat
  def dirty?
    false
  end
end

Получайте удовольствие от XSS. Не использовать в производстве. Это полностью отключает защиту от XSS, и вы даже не можете явно сказать, что часть данных небезопасна. я лучше сделаю

class Post
  def body_with_raw
    body_without_raw.html_safe
  end
  alias_method_chain :body, :raw
end

или даже

class ActiveRecord::Base
  def self.html_safe(*attributes)
    attributes.each do |attribute|
      name = attribute + "with_raw"
      before = attribute + "without_raw"
      define_method name do
        before.html_safe
      end
      alias_method_chain attribute, "raw"
    end
  end
end

так что вы можете

class Post
  html_safe :body
end
person Reactormonk    schedule 01.01.2012
comment
Я не пытаюсь отключить экранирование; Я пытаюсь заменить его очисткой. Мой ответ имеет смысл / работает? - person Tom Lehman; 02.01.2012

Основываясь на ответе ТАСС, я чувствую, что это может сработать (но я не уверен):

class ActiveSupport::SafeBuffer
  def concat(value)
    if dirty? || value.html_safe?
      super(value)
    else
      # super(ERB::Util.h(value)) # this is what Rails does by default
      super(ActionController::Base.helpers.sanitize(value))
    end
  end
end
person Tom Lehman    schedule 01.01.2012