Ruby 对gem(和丝瓜)进行消毒,在标记中引入冒号之前删除文本

Ruby 对gem(和丝瓜)进行消毒,在标记中引入冒号之前删除文本,ruby,security,jruby,nokogiri,sanitize,Ruby,Security,Jruby,Nokogiri,Sanitize,当我注意到像“6:30pm”这样的时间变为“30pm”时,我在试图清理一些html片段时,在丝瓜和消毒方面遇到了一些奇怪的行为 进行了一些调查,发现如下情况: Loofah.scrub_fragment("<span>asdfasdf 6:30 pm</span>", :strip).to_html #=> "<span>asdfasdf 30 pm</span>" Loofah.scrub_fragment("6:30 pm", :stri

当我注意到像“6:30pm”这样的时间变为“30pm”时,我在试图清理一些html片段时,在丝瓜和消毒方面遇到了一些奇怪的行为

进行了一些调查,发现如下情况:

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.scrub_片段(“asdfasdf 6:30 pm”,“strip”).to_html
#=>“asdfasdf下午30点”
丝瓜。擦洗碎片(“下午6:30”,条纹)。到
#=>“下午6:30”
丝瓜。擦洗碎片(“asdfasdf 6:;30 pm,:strip)。到html
#=>“asdfasdf下午6:30”
丝瓜。擦洗_片段(“酒吧:下午30点,:条纹)。到_html
#=>“酒吧:下午30点”
丝瓜。擦洗_片段(“酒吧:下午30点,:条纹)。到_html
#=>“下午30点”
丝瓜。擦洗_片段(“bar:asdfasdfadsf pm”,:strip)。到_html
#=>“栏:asdfasdfadsf pm”
所有丝瓜(:prune等)和Sanitize的变体都是这样,所以我假设这是它们共同的代码问题。在消毒之前,我需要做什么特殊的事情来避开代码中的冒号吗

编辑1
我意识到我忘了提到我正在使用jruby(jruby 1.7.0(1.9.3p203))。我正试图弄清楚nokogiri是否存在问题(这两个宝石的基础是什么?)

编辑2 通过进一步的挖掘,它看起来可能是Jruby上的Nokogiri中的一个问题(我使用的是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")] })]
  })
 doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
 => #(DocumentFragment:0x3fc4b102055c {
   name = "#document-fragment",
  children = [
    #(Element:0x3fc4b101fff8 {
      name = "span",
      children = [ #(Text "3:30pm")]
      })]
  })
doc=Nokogiri::HTML.fragment(“下午3:30”)
=>#(文档片段:0x5fbc){
name=“#文档片段”,
儿童=[
#(元素:0x5fc0{name=“span”,children=[#(文本“30pm”)]})
})
Ruby 1.9.3:预期结果

doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #(DocumentFragment:0x5fbc {
  name = "#document-fragment",
  children = [
    #(Element:0x5fc0 { name = "span", children = [ #(Text "30pm")] })]
  })
 doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
 => #(DocumentFragment:0x3fc4b102055c {
   name = "#document-fragment",
  children = [
    #(Element:0x3fc4b101fff8 {
      name = "span",
      children = [ #(Text "3:30pm")]
      })]
  })
doc=Nokogiri::HTML.fragment(“下午3:30”)
=>#(文档片段:0x3fc4b102055c{
name=“#文档片段”,
儿童=[
#(元件:0x3fc4b101fff8{
name=“span”,
儿童=[#(文本“下午3:30”)]
})]
})

我将继续挖掘,但欢迎任何建议。

我认为这是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">]>]> 
jruby-1.6.7.2:002>gem'nokogiri','=1.5.0'
=>正确
jruby-1.6.7.2:003>要求“nokogiri”
=>正确
jruby-1.6.7.2:004>doc=Nokogiri::HTML.fragment(“下午3:30”)
=> # 
在第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">]>]> 
jruby-1.6.7.2:002>gem'nokogiri','=1.5.1'
=>正确
jruby-1.6.7.2:003>要求“nokogiri”
=>正确
jruby-1.6.7.2:004>doc=Nokogiri::HTML.fragment(“下午3:30”)
=> # 
编辑: 需要注意的是,Nokogiri是围绕着令人敬畏的C库构建的,它在特性、速度和处理错误标记的能力方面都是无与伦比的。JRuby实现是尝试使用和来匹配它。我认为他们在使JRuby实现几乎完全匹配其MRI对应的功能(如果不是速度的话)方面做了出色的工作,掩盖了差异巨大的实现之间的差异。尽管如此,仍然不时出现一些边缘案例


我继续向Nokogiri提交了一份申请。

我用最新的丝瓜做了尝试,但我无法复制这个问题。我意识到我忘了提到我正在使用jruby(jruby 1.7.0(1.9.3p203))。我试图找出nokogiri中是否存在问题(这两个宝石的基础是什么?),我用jruby 1.6.7.2复制了这个问题。似乎有一个bug,它可能与过于热心的名称空间解析器有关。