On Tue, Jul 22, 2014 at 2:04 PM, Ferenc Kovacs <tyr...@gmail.com> wrote:
>
>
>
> On Tue, Jul 22, 2014 at 1:48 PM, Nikita Popov <nikita....@gmail.com> wrote:
>>
>> On Tue, Jul 22, 2014 at 12:27 PM, Ferenc Kovacs <tyr...@gmail.com> wrote:
>>>
>>> sorry for the late reply.
>>> you are right and after looking into the implementation I think classes
>>> having custom object storage (eg. create_object) shouldn't assume that
>>> their __construct will be called, but either do the initialization in the
>>> create_object hook or validate in the other methods that the object was
>>> properly initialized.
>>> given that this lack of initialization problem is already present(you can
>>> extend such a class and have a __construct() in the subclass which
>>> doesn't
>>> call the parent constructor), and we want to keep the unserialize trick
>>> fixed (as that exposes this problems to the remote attacker when some
>>> code
>>> accepts arbitrary serialized data from the client) I see no reason to
>>> keep
>>> the limitation in the ReflectionClass::newInstanceWithoutConstructor()
>>> and
>>> allowing the instantiation of internal classes will provide a clean
>>> upgrade
>>> path to doctrine and co.
>>> ofc. we have to fix the internal classes misusing the constructor for
>>> proper initialization one by one, but that can happen after the initial
>>> 5.6.0 release (ofc it would be wonderful if people could lend me a hand
>>> for
>>> fixing as much as we can before the release), but we have to fix those
>>> anyways.
>>
>>
>> This sounds reasonable to me. newInstanceWithoutConstructor does not have
>> the same remote exploitation concerns as serialize, so allowing crashes here
>> that can also be caused by other means seems okay to me (especially if we're
>> planning to fix them lateron). Only additional restriction I'd add is to
>> disallow calling it on an internal + final class. For those the __construct
>> argument does not apply. For them the entity-extending-internal-class
>> usecase doesn't apply either, so that shouldn't be a problem.
>>
>> Nikita
>>
>
> Thanks for the prompt reply!
> I was considering mentioning the final constructors, but as we previously
> didn't checked that and from a quick look it seems that we are mostly using
> it as an easy/cheap way to make sure that the object is initialized properly
> (which could also happen when a subclass calls parent::__construct() from
> it's constructor) which isn't exactly the best usecase for final.
> But I don't really mind having that check.

I'm +1 also with the idea.

Just take care to have a clone_handler defined as well, as the default
clone handler doesn't call create_object.
http://lxr.php.net/xref/PHP_5_5/Zend/zend_objects.c#218

Julien

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to