Re: [RFC] [Discussion] Query Parameter Manipulation Support

From: Date: Thu, 05 Nov 2026 08:20:12 +0000
Subject: Re: [RFC] [Discussion] Query Parameter Manipulation Support
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-133001@lists.php.net to get a copy of this message
Hi On 2026-10-27 14:54, Máté Kocsis wrote:
1. I don't think QueryParamParsingOptions::$maxQueryStringLength is
necessary or useful to have. Checking the input length is easy to do manually (it's just a strlen() call) and I don't see a practical way to abuse the API with large input lengths alone: The API will not “blow up” inputs into considerably larger data structures, the input strings are mostly just “copied” over, not too different from e.g. str_replace().
I was also thinking a lot about whether this option is necessary to have. My main reason for including it was that people would otherwise easily forget to limit the input length, whereas the dedicated option enforces the limit everywhere. So the real question is whether QueryParams really cannot be abused via long strings, and whether $maxParamCount alone could mitigate those risks ? And now by thinking about it more, neither I could identify any specific vulnerability that would become possible by not enforcing the upper limit. In the previous iteration of the RFC, limiting the length was more useful, because parsing would have been a more resource intensive operation due to the requirements of the old "array API". The operations that are performed now during parsing are cheap, so as far as I can see, it's possible to get rid of this option if no one can come up with a good enough use-case.
Just after sending my previous reply, I realized that even if parsing long query strings isn't an expensive operation on its own, the rest of the operations supported by QueryParams may be. For example, sorting by long keys can cause significant slowdown. (To be fair: I haven't done any measurements yet). And in the light of the recent CVEs, increased memory consumption can cause troubles, so IMO an automatically enforced maximum length can still be useful.
Let me get this out of the way first, because I find it easy to give an answer here and it seems like this point is important to you with the follow-up. I'll reply separately on the other points. To the quoted point: Checking the length manually is easy to do and in some cases (e.g. when parsing the $_SERVER['REQUEST_URI']) the length is already bounded by a gateway in front FPM. With regard to “increased memory usage” bullet point (1) in my previous email was already in anticipation of the recent security releases and I checked with the others in the security team before giving my answer. The most important part is that an attacker is not able to exceed the (new) hard limit and more generally, an attacker should be unable to cause “superlinear” memory consumption. As I had mentioned in that earlier email, the input query string is mostly just “copied as is” with some overhead added for house keeping of each individual entry. Thus a query string consisting of just & is the extreme case. And that is already limited by a maximum number of parameters. Similarly sorting should also be O(n * log n) in the number of parameters, which is already limited during input time. Each individual comparison is bounded by key length, making this overall a O(l * log n) with l being the input length. If necessary a user can also verify the number of parsed elements themselves before sorting - but I don't expect that to be necessary, there are already much more expensive operations that are regularly performed on user input. Parsing itself should be linear in the length of the input string. Best regards Tim Düsterhus

« previous php.internals (#133001) next »