Re: Re: header() removes all header of the same name.
| From: | Stephen Reay | Date: | Wed, 19 Oct 2016 03:18:20 +0000 |
| Subject: | Re: Re: header() removes all header of the same name. | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-96460@lists.php.net to get a copy of this message | ||
Hi Yasuo,
I still have an issue with that. I believe the correct behaviour here is (assuming the
replace argument to header() is honoured) what you’re seeing. Yes, it might be
*unexpected* for new users, but its also *expected* by millions of current users/projects.
I would suggest perhaps a warning on the header() docs page, and perhaps an example to avoid the
issue on the Session handling page.
Leaving it as-is, with improved docs means all functionality is *possible* with the right arguments.
Changing to your proposal means advanced use-cases are *impossible* with any arguments.
I realise you’re trying to remove WTF cases, but I don’t think removing advanced capabilities is
the way to do that.
Cheers
Stephen
> On 19 Oct 2016, at 08:00, Yasuo Ohgaki <yohgaki@ohgaki.net> wrote:
>
> Hi all,
>
> On Tue, Oct 18, 2016 at 4:31 PM, Yasuo Ohgaki <yohgaki@ohgaki.net> wrote:
>> I understand why header() is made to remove all headers of the same
>> name. This is needed in some cases, but it does not work well for some
>> cases.
>>
>> We need to decide what to do with
>> https://bugs.php.net/bug.php?id=72997
>>
>> There is 2 issues.
>> - header() removes all headers of the same name including 'Set-Cookie'
>> - header() ignores replace flag. (This one is easy to fix)
>>
>> Since header() enables 'replace flag' by default, it removes all
>> 'Set-Cookie' headers sent previously by default. It can easily disturb
>> security related cookies to work. i.e. Session ID cookie, Auto Login
>> cookie. This bug would be very hard to find for normal users, too.
>>
>> Restoring older behavior (Removing only one header) cannot be a
>> resolution because it can still disturb security related cookies.
>>
>> Possible resolutions:
>>
>> - Prohibit 'Set-Cookie' for header() and force users to use setcookie()
>> - Mitigate by disabling replace flag by default. (This is not a good idea, IMO)
>>
>> Both resolution requires BC, but this is better to be fixed ASAP.
>>
>> Non-BC resolution could be:
>> - "Ask users to use setcookie() always for 'Set-Cookie'".
>>
>> I would like to prohibit 'Set-Cookie' by header() because it may
>> remove session ID cookie as well as auto login cookie, etc. If we
>> leave released version as it is now, I would like to prohibit
>> 'Set-Cookie' by header() in PHP 7.1.
>>
>> Problem with this may be that user cannot modify 'Set-Cookie' header
>> line as user want.
>>
>> $ php -r 'setcookie("REMEMBERME=value; expires=Sat, 03-Sep-2020
>> 05:38:43 GMT; path=/; domain=aaa");'
>> PHP Warning: Cookie names cannot contain any of the following '=,;
>> \t\r\n\013\014' in Command line code on line 1
>>
>>
>> Comments?
>
> An idea for session ID protection.
>
> Following code results in lost session always.
>
> <?php
> session_start();
> session_regenerate_id();
> header('Set-Cookie: something');
> ?>
>
> header() function removes all header of the same name, e.g.
> Set-Cookie, Expires, etc, by sapi_remove_header(). This could be very
> hard to find the cause.
>
>
> This risk can be removed w/o much BC. Only BC is when user is
> intentionally trying to delete session ID cookie manually. This would
> be very rare. We can add code that excludes session ID cookie in
> sapi_remove_header().
> http://lxr.php.net/xref/PHP-MASTER/main/SAPI.c#593
>
> To do that, we can search string like following
> Set-Cookie: PHPSESSID=xxxxxxx
>
> The only issue is we need session global, i.e. PS(session_name), at
> least. It's not nice to have dependency from SAPI.c to session, but it
> protects session ID from removed by users by mistake.
>
> Any comments?
>
> Regards,
>
> --
> Yasuo Ohgaki
> yohgaki@ohgaki.net
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php