URI.escape和CGI.escape有什么区别,我应该使用哪一个?
发布于 2010-05-14 13:27:34
有一些小的区别,但重要的一点是,URI.escape在Ruby1.9.2中是deprecated的……所以使用CGI::escape或ERB::Util.url_encode。
对于感兴趣的人来说,有很多关于on ruby-core的讨论,其中还提到了WEBrick::HTTPUtils.escape和WEBrick::HTTPUtils.escape_form。
发布于 2012-10-25 07:57:45
斧头和剑有什么区别,我应该用哪一把?嗯,这取决于你需要做什么。
URI.escape应该将一个字符串编码成所谓的"Percent-encoding“。
CGI::escape来自CGI规范,该规范描述了如何在web服务器和应用程序之间对数据进行编码/解码。
现在,假设您需要转义应用程序中的URI。这是一个更具体的用例。为此,Ruby社区多年来一直使用URI.escape。URI.escape的问题在于它无法处理RFC-3896规范。
URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog"URI.escape被标记为过时:
此外,当前的URI.encode是简单的gsub。但我认为它应该将URI拆分成组件,然后转义每个组件,最后将它们连接起来。
因此,当前的URI.encode被认为是有害的,已被弃用。这将被移除或彻底改变行为。
目前的替代方案是什么?正如我上面所说的,当前的URI.encode在规范级别上是错误的。所以我们不会提供确切的替代方案。替换方案将根据其用例而有所不同。
https://bugs.ruby-lang.org/issues/4167
不幸的是,文档中对此只字不提,唯一了解它的方法是检查源代码,或者在详细级别(-wW2)运行带有警告的脚本(或者使用一些google-fu)。
使用CGI::Escape作为查询参数的一些proposed,因为您无法转义整个URI:
CGI::escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http%3A%2F%2Fgoogle.com%2Ffoo%3Fbar%3Dat%23anchor%26title%3DMy+Blog+%26+Your+Blog"CGI::escape应该仅用于查询参数,但是结果将再次违反规范。实际上,最常见的用例是转义表单数据,例如在发送application/x-www-form-urlencoded POST请求时。
还提到了WEBrick::HTTPUtils.escape并没有太多的改进(同样,它只是一个简单的gsub,这是一个比URI.escape更糟糕的选择):
WEBrick::HTTPUtils.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog" 最接近规范的似乎是Addressable gem:
require 'addressable/uri'
Addressable::URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at#anchor&title=My%20Blog%20&%20Your%20Blog"请注意,与前面的所有选项不同,Addressable不会逃脱#,这是预期的行为。您希望将#哈希保留在URI路径中,而不是URI查询中。
剩下的唯一问题是我们没有正确地转义查询参数,这使我们得出结论:我们不应该对整个URI使用单一的方法,因为(到目前为止)还没有完美的解决方案。正如你所看到的,&并没有从“我的博客&你的博客”中逃脱。我们需要对查询参数使用不同的转义形式,用户可以在URL中放置具有特殊含义的不同字符。输入URL编码。对于每个“可疑”的查询值,都应该使用URL encode,类似于ERB::Util.url_encode的做法:
ERB::Util.url_encode "My Blod & Your Blog"
# => "My%20Blod%20%26%20Your%20Blog""这很酷,但我们已经需要了Addressable:
uri = Addressable::URI.parse("http://www.go.com/foo")
# => #<Addressable::URI:0x186feb0 URI:http://www.go.com/foo>
uri.query_values = {title: "My Blog & Your Blog"}
uri.normalize.to_s
# => "http://www.go.com/foo?title=My%20Blog%20%26%20Your%20Blog"结论:
URI.escape或类似的CGI::escape如果您需要使用URL,请使用Addressable,它提供发布于 2010-05-13 10:49:41
URI.escape接受第二个参数,让您标记哪些是不安全的。请参阅APIDock:
http://apidock.com/ruby/CGI/escape/class
http://apidock.com/ruby/URI/Escape/escape
https://stackoverflow.com/questions/2824126
复制相似问题