Ruby - CGI.escapeHTMLがシングルクオートも置換していた

CGI.escapeHTMLをつかってエスケープしてたんだけどなぜかシングルクオート(')も置換されてておかしいなぁと思って調べた。



singleton method CGI.escapeHTML (Ruby 1.9.3)
ここみたり、そのほか情報でもシングルクオートは対象外になっている。

ruby-2.0.0-p247を使ってたので試しにruby-1.9.3-p286に切り替えてやってみると確かにシングルクオートはエスケープされずにいる。
バージョン2で変更があったのか。

GitHubのコード見に行くと

ruby/lib/cgi/util.rb

# The set of special characters and their escaped values
TABLE_FOR_ESCAPE_HTML__ = {
  "'" => ''',
  '&' => '&',
  '"' => '"',
  '<' => '&lt;',
  '>' => '&gt;',
}
# Escape special characters in HTML, namely &\"<>
# CGI::escapeHTML('Usage: foo "bar" <baz>')
# # => "Usage: foo &quot;bar&quot; &lt;baz&gt;"
def escapeHTML(string)
  string.gsub(/['&\"<>]/, TABLE_FOR_ESCAPE_HTML__)
end

となっていて確かにシングルクオートが対象に含まれている。

気になるのでcloneして調べてみる

$git blame -L 25,38 ruby/lib/cgi/util.rb

0bbda397 (xibbar 2008-09-09 13:09:56 +0000 25)   TABLE_FOR_ESCAPE_HTML__ = {
bbb6b5e8 (naruse 2012-08-21 22:30:47 +0000 26)     "'" => '&#39;',
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 27)     '&' => '&amp;',
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 28)     '"' => '&quot;',
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 29)     '<' => '&lt;',
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 30)     '>' => '&gt;',
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 31)   }
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 32) 
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 33)   # Escape special characters in HTML, namely &\"<>
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 34)   #   CGI::escapeHTML('Usage: foo "bar" <baz>')
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 35)   #      # => "Usage: foo &quot;bar&quot; &lt;baz&gt;"
b35529bb (xibbar 2013-05-03 11:23:23 +0000 36)   def escapeHTML(string)
c47cca2f (xibbar 2012-07-17 23:04:46 +0000 37)     string.gsub(/['&\"<>]/, TABLE_FOR_ESCAPE_HTML__)
0bbda397 (xibbar 2008-09-09 13:09:56 +0000 38)   end

2012年……結構前だね。
実はこのコミットは変更してるだけで、行を追加してるのは
Wed Jul 18 07:59:29 2012 Takeyuki FUJIOKA <xibbar@ruby-lang.org> · ruby/ruby@c47cca2 · GitHub
ここ
タグを見る限りv2_0_0_0から追加されてるっぽい?

この変更、アナウンスされているようには思えないけどみなさんCGI::escapeHTMLは使わないのかな。