ruby - 如何修复 *** 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
我尝试在没有运气的情况下转义一些字符。是什么导致了这个异常?
解决方案
在 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 解析器问题。
推荐阅读
- python - 使用 re.compile(flags=),运算符如何 | 和 + 不同(如果有的话)?
- android - 如何在 Android 11 上获取给定树 URI 的文件路径?
- mysql - 如何解码密码
- java - 将 HashMap 的 ArrayList 转换为 GSON JsonArray
- java - ArrayList 中的 JTextField 仅显示最后一个
- sql-server - CDC 从 SQL Server 到 Oracle
- python - 如果在某个范围之间,则根据日期合并两个 df 并对值进行平均
- c# - 将 ac# tcp system.net 服务器部署到 AWS EC2
- python - 从同一页面上的多个表中抓取信息
- javascript - 从 HTML 创建 Django 模型对象