如何最好地清理铁轨上的红宝石中的田地

时间:2012-01-19 09:30:10

标签: ruby-on-rails ruby-on-rails-3 activerecord tinymce sanitization

我目前有一个控制器从前端的TinyMCE捕获一些html。如果我修改了firebug,就可以在屏幕上提交脚本标签并注入警报消息等。

编辑:目前我正在使用sanitize helper修复此模型:

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 个答案:

答案 0 :(得分:12)

我认为你这样做的方式很好,但是如果你使用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 :(得分:1)

这个问题似乎得到了回答,但对于任何人来说,你可能会考虑使用自定义变异器来使其更加透明。类似的东西:

Value                ReversedValue
-------------------- --------------------
Test123Hello         Test321Hello
Tt143 Hello          Tt341 Hello
12Hll                21Hll
Tt123H3451end        Tt321H1543end

NULL                 NULL

这将确保在内容更改时对内容进行清理。