Запутывать свойства JavaScript? - PullRequest
6 голосов
/ 22 февраля 2011

Я недавно протестировал UglifyJS и YUI Compressor и заметил что-то странное.
Кажется, что оба минификатора не меняют имена свойств объекта, только именапеременные и функции.

например, если у меня есть следующий код:

var objName = {first:2, second:4};
alert(objName.first + " " + objName.second);

имена first и second остаются неизменными в уменьшенной версии.
Почему это так?

Ответы [ 7 ]

9 голосов
/ 22 февраля 2011

Так как в javascript новая функция создается в функции, вы можете заключить код в немедленно вызванную функцию.

   // scoped
(function() {
    var objName = {first:2, second:4};
    alert(objName.first + " " + objName.second);
})();

Затем с помощью Google Closure Compiler , если вы включите «расширенную» оптимизацию, он увидит, что свойства используются только локально, и запутает их.

   // result
var a={a:2,b:4};alert(a.a+" "+a.b);
8 голосов
/ 22 февраля 2011

Это потому, что он не знает, где будет использоваться объект.Он мог бы использоваться внешним кодом другим кодом, и вы не хотели бы, чтобы ваш другой код должен был изменяться всякий раз, когда вы его запутываете.

Редактировать Таким образом, в принципе, это предотвращает разрушение запутываниявнешние / внутренние ссылки на свойства, которые невозможно определить при запутывании.

3 голосов
/ 22 февраля 2011

Поскольку в JavaScript нет четко определенных правил определения границ объектов, невозможно запутать имена таким образом, который гарантированно будет правильным.

Например, если у вас была следующая функция:

function f() {
   return { first: 'foo', second: 'bar' };
}

Для того, чтобы запутать имена свойств, вам нужно зафиксировать все места, откуда вызывается f. Поскольку функции в JavaScript являются первоклассными, их можно назначать и передавать произвольным образом, что делает невозможным определение места ссылки на f без фактического запуска программы.

Кроме того, JavaScript не может указать, что является публичным API, а что нет. Даже если бы минимизатор мог надежно определить, откуда вызывается функция в коде, который вы ей даете, у него не будет возможности внести те же изменения в код, который он не видел.

2 голосов
/ 22 февраля 2011

Полагаю, это потому, что минифайеры нарушают свойства объекта.Учтите это:

function getProp(ob,name) {
   return ob[name];
}

var objName = {first: 2, second: 4};
var prop = getProp(objName, "second");

У минификатора нет возможности узнать строковый литерал "second", являющийся свойством объекта.Сокращенный код может выглядеть тогда так:

function a(b,c){return b[c]}var d={p1:2,p2:4};var e=a(d,"second")

Сломан сейчас.

1 голос
/ 29 марта 2015

В последней версии uglify (сегодня) есть искажение свойств объекта, см. V2.4.19.Он также поддерживает зарезервированные файлы для исключения как свойств объекта, так и переменных, которые вы не хотите искажать.Проверьте это.

0 голосов
/ 31 июля 2013

Как насчет того, чтобы сделать что-то вроде:

// scoped
(function() {
var objName = {first:2, second:4};
var vA = 'first';
var vB = 'second';

alert(objName[vA] + " " + objName[vB]);
})();

Как только objName.first и / или objName.second ссылаются достаточно раз, эта техника начнет сохранять символы. Я не могу придумать ни одной причины, которая бы не сработала, но я не могу найти ни одного минифайера, который бы это делал.

0 голосов
/ 10 марта 2011

Единственный общедоступный инструмент для запутывания имен свойств и функций (afaik) - расширенный режим Closure Compiler.Существует много ограничений и ограничений, но конечный результат, как правило, того стоит.

В качестве краткого примечания: Dojo Toolkit совместим (с некоторыми незначительными изменениями) с компилятором Closureв расширенном режиме - возможно, единственная крупная общедоступная библиотека JavaScript, которая может быть полностью запутана.Так что, если вы ищете обфускацию для защиты своего IP, вам следует рассмотреть возможность использования Dojo для этой задачи.

http://dojo -toolkit.33424.n3.nabble.com / file / n2636749 / Using_the_Dojo_Toolkit_with_the_Closure_Compiler.pdf? by user = t

  • Стивен
...