Получите Rails 3 для очистки выходных данных по умолчанию вместо экранирования - PullRequest
3 голосов
/ 01 января 2012

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

Из-за этого я вынужден много раздражать:

<%= sanitize @post.body %>

Есть ли способ сделать это по умолчанию? Т.е., я хочу это:

<%= @post.body %>

эквивалентно:

<%= sanitize @post.body %>

вместо:

<%= h @post.body %>

как есть по умолчанию

Ответы [ 2 ]

2 голосов
/ 01 января 2012
class ActiveSupport::SafeBuffer
  def concat(value)
    super(ERB::Util.h(value))
  end
  alias << concat
  def dirty?
    false
  end
end

Получайте удовольствие от XSS'dНе использовать в производстве.Это полностью отключает защиту 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
1 голос
/ 02 января 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
...