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のコード見に行くと
# The set of special characters and their escaped values TABLE_FOR_ESCAPE_HTML__ = { "'" => ''', '&' => '&', '"' => '"', '<' => '<', '>' => '>', } # Escape special characters in HTML, namely &\"<> # CGI::escapeHTML('Usage: foo "bar" <baz>') # # => "Usage: foo "bar" <baz>" 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) "'" => ''', 0bbda397 (xibbar 2008-09-09 13:09:56 +0000 27) '&' => '&', 0bbda397 (xibbar 2008-09-09 13:09:56 +0000 28) '"' => '"', 0bbda397 (xibbar 2008-09-09 13:09:56 +0000 29) '<' => '<', 0bbda397 (xibbar 2008-09-09 13:09:56 +0000 30) '>' => '>', 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 "bar" <baz>" 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は使わないのかな。