url - 当 URL 中提供凭据时,为什么浏览器不发送 Authentication header ?

标签 url authentication curl browser basic-authentication

我想让用户有机会通过在 URL 中提供用户名和密码来进行每个请求的身份验证。由于请求是安全的,我对此没有任何顾虑。

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

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

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

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

这跟安全有关系吗?

Firefox 是唯一一个声称:

You are about to log in to the site "localhost" with the username "user", but the website does not require authentication. This may be an attempt to trick you.

Is "localhost" the site you want to visit?



但是当通过单击是确认此请求时,它会发送没有凭据的请求。至少,我在 firebug 的网络选项卡中看不到它们……而且响应也是 401。

最佳答案

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

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

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

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

我希望这可以澄清一些事情。

关于url - 当 URL 中提供凭据时,为什么浏览器不发送 Authentication header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21135104/

相关文章:

php - 获取远程数据 - PHP 还是 JavaScript?

php - 在 HTTP cURL POST 中发送具有相同名称/键的多个值

regex - 在 Cocoa 应用程序中验证用户输入的 URL 的最佳方法是什么?

java - Tomcat - 了解 CredentialHandler

PHP多部分表单数据PUT请求?

sql-server - 如何从“连接到服务器”对话框中删除缓存的服务器名称?

javascript - 从 node.js 使用 SharePoint 2013 进行身份验证

c# - 在不更改 url 的情况下显示自定义页面

javascript 避免重复的 URL

javascript - 在不重新加载现有页面的情况下更改浏览器地址栏中的 URL