当 URL 中提供凭据时,为啥浏览器不发送 Authentication 标头?

Posted

技术标签:

【中文标题】当 URL 中提供凭据时,为啥浏览器不发送 Authentication 标头?【英文标题】:Why do browsers not send the Authentication header when the credentials are provided in the URL?当 URL 中提供凭据时,为什么浏览器不发送 Authentication 标头? 【发布时间】:2014-02-03 18:50:38 【问题描述】:

我想通过在 URL 中提供用户名和密码,让用户有机会根据请求进行身份验证。由于请求是安全的,我对此并不担心。

我尝试使用常用浏览器(Firefox、Chrome、Safari 和 Opera 是我测试的浏览器)调用请求 http://user:password@localhost/,但我得到了 401 响应。当我尝试相同的 URI 时,但这次将凭据作为 HTTP 标头提供,例如 Authentication: Basic dXNlcjpwYXNzd29yZA==,它起作用了。

在搜索时,我找到了另一个问题的答案:https://serverfault.com/questions/371907/can-you-pass-user-pass-for-http-basic-authentication-in-url-parameters#answer-371918

此答案声称,浏览器应根据 URL 中提供的凭据自动生成 Authentication 标头。

使用 curl 在命令行上尝试它时,它可以工作。那么,为什么它在浏览器中不起作用?

这与安全有关吗?

Firefox 是唯一一个声称:

您即将使用用户名“user”登录站点“localhost”,但该网站不需要身份验证。这可能是 企图欺骗你。

“localhost”是您要访问的站点吗?

但是,当通过单击是确认此请求时,它会在没有凭据的情况下发送请求。至少,我在 firebug 的 network-tab 中看不到它们……而且响应也是 401。

【问题讨论】:

【参考方案1】:

是的,它关乎安全,关乎选择。

首先,当您使用 curl 执行上述操作时,curl 默认并假定您想要Basic authentication(除非您指定其他内容,并且是的,该名称确实是“基本”)。

如果您要求 curl 使用单一方法进行 HTTP 身份验证并且您提供了凭据,那么它会决定它可以立即发送身份验证标头。如果您改为要求它执行几种身份验证类型(libcurl 底层库可以执行此操作),那么它不会在第一个请求中发送任何身份验证标头,而是发送非身份验证标头请求查看服务器需要哪些方法 - 就像浏览器一样。

在浏览器的情况下,它们总是采用多重身份验证方案方法,因此它们不会假定您需要基本身份验证,并且这样做,它们不会盲目地通过网络发送您的用户+密码。只有当服务器实际上只需要 Basic(或者浏览器不支持服务器支持的任何其他身份验证类型)时,他们才会这样做。

我希望这能澄清一些事情。

【讨论】:

好吧……听起来很合理。这里有一个视图链接,可以帮助我理解其余部分并使结构更加清晰:httpwatch.com/httpgallery/authentication(介绍 - 它是如何工作的 - 一步一步)***.com/questions/3576197/…(如何提供多个领域) 对我来说问题是,服务器没有在响应中发送 WWW-Authenticate 标头。因此,浏览器只是忽略了标头,Firefox 警告我,此请求不需要身份验证。

以上是关于当 URL 中提供凭据时,为啥浏览器不发送 Authentication 标头?的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework - 为啥在尝试使用不正确的凭据登录用户时返回 200 状态码?

春季安全 |为啥当它们有效时我会得到错误的凭据?

用户代理(浏览器)不会通过https提示输入凭据

为啥当我返回上一页时,我的 url 不正确(iOS 下的 Chrome,浏览器返回)

为啥禁止没有凭据的 CORS?

CORS 请求 - 为啥不发送 cookie?