【问题标题】:Passing username and password in HTTP GET query parameters在 HTTP GET 查询参数中传递用户名和密码
【发布时间】:2016-04-24 06:26:28
【问题描述】:

我正在为我的应用程序构建一个 RESTful API,我想让它尽可能干净和透明。

我需要创建一个身份验证端点,构建它对我来说最有意义,以便用户可以通过以下方式进行身份验证:

GET https://example.com/
    auth?identity=<username_or_email>&password=<password>

正如我所说,在查询参数中使用 HTTP GET 方法传递用户身份验证数据对我来说似乎很干净。

但我想问一下它实际上有多安全。考虑到它将通过 SSL/TLS 进行加密,您认为像这样传输用户凭据是个好主意吗?

【问题讨论】:

    标签: rest http authentication query-parameters


    【解决方案1】:

    作为 显示名称 said,这两个变体基本上都是纯文本(即使使用 base64 编码)。因此,您必须使用 TLS 或其他保护措施,例如 HMAC

    但另一方面,查询字符串在服务器/客户端如何与 URL 一起工作方面不太安全。您可以阅读此herehere。简而言之,您应该担心以下问题

    • 网址存储在网络服务器日志中
    • 网址存储在浏览器历史记录中
    • URL 在 Referrer 标头中传递

    【讨论】:

    • 他正在构建一个 REST API;不是从最终用户的网络浏览器访问的东西,而是从另一台服务器调用的东西。所以没有浏览器历史记录,也没有推荐人。此外,构建 API 的人还应该能够调整服务器的日志设置,以便不记录敏感数据(例如 stackoverflow.com/questions/9467405/…)。无论如何,您应该考虑用户名和密码之外的这些事情,尤其是在当今的数据隐私法中。
    • @Arthur 关键是它留下了可以在具有上述安全风险的浏览器中打开的可能性,为什么要把门半开。
    • @user2219808 它不会离开门,因为 API 端没有风险。您无法保护用户免受不属于您的应用程序并且只会伤害自己的操作。这个域是无限的。
    • @Arthur API 中没有说“不要从浏览器调用”,谁知道它将来会如何使用,那就是敞开大门。 API 不应附带警告。
    【解决方案2】:

    好吧,我基本上将 base64 字符串传递给服务器。 我的用户名和密码都是base64转换然后传入Authorization Header

    Authorization : "Basic --Value"
    

    我发现这是将用户名和密码传递给服务器的最简洁的方式。

    另一方面,服务器有一个名为 passport 的模块。Passport 提供不同类型的授权和身份验证,例如 Basic、bearer、token 甚至您自己的自定义。

    出于上述目的,我使用基本模块。

    【讨论】:

    • 问题是“它实际上有多安全”。 Authorization 标头基本上是纯文本。只有使用 TLS 才能安全。
    【解决方案3】:

    从安全的角度来看,将凭据作为查询参数传递还是在 Authentication 标头中传递并不重要。两者基本上都是纯文本。所以你必须使用 TLS。

    从 REST 的角度来看,您的 URL 看起来像 RPC:您调用一个方法 auth,它接受两个参数 identitypassword。这个 URL 代表的 REST 资源是什么?如果您使用相同的参数发出第二个GET 请求会发生什么?有什么反应?

    【讨论】:

    • 感谢您的回复。谈到 REST 的观点,这种类型的请求应该返回身份验证数据,例如:{"authToken": "x7kkoal1vf4uk34ikzep"}。重复发出请求应该会使之前的所有authTokens 失效,并以类似的 JSON 格式数据进行响应。
    猜你喜欢
    • 2015-11-12
    • 2021-09-03
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2013-11-25
    相关资源
    最近更新 更多