“要修改重要数据的 API 不要用 GET”,0-RTT 说

Re:Linked

更正:有副作用的操作本来就不该用 GET。

TLS 1.3 是一个很棒的东西。0-RTT 也是一个很棒的特性。不过有一点小小的问题:

你的 Project 中有没有什么需要修改重要数据的 API (例如支付)是 GET 方式提交的?

如果有的话,请往下读。

CloudFlare Blog 里有一篇介绍 0-RTT 的文章。简而言之,虽然 0-RTT 时发送的内容是加密的,然而服务器并不能判断这个包是客户端发送的还是中间人重放的。浏览器出于安全考虑,大多只在 0-RTT 带着 GET 类请求。考虑到在浏览器水平上,第一个请求经常是 GET / 这种没什么危险的网页获取动作,这个问题也就没太处理。

但是 AJAX 之类,会不会有比较危险的动作可能会在 0-RTT 发送呢?如果这种动作对服务器数据库产生更改,它的重放会不会对客户产生威胁?CloudFlare 用时间戳对这种风险进行了一下过滤,不过 CloudFlare 之外的内容呢?

如果把关键业务的 API 用 POST 来做,大概就能避免这个问题。

来自 CloudFlare Blog 的参考文章: