Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как тут выполняется код без eval/function/etc ?? (https://javascript.ru/forum/events/60711-kak-tut-vypolnyaetsya-kod-bez-eval-function-etc.html)

psihoz26 15.01.2016 18:42

Как тут выполняется код без eval/function/etc ??
 
пару примеров с alert(1)

1.
toString.constructor.prototype.toString=toString.call;["","alert(1)"].sort(toString.constructor)


2.
a="constructor";b={};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).value,0,'alert(1)')()



как люди додумываются до этого? ктонибудь может разжевать мне эти два примера?

Яростный Меч 15.01.2016 20:03

Цитата:

Сообщение от psihoz26 (Сообщение 403901)
пару примеров с alert(1)

1.
toString.constructor.prototype.toString=toString.call;["","alert(1)"].sort(toString.constructor)

изящный прикол.
объяснить несложно, но придумать такое я бы не смог :)

сначала для наглядности заменим toString.constructor на Function (это он и есть), и для большей наглядности toString.call на Function.prototype.call, чтобы не забыть откуда что берется:
Function.prototype.toString = Function.prototype.call;
["", "alert(1)"].sort(Function);


далее, при сортировке, поскольку элементов всего 2, callback сравнения будет вызван только один раз, и это будет вызов Function("", "alert(1)"), который в результате вернет функцию, делающую алерт(1).

Но результат этого callback'а надо сравнить с 0, для чего у него (результата Function("", "alert(1)")) вызывается метод valueOf(), который для функции просто использует toString().

И вот тут вспоминаем, что у функций теперь вместо toString реально используется call. Фактически мы делаем Function("", "alert(1)").call(), т.е. просто вызываем созданную функцию.

Яростный Меч 15.01.2016 20:03

по второму примеру влом раскуривать что такое getOwnPropertyDescriptor, позже гляну )


Часовой пояс GMT +3, время: 11:07.