Как тут выполняется код без 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)')() как люди додумываются до этого? ктонибудь может разжевать мне эти два примера? |
Цитата:
объяснить несложно, но придумать такое я бы не смог :) сначала для наглядности заменим 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(), т.е. просто вызываем созданную функцию. |
по второму примеру влом раскуривать что такое getOwnPropertyDescriptor, позже гляну )
|
Часовой пояс GMT +3, время: 11:07. |