我目前有一个控制器从前端的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
这似乎在没有太多麻烦的情况下删除了不需要的标记。
相当紧张的轨道,我可能会做错事。任何人都可以看到潜在的缺点吗?
再次感谢
答案 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
这将确保在内容更改时对内容进行清理。