【问题标题】:Sanitize gem (and Loofah) removing text before leading colon inside tags清理 gem(和丝瓜络)在标签内的前导冒号之前删除文本
【发布时间】:2013-01-15 15:27:46
【问题描述】:

当我注意到像“下午 6 点 30 分”这样的时间变成了“下午 30 点”时,我在尝试清理一些 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 (: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")] })]
  })

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")]
      })]
  })

会继续挖掘,但欢迎提出任何建议。

【问题讨论】:

  • 我用最新的丝瓜试过了,但我无法复制问题。
  • 我意识到我没有提到我正在使用 jruby ( jruby 1.7.0 (1.9.3p203) )。我正在尝试弄清楚 nokogiri 是否可能存在问题(这两个宝石的基础是什么?)
  • 我用 jruby 1.6.7.2 复制了这个问题。似乎有一个错误,并且看起来它可能与过度热心的命名空间解析器有关。

标签: ruby security jruby nokogiri sanitize


【解决方案1】:

我认为这是 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

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多