PUT 或 PATCH 仅更改一个字段值
PUT or PATCH to change only one field value
我正在考虑创建一个 API 供用户更改密码。
用户 table 有一些字段,如名字、姓氏等。
对于这个 API,我应该像下面那样使用 PATCH 吗?
补丁/用户/{userId}
{
"password": "new_password"
}
或者,我应该使用 PUT 吗?
PUT /users/{userId}/{password}
这对安全来说似乎很糟糕。
顺便说一句,我不希望用户更改其他字段的值。我认为 PATCH 必须让用户能够更改任何字段的值。这就是我想知道的原因。
从安全视角来看,没有区别。攻击可以读取查询字符串和请求 body。你应该使用 TLS。
这两个请求对我来说都很好。他们的 URL 和他们的身体很好,可靠的 REST。
如果您不想接受对所有字段的更改,请在您的服务器中编写逻辑以拒绝试图更改用户不能更改的字段的请求。但这不是 PUT
与 PATCH
或 POST
的问题。
对于该 HTTP 会话,路径信息和查询字符串将使用 HTTPS/TLS 加密。但是,将密码放在那里仍然是个坏主意,因为它们很可能在浏览器历史记录 and/or 服务器日志中
PUT /users/{userId}/{password}
... 将保留在网络服务器日志中。作为安全开发人员,我们甚至不应该将密码存储在可能被盗的数据库中(我们将存储密码的散列 + 盐)。在 Web 服务器日志中使用明文密码更糟糕。
在 TLS 会话的正文中发送它是最好的。
PATCH /users/{userId}
{
"password": "new_password"
}
... 然后对其进行哈希处理和加盐并存储。登录,您执行相同的过程(单向哈希匹配)。
看到这个:
我正在考虑创建一个 API 供用户更改密码。
用户 table 有一些字段,如名字、姓氏等。
对于这个 API,我应该像下面那样使用 PATCH 吗?
补丁/用户/{userId}
{
"password": "new_password"
}
或者,我应该使用 PUT 吗?
PUT /users/{userId}/{password}
这对安全来说似乎很糟糕。
顺便说一句,我不希望用户更改其他字段的值。我认为 PATCH 必须让用户能够更改任何字段的值。这就是我想知道的原因。
从安全视角来看,没有区别。攻击可以读取查询字符串和请求 body。你应该使用 TLS。
这两个请求对我来说都很好。他们的 URL 和他们的身体很好,可靠的 REST。
如果您不想接受对所有字段的更改,请在您的服务器中编写逻辑以拒绝试图更改用户不能更改的字段的请求。但这不是 PUT
与 PATCH
或 POST
的问题。
对于该 HTTP 会话,路径信息和查询字符串将使用 HTTPS/TLS 加密。但是,将密码放在那里仍然是个坏主意,因为它们很可能在浏览器历史记录 and/or 服务器日志中
PUT /users/{userId}/{password}
... 将保留在网络服务器日志中。作为安全开发人员,我们甚至不应该将密码存储在可能被盗的数据库中(我们将存储密码的散列 + 盐)。在 Web 服务器日志中使用明文密码更糟糕。
在 TLS 会话的正文中发送它是最好的。
PATCH /users/{userId}
{
"password": "new_password"
}
... 然后对其进行哈希处理和加盐并存储。登录,您执行相同的过程(单向哈希匹配)。
看到这个: