在HTTP GET查询参数中传递用户名和密码

12

我正在为我的应用程序构建一个RESTful API,我希望尽可能使其干净透明。

我需要创建一个身份验证终点,对我来说最合理的方式是构建使用户可以按以下方式进行身份验证:

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

就像我所说的一样,在查询参数中使用HTTP GET方法传递用户身份验证数据,这种方式对我来说似乎非常干净简单。

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

3个回答

13

正如显示名称所说,这两个变量基本上都是纯文本(甚至使用Base64编码)。因此,您必须使用TLS或其他保护,如HMAC

但从另一方面来看,在服务器/客户端通常处理URL方面,查询字符串的安全性较低。您可以在这里这里了解更多信息。简而言之,您应该关注以下内容:

  • URL存储在Web服务器日志中
  • URL存储在浏览器历史记录中
  • URL通过Referrer headers传递

他正在构建一个REST API;这不是从终端用户的Web浏览器访问的东西,而是从另一个服务器调用的。因此,没有浏览器历史记录,也没有引荐者。 此外,构建API的人还应该能够调整服务器的日志设置,以便不记录敏感数据(例如https://dev59.com/pmDVa4cB1Zd3GeqPhur6#9473943)。无论如何,您都应该考虑这些问题,特别是在今天的数据隐私法律下,不仅限于用户名和密码。 - Arthur
3
重点在于它让在浏览器中打开存在前述安全风险的可能性,为什么要留下这个漏洞。 - user2219808
@user2219808,它不会留下后门,因为API端没有风险。您无法保护用户免受不属于您的应用程序且只会损害他们自己的行为。该领域是无限的。 - Arthur
2
@Arthur API中没有说“不要从浏览器中调用”,谁知道将来它将如何使用,这就留下了可乘之机。API不应该带有任何警告。 - user2219808

2

我基本上将base64字符串传递给服务器。 我的用户名和密码被转换为base64,然后在Authorization头中传递。

Authorization : "Basic --Value"

我认为这是向服务器传递用户名和密码最干净的方法。
在另一端,服务器有一个名为passport的模块。Passport提供了不同类型的授权和身份验证,如基本的、承载体、令牌或您自己的自定义。
为了实现上述目的,我使用基本模块。

1
问题是“它实际上有多安全”。Authorization头基本上是明文。只有在使用TLS时才能确保安全。 - user5547025

-1

从安全角度来看,无论您将凭据作为查询参数还是在Authentication头中传递,都没有关系。两者都是明文。因此,您必须使用TLS。

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


感谢您的回应。从REST的角度来看,这种类型的请求应该返回身份验证数据,例如:{"authToken": "x7kkoal1vf4uk34ikzep"}。重复发出请求可能会使先前的所有“authToken”失效,并响应类似的JSON格式数据。 - Hexdigit _

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