That's worse than accidental logging.
Engineers should know the GET params get logged fairly routinely and shouldn't be used for anything sensitive.
But if you're terminating TLS on behalf of a customer, you can see everything. e.g. https://new.blog.cloudflare.com/terminating-service-for-8cha...
> Among other things, that resulted in us cooperating around monitoring potential hate sites on our network and notifying law enforcement when there was content that contained an indication of potential violence.
That indicates deep inspection of traffic going through CloudFlare.
Before:
.method public abstract pan(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lio/reactivex/Single;
.param p1 # Ljava/lang/String;
.annotation runtime Lretrofit2/http/Query;
value = "account_id"
.end annotation
.end param
.param p2 # Ljava/lang/String;
.annotation runtime Lretrofit2/http/Query;
value = "card_id"
.end annotation
.end param
.param p3 # Ljava/lang/String;
.annotation runtime Lretrofit2/http/Query;
value = "challenge_type"
.end annotation
.end param
.param p4 # Ljava/lang/String;
.annotation runtime Lretrofit2/http/Query;
value = "challenge"
.end annotation
.end param
.param p5 # Ljava/lang/String;
.annotation runtime Lretrofit2/http/Query;
value = "idempotency_key"
.end annotation
.end param
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/String;",
"Ljava/lang/String;",
"Ljava/lang/String;",
"Ljava/lang/String;",
"Ljava/lang/String;",
")",
"Lio/reactivex/Single<",
"Lcom/monzo/card/data/api/PanResponse;",
">;"
}
.end annotation
.annotation runtime Lretrofit2/http/GET;
value = "card/pan"
.end annotation
.end method
After (v2.59.1 has the fix): .method public abstract pan(Lcom/monzo/card/data/api/RetrievePanRequest;)Lio/reactivex/Single;
.param p1 # Lcom/monzo/card/data/api/RetrievePanRequest;
.annotation runtime Lretrofit2/http/Body;
.end annotation
.end param
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Lcom/monzo/card/data/api/RetrievePanRequest;",
")",
"Lio/reactivex/Single<",
"Lcom/monzo/card/data/api/PanResponse;",
">;"
}
.end annotation
.annotation runtime Lretrofit2/http/PUT;
value = "card/retrieve-pan"
.end annotation
.end methodIdempotency and implications for which operations can be cached is why.
GETs are cacheable, but if a PIN can change so can the answer. This is an authentication action, and it should have been POST.
For my company, it's all POST-only, no URL params allowed, all inputs as JSON in the body only, no resource IDs in the path - just the method & version only.
Principle of least surprise and all that.
Two APIs were accepting the PIN as URL parameters on GET requests, since in terms of REST principles, the operations were to retrieve information.
They were changed to non-GETs with the PIN sent in the body instead. The apps needed to be updated to switch to the new APIs.