Sanitize gem(和Loofah)在标记内部冒号之前删除文本

时间:2012-11-16 03:09:17

标签: ruby security jruby nokogiri sanitize

当我注意到“下午6点30分”等时间变成“晚上30点”时,尝试清理一些html片段时,与Loofah和Sanitize一起出现了一些奇怪的行为。

做了一些调查并发现了以下内容:

Loofah.scrub_fragment("<span>asdfasdf 6:30 pm</span>", :strip).to_html
#=> "<span>asdfasdf 30 pm</span>"
Loofah.scrub_fragment("6:30 pm", :strip).to_html
#=> "6:30 pm"
Loofah.scrub_fragment("<foo>asdfasdf 6&#58;30 pm</foo>", :strip).to_html
#=> "asdfasdf 6:30 pm"
Loofah.scrub_fragment("bar:30 pm", :strip).to_html
#=> "bar:30 pm"
Loofah.scrub_fragment("<span>bar:30 pm</span>", :strip).to_html
#=> "<span>30 pm</span>"
Loofah.scrub_fragment("<span>bar: asdfasdfadsf pm</span>", :strip).to_html
#=> "<span>bar: asdfasdfadsf pm</span>"

Loofah(:prune等)和Sanitize的所有变体就是这种情况,所以我假设它们都是两个共同的代码问题。在消毒之前,我需要做些什么来逃避代码中的冒号?

修改1 我意识到我忽略了我正在使用jruby(jruby 1.7.0(1.9.3p203))。我想弄清楚是否可能在nokogiri中存在问题(这是这两个宝石的基础?)

编辑2 随着一些进一步的挖掘,看起来可能是Nokogiri在Jruby上的一个问题(我在nokagiri的1.5.5版本,这是值得的)。我在Jruby和Ruby 1.9.3上检查了nokogiri的片段解析器:

Jruby 1.7.0:意外结果

doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #(DocumentFragment:0x5fbc {
  name = "#document-fragment",
  children = [
    #(Element:0x5fc0 { name = "span", children = [ #(Text "30pm")] })]
  })

Ruby 1.9.3:预期结果

 doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
 => #(DocumentFragment:0x3fc4b102055c {
   name = "#document-fragment",
  children = [
    #(Element:0x3fc4b101fff8 {
      name = "span",
      children = [ #(Text "3:30pm")]
      })]
  })

会尽力继续挖掘但欢迎任何建议。

1 个答案:

答案 0 :(得分:2)

我认为这是Nokogiri的回归错误。我能够复制你的问题,并尝试了几个版本的Nokogiri。

它在1.5.0中正常工作:

jruby-1.6.7.2 :002 > gem 'nokogiri', '=1.5.0'
 => true 
jruby-1.6.7.2 :003 > require 'nokogiri'
 => true 
jruby-1.6.7.2 :004 > doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
 => #<Nokogiri::HTML::DocumentFragment:0x7d4 name="#document-fragment" children=[#<Nokogiri::XML::Element:0x7d2 name="span" children=[#<Nokogiri::XML::Text:0x7d0 "3:30pm">]>]> 

在1.5.1中失败:

jruby-1.6.7.2 :002 > gem 'nokogiri', '=1.5.1'
 => true 
jruby-1.6.7.2 :003 > require 'nokogiri'
 => true 
jruby-1.6.7.2 :004 > doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
 => #<Nokogiri::HTML::DocumentFragment:0x7d4 name="#document-fragment" children=[#<Nokogiri::XML::Element:0x7d2 name="span" children=[#<Nokogiri::XML::Text:0x7d0 "30pm">]>]> 

修改: 值得注意的是,Nokogiri是围绕着令人敬畏的libxml2 C库构建的,它在功能,速度和处理格式错误标记的能力方面确实无与伦比。 JRuby实现尝试使用XercesNekoHTML来匹配它。我认为他们做得非常出色,使得JRuby的实现几乎完全匹配其MRI对应的功能(如果不是速度),并且描述了截然不同的实现之间的差异。话虽如此,仍然会出现边缘情况。

我继续向Nokogiri提出bug report