Re: RFC: Stop to automatically cast numeric-string to int when using them as arr ay-key
| From: | Kirill Nesmeyanov | Date: | Sun, 02 Jan 2022 03:47:11 +0000 |
| Subject: | Re: RFC: Stop to automatically cast numeric-string to int when using them as arr ay-key | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-116753@lists.php.net to get a copy of this message | ||
>Суббота, 1 января 2022, 17:41 +03:00 от Rowan Tommins
><rowan.collins@gmail.com>:
>
>On 31/12/2021 00:21, Kirill Nesmeyanov wrote:
>> I support this behavior fix because in its current form, due to a similar problem
>> (almost?), all PSR-7 implementations contain bugs that violate RFC7230 (section 3.2: ljA}ü]EVR’¥Á!
>> £6https://datatracker.ietf.org/doc/html/rfc7230#section-3.2 ). Thus, physically, by
>> the standard, all headers can have the name "0" (like «0: value»), but when stored
>> inside implementations, it is converted to a string and a problem arises ($message->getHeaders()
>> // returns array<int|string, string> instead of array<string, string>).
>
>You appear to be technically correct - the RFC defines a header name
>only as "token", which implies the following would all be valid HTTP
>headers:
>
>42: The Answer
>!: Bang
>^_^: Surprised
>
>In practice, it would be a bad idea to use any of these.
>
>Every single one of the field names registered with IANA [1] starts with
>a letter, and proceeds with only letters, digits, and hyphen ('-'). [The
>exception is "*", listed there as "reserved" to specifically prevent its
>use conflicting with the wild-card value in "Vary" lists.]
>
>I'm actually surprised this definition hasn't been updated with
>interoperability advice in recent revisions of the standard. I did find
>this general advice for internet message headers in RFC 3864 [2]:
>
> > Thus, for maximum flexibility, header field names SHOULD further be
> > restricted to just letters, digits, hyphen ('-') and underscore
>('_')
> > characters, with the first character being a letter or underscore.
>
>The additional restriction on underscore ('_') in HTTP arises from CGI,
>which maps headers to environment variables. For instance, Apache httpd
>silently drops headers with anything other than letters, digits, and
>hyphen [3] to avoid security issues caused by environment manipulation.
>
>If I was developing a PSR-7 or similar library, I would be inclined to
>drop any header composed only of digits, and issue a diagnostic warning,
>so that it wouldn't escalate to a type error later. It certainly doesn't
>seem reasonable to change the entire language to work around that
>inconvenience.
>
>[1]
>https://www.iana.org/assignments/http-fields/http-fields.xhtml
>[2] https://datatracker.ietf.org/doc/html/rfc3864#section-4.1
>[3] https://httpd.apache.org/docs/trunk/env.html#setting
>
>Regards,
>
>--
>Rowan Tommins
>[IMSoP]
>
>--
>PHP Internals - PHP Runtime Development Mailing List
>To unsubscribe, visit: https://www.php.net/unsub.php
I just gave an example of what at the moment can cause an exception in any application that is based
on the PSR. It is enough to send the header "0: Farewell to the server". In some cases
(for example, as is the case with RoadRunner) - this can cause a physical stop and restart of the
server.
Just in case, I will repeat my thesis: I cannot imagine that anyone is using this functionality
consciously and that it is part of the real logic of the application. And fixing this behavior, I
believe, will automatically fix many libraries (not necessarily PSR) that do not take this behavior
into account.
--
Kirill Nesmeyanov