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

他们为什么改变它?

这是在此提交中完成的,因为(根据错误 #5485OWASP 建议在将单引号插入 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 回答