我最近将我的 Ruby 1.9.3 升级到 2.0.0 并且有一个惊喜;CGI::escapeHTML 现在转义单引号,意思是:
CGI::escapeHTML("'")
=> "'"
最奇怪的是,当转到 escapeHTML 的定义时,一切似乎都很好,并且复制该方法的定义会给出正确的结果(它不会转义单引号)
有人知道吗?
谢谢,
我最近将我的 Ruby 1.9.3 升级到 2.0.0 并且有一个惊喜;CGI::escapeHTML 现在转义单引号,意思是:
CGI::escapeHTML("'")
=> "'"
最奇怪的是,当转到 escapeHTML 的定义时,一切似乎都很好,并且复制该方法的定义会给出正确的结果(它不会转义单引号)
有人知道吗?
谢谢,
实际上,它执行 2.0 源代码中定义的操作。但你是对的,实现从 1.9.3 更改为 2.0。
def CGI::escapeHTML(string)
string.gsub(/[&\"<>]/, TABLE_FOR_ESCAPE_HTML__)
end
def CGI::escapeHTML(string)
string.gsub(/['&\"<>]/, TABLE_FOR_ESCAPE_HTML__)
end
他们为什么改变它?
这是在此提交中完成的,因为(根据错误 #5485)OWASP 建议在将单引号插入 HTML 之前对其进行转义。所以这是一个安全问题。
我不想要新的行为。我使用 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
找到一个您知道不会出现在您的输入中的字符!