在 POST 请求中使用查询字符串是一种不好的做法吗?

Ale*_*din 7 javascript forms rest networking post

有一个系统将POST请求从前端发送到后端。这些POST请求不使用主体将数据传递给服务器;相反,它在 URL 参数中使用查询字符串。

这些请求不发送文件或 JSON,仅发送几个字符串参数。

W3C 没有描述这种情况https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

使用查询字符串进行 POST 请求是否是一种不好的做法?由于安全、性能或体系结构原因,使用查询字符串是否会产生任何负面后果?

是否有任何约定定义不同类型请求的正文或查询字符串的用法?

Voi*_*son 7

提醒:2014 年,RFC2616 被多个 RFC (7230-7237) 取代。

在 POST 请求中使用查询字符串是一种不好的做法吗?

如果你知道自己在做什么就不会。

从机制上来说,一切都很好:我们是否可以将 POST 与包含查询部分的目标 uri 一起使用?是的。我们是否可以使用带有空请求正文的 POST ?是的。我们可以同时做这两件事吗?是的。

困难的部分:此 POST 请求会使缓存中的正确表示无效吗?

当服务器对不安全请求(POST 是一种不安全请求方法)返回非错误响应时,就会发生缓存失效。无效的表示是那些与不安全请求的 target-uri 匹配的表示。

GET /foo?a=b HTTP/2.0
POST /foo?a=b HTTP/2.0
Run Code Online (Sandbox Code Playgroud)

这里,如果 POST 成功,则 GET 请求成功后缓存的表示将在缓存中失效。

GET /foo HTTP/2.0
POST /foo?a=b HTTP/2.0
Run Code Online (Sandbox Code Playgroud)

这里,有效的 request-uri 并不相同,这意味着通用组件不会使/foo.


dec*_*eze 5

在 POST 请求的 URL 中使用查询参数没有任何问题,无论是否带有请求正文。如果它对您的请求具有语义意义,那就没问题。POST 方法本身具有与 GET 不同的语义含义,它不需要有用的请求正文,并且 URL 也与此不同。一个经典的例子可能是:

POST /foo/bar?token=83q2fn2093c8jm203
Run Code Online (Sandbox Code Playgroud)

即,通过 URL 传递某种令牌。

这里不存在一般的安全问题,因为任何可以拦截此 POST 请求以读取 URL 的人也可以读取其正文数据;您几乎找不到攻击者能够读取 URL 但无法读取正文的位置。然而,URL 通常会记录在服务器访问日志和浏览器历史记录中,而请求正文则不会;这可能值得考虑,也可能不值得考虑,具体取决于您在这些参数中传输的信息以及谁有权访问这些日志。

  • 如果查询字符串包含某种敏感数据,则可能会出现安全问题。请求 URL 往往会保留在网络服务器日志中,而请求正文通常不会。 (2认同)