Ruby 如何修复***URI::InvalidComponentError异常:错误的密码组件?

Ruby 如何修复***URI::InvalidComponentError异常:错误的密码组件?,ruby,Ruby,我有以下代码: require 'uri' require 'net/http' require 'net/http/digest_auth' digest_auth = Net::HTTP::DigestAuth.new uri = URI.parse 'http://localhost:8000/' uri.user = 'username' uri.password = "%PsC\;=sQ}X4DWA%K" 我得到: *** URI::InvalidComponentError E

我有以下代码:

require 'uri'
require 'net/http'
require 'net/http/digest_auth'

digest_auth = Net::HTTP::DigestAuth.new

uri = URI.parse 'http://localhost:8000/'
uri.user = 'username'
uri.password = "%PsC\;=sQ}X4DWA%K"
我得到:

*** URI::InvalidComponentError Exception: bad password component

我试图逃脱一些角色,但运气不好。导致此异常的原因是什么?

在URI的userinfo部分(根据RFC 3986),您可以使用来描述
/[a-ZA-Z0-9.\u~-]/
基本允许字母表之外的字符。其工作原理是写入
%
字符,后跟两个十六进制字符,描述一个八位字节

由于您的密码包含后跟非十六进制字符的未转义百分比字符,因此它不遵循此编码方案,因此被Ruby拒绝

要在URL中使用当前密码,您必须在分配密码之前手动转义密码(特别是案例中的百分比字符):

password = '%PsC\;=sQ}X4DWA%K'
escaped_password = URI.escape(password)
# => "%25PsC%5C;=sQ%7DX4DWA%25K"

uri.password = escaped_password
请注意,类似的限制也适用于URI的其他部分,如路径和主机名。根据零件的不同,适用不同的转义规则。有关详细信息,请参阅相应的RFC


此外,当在代码中粘贴密码时(这通常是不安全的,通常在任何地方都避免,但在简单的一次性脚本中,为了更好地保护这些秘密),请确保转义Ruby解析器本身解释的任何特殊字符(例如反斜杠字符)。您可以在此处使用单引号字符串来避免大多数Ruby解析器问题。

您的密码似乎不符合URI验证正则表达式,但我不确定原因。谢谢Marek!是否有办法修补此验证?还值得一提的是,他们需要注意反斜杠,
%PsC\;=sQ}X4DWA%K“
%PsC\=sQ}X4DWA%K'
是不同的字符串。回答得很好!谢谢你,霍尔格!