2

我正在考虑为用户创建一个 API 来更改他们的密码。
用户表有一些字段,如名字、姓氏等。对于这个 API,我应该像下面这样使用 PATCH 吗?

补丁 /users/{userId}

{
  "password": "new_password"
}

或者,我应该使用 PUT 吗?

PUT /users/{userId}/{password}

这对于安全性来说似乎很糟糕。

顺便说一句,我不希望用户更改其他字段的值。我认为 PATCH 必须让用户能够更改任何字段的值。这就是我想知道的原因。

4

2 回答 2

4

路径信息和查询字符串将使用 HTTPS/TLS 加密 - 用于该 HTTP 会话。但是,将密码放在那里仍然不是一个好主意,因为它们很可能在浏览器历史记录和/或服务器日志中

PUT /users/{userId}/{password}

...这将保留在 Web 服务器日志中。作为安全开发人员,我们甚至不应该将密码存储在可能被盗的数据库中(我们要存储密码的哈希值和盐值)。在 Web 服务器日志中使用明文密码更糟糕。

在 TLS 会话中将其发送到正文中是最好的。

PATCH /users/{userId}
{
  "password": "new_password"
}

...然后对其进行哈希+加盐并将其存储。登录时,您执行相同的过程(单向哈希匹配)。

请参阅:HTTPS、URL 路径和查询字符串

于 2015-06-08T18:11:36.457 回答
1

从安全 POV 来看,没有区别。攻击可以读取查询字符串和请求正文。您应该使用 TLS。

这两个请求对我来说都很好。它们的 URL 和它们的主体是良好的、可靠的 REST。

如果您不想接受对所有字段的更改,请在您的服务器中编写逻辑来拒绝尝试更改用户不会更改的字段的请求。但这不是PUTvs.PATCH或的问题POST

于 2015-05-20T16:07:57.537 回答