7

最近、Ruby 1.9.3 を 2.0.0 にアップグレードしたところ、驚きました。CGI::escapeHTML は一重引用符をエスケープするようになりました。これは次のことを意味します:

CGI::escapeHTML("'")
=> "'"

最も奇妙なことは、escapeHTML の定義に行くと、すべて問題ないように見え、メソッドの定義をコピーすると正しい結果が得られることです (一重引用符はエスケープされません)。

誰もこれについて手がかりを持っていますか?

ありがとう、

4

2 に答える 2

9

実際には、2.0 ソースで定義されていることを行います。しかし、その通りです。実装が 1.9.3 から 2.0 に変更されました。

1.9.3 ソース:

def CGI::escapeHTML(string)
  string.gsub(/[&\"<>]/, TABLE_FOR_ESCAPE_HTML__)
end

2.0 ソース:

def CGI::escapeHTML(string)
  string.gsub(/['&\"<>]/, TABLE_FOR_ESCAPE_HTML__)
end

なぜ彼らはそれを変えたのですか?

(バグ #5485によると) OWASP はHTML に挿入する前に一重引用符をエスケープすることを推奨しているため、このコミットで行われました。だから、それはセキュリティの問題です。

于 2013-09-11T08:17:49.943 に答える
0

私は新しい振る舞いが欲しくありませんでした。私が CGI::Escape を使用していたということはおそらく間違っていますが、その理由を突き止めたり、やり直したりする時間がありませんでした。私はただ古い振る舞いを取り戻したかっただけです。

CGI::Escape: を呼び出すときに ' 文字を削除することになりました。

 def escapeHTML(title)
  char = "\u00A9"
  target_title = title.gsub("'", char)
  target_title = CGI.escapeHTML(target_title)
  target_title = target_title.gsub(char, "'")
  return target_title
 end

入力に表示されないことがわかっている文字を見つけてください!

于 2015-10-22T14:18:10.780 に答える