首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >URI.escape和CGI.escape有什么不同?

URI.escape和CGI.escape有什么不同?
EN

Stack Overflow用户
提问于 2010-05-13 10:32:53
回答 7查看 94.7K关注 0票数 160

URI.escapeCGI.escape有什么区别,我应该使用哪一个?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-05-14 13:27:34

有一些小的区别,但重要的一点是,URI.escape在Ruby1.9.2中是deprecated的……所以使用CGI::escapeERB::Util.url_encode

对于感兴趣的人来说,有很多关于on ruby-core的讨论,其中还提到了WEBrick::HTTPUtils.escapeWEBrick::HTTPUtils.escape_form

票数 130
EN

Stack Overflow用户

发布于 2012-10-25 07:57:45

斧头和剑有什么区别,我应该用哪一把?嗯,这取决于你需要做什么。

URI.escape应该将一个字符串编码成所谓的"Percent-encoding“。

CGI::escape来自CGI规范,该规范描述了如何在web服务器和应用程序之间对数据进行编码/解码。

现在,假设您需要转义应用程序中的URI。这是一个更具体的用例。为此,Ruby社区多年来一直使用URI.escapeURI.escape的问题在于它无法处理RFC-3896规范。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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更糟糕的选择):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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的做法:

代码语言:javascript
复制
ERB::Util.url_encode "My Blod & Your Blog"
# => "My%20Blod%20%26%20Your%20Blog""

这很酷,但我们已经需要了Addressable:

代码语言:javascript
复制
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,它提供
  • 编码、表单编码和标准化URL。
  • 如果是Rails项目,请查看Rails
票数 251
EN

Stack Overflow用户

发布于 2010-05-13 10:49:41

URI.escape接受第二个参数,让您标记哪些是不安全的。请参阅APIDock:

http://apidock.com/ruby/CGI/escape/class

http://apidock.com/ruby/URI/Escape/escape

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2824126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档