Improving Function.prototype.bind

Mark S. Miller erights at google.com
Fri Jan 6 09:56:56 PST 2012


On Fri, Jan 6, 2012 at 9:27 AM, Andrea Giammarchi <
andrea.giammarchi at gmail.com> wrote:

> that whole variable can be redefined or used as communication channel ...
> I really don't understand what is the problem.


The variable "Object"? No, in SES that's unassignable. As layered on ES5,
we enforce that simply by making globalObject.Object a non-writable
non-configurable data property.



>
> The returned bound once object could be frozen without problems but if the
> function is private with the gist I have posted:
>


Essentially yes. The returned bound object would have to be transitively
immutable, but in this case freeze may be enough. Of course, this can't be
a fix to "bind" since that would break bind's current behavior. But if it
were a new API as you suggest, that would no longer violate any principles,
I believe.

Separately, I do not believe the need for this is adequate to justify
adding a new API. But that's a completely different topic.



>
>  1. you cannot redefine Object.prototype at all
>  2. you cannot access single bound function/object from any other place
>
> If I have my own scope I want to do what's needed, this does not mean the
> problem does not exist, isn't it?
>
> In your case you have, as example, different problems with that WeakMap
>
>  1. everyone can WeakMap = function () {}; anywhere
>

Again, no they can't because all whitelisted global variables are
unassignable.



>  2. if already defined, the definition of Object getOwnPropertyDescriptor
> to avoid access to that "protected" variable will fail and throw an error
> ... isn't it? That does not look safe either
>  3. as you wrote, Proxy easily discover that secret
>  4. your implementation has same problem I am talking about ... trapped
> "protected/private" stuff others should not see
>
> Same stuff with my problem except even proxy won't be able to retrieve
> that bound function since no property is attached.
>
> I can't hardly believe you are so worried about an edge case and you don't
> see the pachyderm we are all dealing with ... properties attached and
> accessible "from everyone" ... this is for you safe?
>
> Is obj.bound = obj.method.bind(obj) a better approach than the one I am
> suggesting ?
>
> I am sorry but I don't think so.
>

I don't think the benefits you explain are worth the cost of a new API. But
that's separate from the security issue.



>
> Best Regards
>
>
> On Fri, Jan 6, 2012 at 6:03 PM, Mark S. Miller <erights at google.com> wrote:
>
>> On Fri, Jan 6, 2012 at 1:50 AM, David Bruant <bruant.d at gmail.com> wrote:
>>
>>>  Le 06/01/2012 10:40, Andrea Giammarchi a écrit :
>>>
>>> if WeakMaps are so smart ... it means we cannot shim them without
>>> causing leaks in non WeakMap ready browsers since no magic will
>>> happen,objects as keys will simply be persistent in the WeakMap private
>>> scope
>>>
>>> Indeed. Also, Mark Miller mentionned a couple of times that the SES
>>> polyfill [1] leaks less than one could expect. I haven't taken the time to
>>> look into that but it's probably worth mentionning.
>>>
>>
>> And it's probably worth looking into ;)
>>
>>
>>>  [1]
>>> http://code.google.com/p/es-lab/source/browse/trunk/src/ses/WeakMap.js
>>>
>>>
>>>
>> --
>>     Cheers,
>>     --MarkM
>>
>
>


-- 
    Cheers,
    --MarkM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120106/b789abab/attachment.html>


More information about the es-discuss mailing list