【问题标题】:Allowing only Youtube/Vimeo iframes in markdownmarkdown 中仅允许 Youtube/Vimeo iframe
【发布时间】:2011-02-10 04:01:10
【问题描述】:
我正在尝试允许用户在我们正在开发的 Rails3 应用程序的帖子中嵌入 youtube 或 vimeo 视频,并且现在两者都使用 iframe。 sanitize helper 似乎只允许您在全球范围内将标签列入白名单 - 此外,youtube 的 iframe 有一个一致的类,但 vimeo 没有。
您将如何将这两个网址中的嵌入列入白名单,但不允许它们?
【问题讨论】:
标签:
ruby-on-rails
iframe
youtube
xss
markdown
【解决方案1】:
我不确定如何使用 sanitize 方法将标签列入白名单,但您始终可以通过另一种方法进行过滤,并使用正则表达式专门检查 src,并且仅在它与 youtube 匹配时才写出来。
def santize_iframe(text)
text.gsub(/\<iframe( src="(.+?)")?\>(.+?)\<\/iframe\>/m) do
if $2.include? "youtube.com"
... logic to display video
else
""
end
end
end
【解决方案2】:
http://github.com/rgrove/sanitize/
这是一个很棒的项目,还提供了一个 youtube 嵌入示例。 Youtube 最近更改为 iframe,我正在向他们提交一个“过滤器”示例:
T_YOUTUBE_IFRAME = lambda do |env|
node = env[:node]
return nil unless (env[:node_name] == 'iframe')
if node['src'] =~ /^http:\/\/www.youtube.com\/embed\//
node['src'] += "?test"
return {:node_whitelist => [node]}
end
end