在基本身份验证URL中转义用户名字符

67

在使用基本的HTTP身份验证时,用户名可以通过URL传递,例如:

http://david@foo.com/path/

但是现在假设用户名是电子邮件地址,例如david@company.com。 这样做显然会产生歧义:

http://david@company.com@foo.com/path/

有没有一种方法可以转义用户名中的@字符?我尝试了标准的URL编码:

http://david%40company.com@foo.com/path/

但那并没有起作用。


你不能在URL中使用@符号。或者我理解错了吗? - Hnatt
3
我知道我来晚了,但你是否错过了密码部分?标准语法应为http(s)://user:pass@host。因此,在您的情况下,应为http(s)://david%40company.com:Y0ur%24up3r%243cur3P%40%24%24w0rd@foo.com。请注意,"@"符号需要进行URL编码。 - FatalMerlin
1
@FatalMerlin,你可以只使用用户名来获取两种口味,也可以同时使用用户名和密码。虽然我认为这与转义问题无关。 - David Ebbo
1个回答

92
根据RFC 3986第3.2.1节的规定,需要进行百分号编码:
  userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )

所以看起来像是

http://david%40company.com@foo.com/path/

没错。你是在哪里尝试读取它?也许你需要手动解码这个值?


我有自己的服务器端代码来处理凭据。我需要调试它并查看当我以这种方式转义时确切接收到了什么。我会跟进的! - David Ebbo
2
客户端似乎无法很好地处理该语法。例如,IE9在发送任何请求之前就会阻止它,并显示错误“Windows无法找到'http://david%40company.com@foo.com/path/'。请检查拼写并重试。”这让我相信,尽管从RFC中看起来支持该语法,但实际上并不支持。 - David Ebbo
1
有趣。我们尝试使用Drupal的drupal_http_request获取URL时使用了完全相同的语法,但它并没有让用户登录。(我们已经解决了这个问题,但出于学术兴趣,我还是来搜索一下。) - Hakanai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接