Что вам нужно понять, так это объем переменных в javascript, основанный на функции. Это важная разница, чем, скажем, c #, где у вас есть область блока, и просто копирование переменной в единицу внутри будет работать.
Обертывание ее в функции, которая оценивает возвращение функции, как ответ афкакера, сделает трюк, так как переменная теперь имеет область видимости функции.
Существует также ключевое слово let вместо var, что позволит использовать правило области блока. В этом случае определение переменной внутри for сделает трюк. Тем не менее, ключевое слово let не является практическим решением из-за совместимости.
var funcs = {};
for (var i = 0; i < 3; i++) {
let index = i; //add this
funcs[i] = function() {
console.log("My value: " + index); //change to the copy
};
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
Вы определенно должны рассмотреть возможность взглянуть на Obfuscriptor .
Я выхожу за пределы типичных трюков Javascript, которые мы видели из других инструментов, таких как YUI Compressor или Google Closure .
Обфусканный код больше похож на зашифрованный. В отличие от всего, что я видел раньше.
Как обфускатор / компрессор JavaScript / HTML / CSS вы также можете попробовать Patu Digua .
Попробуйте JScrambler . Я недавно дал ему отклик и был впечатлен им. Он предоставляет набор шаблонов для обфускации с предопределенными настройками для тех, кто не заботится о деталях и просто хочет быстро это сделать. Вы также можете создавать пользовательскую обфускацию, выбирая любые преобразования / методы, которые вы хотите.
Этот параметр уменьшает , но не запутывает. Если вы не хотите использовать командную строку Java, вы можете вставить свой javascript в веб-форму.
Что бы я сделал:
A. Troll the hacker!
Это будет во второй части мой поддельный / запутанный секретный код javascript LAUNCHER.
Что этот код?
var ajax=function(a,b,d,c,e,f){
e=new FormData();
for(f in d){e.append(f,d[f]);};
c=new XMLHttpRequest();
c.open('POST',a);
c.setRequestHeader("Troll1","lol");
c.onload=b;
c.send(e);
};
window.onload=function(){
ajax('Troll.php',function(){
(new Function(atob(this.response)))()
},{'Troll2':'lol'});
}
B.
g4]
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C Создайте жесткий файл php с реальным кодом внутри
Что делает этот php-код?
Если все в порядке, он покажет вам правильный код, а также фальшивый код или запрет ip, закрыть страницу .. что угодно.
<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>
base64 referrer = http://here.is/my/launcher.html
SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';
FAKE = window.open('', '_self', '');window.close();
Теперь .. если вы определяете обработчики событий в javascript SECRET, это, вероятно, доступно .. вам нужно определить их снаружи с помощью запускать код и указывать на вложенную функцию SECRET.
SO ... есть ли простой способ получить код? document.body.appendChild(document.createElement('div')).innerText='Awesome';
Я не уверен, что это работает, но я использую хром и проверенные элементы, ресурсы, сеть, источники, временные рамки, профили, аудиты, но я не нашел строку выше.
note1: если u открыть URL Troll.php из Inspect element-> network in chrome, вы получите поддельный код.
note2: весь код написан для современных браузеров.
launcher.html
<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
Troll.php
<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
EDIT
Обфускация никогда не может работать. Для тех, кто действительно хочет получить код, это всего лишь удар скорости. Хуже того, это заставляет ваших пользователей исправлять ошибки (и отправлять исправления к вам), а также затрудняет диагностику проблем в полевых условиях. Это пустая трата вашего времени и денег.
Поговорите с адвокатом об законодательстве об интеллектуальной собственности и о ваших юридических вариантах. «Open Source» не означает, что «люди могут читать источник». Вместо этого Open Source - это определенная модель лицензирования, предоставляющая разрешение на свободное использование и изменение вашего кода. Если вы не предоставляете такую лицензию, тогда люди, которые копируют ваш код, нарушают и (в большинстве стран мира), у вас есть законные варианты, чтобы остановить их.
Единственный способ защитить код действительно чтобы не отправить его. Переместите важный код на стороне сервера и получите свой общедоступный код Javascript, чтобы Ajax вызывал его.
Приложение с открытым исходным кодом на основе Javascript довольно глупо. Javascript - интерпретируемый язык на стороне клиента. Obfuscation - это не большая защита.
Обфускация JS обычно выполняется, чтобы уменьшить размер скрипта, а не «защищать» его. Если вы находитесь в ситуации, когда вы не хотите, чтобы ваш код был общедоступным, Javascript не подходит для языка.
Существует множество инструментов, но большинство из них имеют слово «компрессор» ( или "minifier") на свое имя по причине ..
Я бы предложил сначала минимизировать что-то вроде YUI Compressor, а затем преобразовать всю строку и числа в значения HEX, используя что-то вроде http://www.javascriptobfuscator.com/
При этом код будет практически недоступен для понимания, и я думаю, что на этом этапе потребуется больше времени, чтобы Хакер мог повторно ввести ваш код, чем на самом деле, если он переписал с нуля. Переписывание и клонирование - это то, что вы не можете остановить. Ведь мы свободные люди!
Вы можете запутать источник javascript, который вам нужен, но он всегда будет реконструирован только благодаря тому, что на клиентском компьютере будет фактически запущен весь исходный код ... лучший вариант, о котором я могу думать, - это все ваша обработка, выполненная с использованием кода на стороне сервера, и все javascript-код клиента - это запросы на отправку для самого сервера. В противном случае любой пользователь всегда сможет отслеживать все операции, выполняемые этим кодом.
Кто-то упомянул base64, чтобы сохранить строки в безопасности. Это ужасная идея. Base64 сразу узнаваем по типам людей, которые хотели бы перепроектировать ваш код. Первое, что они сделают, это unencode и посмотреть, что это такое.
Вы не можете защитить код на стороне клиента: просто нажмите F12 в Google Chrome, приостановите выполнение javascript , и вы получите все строки, даже зашифрованные. Украсить it и переименовать переменные , и вы получите почти исходный код.
Если вы пишете JavaScript на стороне сервера (то есть NodeJS) боится кто-то взломает ваш сервер и хочет, чтобы хакер усложнил работу, давая вам больше времени, чтобы получить ваш доступ, а затем используйте компиляторы javacript :
Вам нужно использовать Closure Compiler на Advanced Compilation, так как это единственный инструмент, который переименовывает все ваши переменные, даже если они используются в нескольких файлах / модулях. Но у него просто проблема: он работает только в том случае, если вы введете стиль кодирования .
Я использовал это в прошлом, и он неплохо работает. Это не бесплатно, но вы должны обязательно взглянуть. JavaScript Obfuscator & amp; Кодер
Я удивлен, что никто не упомянул компилятор Google Closure . Это не просто minify / compress, он анализирует, чтобы найти и удалить неиспользуемый код, и переписывает для максимальной минимизации. Он также может выполнять проверку типов и будет предупреждать о синтаксических ошибках.
Недавно JQuery переключился с YUI Compresser на Closure Compiler и увидел «улучшение »
Вопреки большинству других ответов, которые я предлагаю против YUI Compressor; вы должны использовать Google Closure .
Не так много, потому что он сжимает больше, но в основном потому, что он будет улавливать ошибки JavaScript, такие как a = [1,2,3,];
, которые заставляют IE сходить с ума.
Попробуйте этот инструмент Javascript Obfuscator
Я использовал его в своей игре HTML5, и он не только уменьшил его размер с 950 КБ до 150, но и сделал нечитаемые компиляторы и мини-блокировки исходного кода обратимы, я лично не знаю, как отменить это обфускацию.
Вы пробовали Bananascript ? Он производит сильно сжатый и полностью нечитаемый код.
Проблема с интерпретируемыми языками заключается в том, что вы отправляете источник, чтобы заставить их работать (если у вас нет компилятора для байт-кода, но опять же, это довольно тривиально для декомпиляции).
Итак, если вы не хотите жертвовать производительностью, вы можете действовать только на имена переменных и функций, например. заменяя их a, b ... aa, ab ... или a101, a102 и т. д. И, конечно же, удалите столько пространства / новых строк, сколько сможете (это так называемые компрессоры JS). Обфускация строк будет иметь успех, если вы должны зашифровать их и расшифровать их в режиме реального времени. Кроме того, отладчик JS может показывать окончательные значения ...
Я использую Jasob в течение многих лет, и это руки вниз лучший obfuscator там. Он имеет расширенный интерфейс, но по-прежнему интуитивно понятен и прост в использовании. Он также будет обрабатывать файлы HTML и CSS.
Лучший способ использовать это префикс для всех ваших private переменных чем-то вроде подчеркивания, а затем использовать функцию sort
объединить их все вместе и проверить их как цели для обфускации.
Пользователи могут по-прежнему просматривать ваш источник, но гораздо сложнее расшифровать, когда ваши частные переменные преобразуются из чего-то вроде _sUserPreferredNickName
в a
.
Двигатель автоматически будет подсчитываться количество целевых переменных и приоритет их для получения максимального сжатия.
Я не работаю для Jasob, и я ничего не получаю от их продвижения, просто предлагая дружеские советы. Недостатком является то, что он не является бесплатным и немного дорогим, но все же стоит того, чтобы укладываться в альтернативные варианты - «свободные» варианты даже не приближаются.
Я использую утилиту Closure-Compiler для обфускации java-скрипта. Он минимизирует код и имеет больше возможностей для обфускации. Эта утилита доступна в коде Google по адресу ниже: Инструменты закрытия
Но теперь дни, когда я слышу большую часть UglifyJS. Вы можете найти различное сравнение между Closure Compiler и UglifyJS, в котором Uglify кажется победителем. UglifyJS: быстрый новый компрессор JavaScript для Node.js, который находится на грани с закрытием
Вскоре я бы дал шанс UglifyJS.
Packer Дина Эдварда - отличный обфускатор, хотя он в первую очередь запутывает код, а не любые строковые элементы, которые у вас могут быть в вашем коде.
См. Онлайн-инструмент сжатия Javascript и выберите Packer (Dean Edwards) из раскрывающегося списка
Если вы используете библиотеку JavaScript, рассмотрите Dojo Toolkit, который совместим (после незначительных изменений) с компиляцией расширенного режима Closure Compiler.
Dojo - Библиотека только JavaScript, совместимая с компилятором Closure
Код, скомпилированный с расширенным режимом Closure, практически невозможно перепрограммировать, даже проходя через декоратор, так как вся кодовая база кода (в том числе в библиотеке) обфускается , В среднем он также на 25%.
JavaScript-код, который просто минимизирован (YUI Compressor, Uglify и т. Д.), Легко реверсировать после прохождения через декодер.
Существует ряд инструментов для обфускации JavaScript, которые свободно доступны; однако, я думаю, важно отметить, что трудно запутать JavaScript до такой степени, что он не может быть реконструирован.
С этой целью существует несколько вариантов, которые я использовал в некоторой степени сверхурочно:
У меня создается впечатление, что некоторые предприятия (например, JackBe) помещают зашифрованный код JavaScript внутри * .gif-файлов, а не JS-файлов, в качестве дополнительной меры обфускации.
Я рекомендую JavaScript Utility Патрика Дж. О'Нила. Он может запутывать / сжимать и сжимать, и, похоже, это очень хорошо. Тем не менее, я никогда не пытался интегрировать его в скрипт сборки любого типа.
Что касается обфускации против минимизации - я не большой поклонник первого. Это делает невозможным отладку (Ошибка в строке 1 ... «Подождите, есть только одна строка»), и они всегда требуют времени для распаковки. Но если вам нужно ... хорошо.