首页 > 解决方案 > 如何修复 *** URI::InvalidComponentError 异常:密码组件错误?

问题描述

我有以下代码:

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

我尝试在没有运气的情况下转义一些字符。是什么导致了这个异常?

标签: ruby

解决方案


在 URI 的 userinfo 部分(根据 RFC 3986),您可以使用百分比编码来描述/[a-ZA-Z0-9._~-]/. 这通过写一个%字符后跟两个十六进制字符来描述一个八位字节。

由于您的密码包含后跟非十六进制字符的未转义百分比字符,因此它不遵循此编码方案,因此被 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 解析器问题。


推荐阅读