Как лучше всего продезинфицировать поля в рубине на рельсах - PullRequest
8 голосов
/ 19 января 2012

В настоящее время у меня есть контроллер, собирающий некоторые HTML из TinyMCE на переднем конце. Если я возиться с firebug, то можно отправлять на экран теги сценариев и вводить предупреждающие сообщения и т. Д.

edit: в настоящее время я исправляю это в модели с помощью помощника sanitize:

require 'action_view'

class NotesController < AuthApplicationController

  include ActionView::Helpers::SanitizeHelper
...
  def update
    params[:note][:content] = sanitize(params[:note][:content],
        :tags => %w(a object p param h1 h2 h3 h4 h5 h6 br hr ul li img),
        :attributes => %w(href name src type value width height data) );

    @note.update_attributes(params[:note])

Это выглядит грязно в контроллере. Есть ли способ лучше? То есть каким-то образом интегрировать этот ActiveRecord, чтобы я мог легко указать, чтобы сделать это для этого и других полей перед сохранением аналогично проверке?

Спасибо за любые предложения.

редактирование:

Достигнуть некоторого прогресса здесь.

Под моим / Libs у меня есть

module SanitizeUtilities
  def sanitize_tiny_mce(field)
    ActionController::Base.helpers.sanitize(field,
      :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img),
      :attributes => %w(href name src type value width height data) );
  end
end

Тогда в моих моделях код сворачивается до

class MyModel < ActiveRecord::Base
  include ::SanitizeUtilities
...
  before_save :sanitize_content
...
  def sanitize_content
    self.content = sanitize_tiny_mce(self.content)
  end

end

Это, кажется, удаляет нежелательную разметку без лишней суеты.

Довольно плохо знаком с рельсами, так нервничаю, что могу что-то делать не так. Кто-нибудь может увидеть здесь потенциальные недостатки?

Еще раз спасибо

Ответы [ 2 ]

12 голосов
/ 19 января 2012

Я думаю, что вы делаете это хорошо, но если вы используете before_save, то вы все равно можете потерпеть неудачу проверки (так как before_save вызывается после проверки). Кроме того, вам не обязательно помещать его в собственный модуль, это может быть просто закрытый метод в вашем классе.

Что-то вроде:

class MyModel < ActiveRecord::Base

  before_validation :sanitize_content, :on => :create

  private
    def sanitize_content
      self.content = sanitize_tiny_mce(self.content)
    end
    def sanitize_tiny_mce(field)
      ActionController::Base.helpers.sanitize(field,
        :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img),
        :attributes => %w(href name src type value width height data) );
    end

end
1 голос
/ 03 июня 2015

На этот вопрос, похоже, ответили, но для любого, кто придет к этому, вы можете рассмотреть возможность использования пользовательских мутаторов, чтобы сделать его более прозрачным Что-то вроде:

class MyModel < ActiveRecord::Base
  def content= content
    write_attribute(:content, sanitize_tiny_mce(content)
  end

  private

  def sanitize_tiny_mce content
    ActionController::Base.helpers.sanitize(field,
        :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img),
        :attributes => %w(href name src type value width height data)
    );
  end
end

Это обеспечит очистку содержимого при каждом изменении.

...