Как я могу запутать (защитить) JavaScript?
Я хочу сделать приложение JavaScript, которое не является открытым исходным кодом, и поэтому я хочу узнать, как можно запутать мой JS-код? Возможно ли это?
Ответы
Ответ 1
Obfuscation:
Попробуйте Компрессор YUI. Это очень популярный инструмент, встроенный, улучшенный и поддерживаемый командой UI Yahoo.
Вы также можете использовать:
Данные частной строки:
Сохранение строковых значений private - это другое дело, и обфускация не принесет большой пользы. Конечно, упаковывая ваш источник в искаженный, уменьшенный беспорядок, у вас есть легкая версия безопасности через скрытность. В большинстве случаев это ваш пользователь, который просматривает исходный код, и строковые значения на клиенте предназначены для их использования, поэтому частное строковое значение не часто необходимо.
Если у вас действительно есть значение, которое вы никогда не хотели, чтобы пользователь видел, у вас было бы несколько вариантов. Во-первых, вы можете сделать какое-то шифрование, которое расшифровывается при загрузке страницы. Вероятно, это будет один из самых безопасных вариантов, но также и большая работа, которая может оказаться ненужной. Вероятно, base64 может кодировать некоторые строковые значения, и это было бы проще.. но кто-то, кто действительно хотел эти строковые значения, мог легко декодировать их. Шифрование - единственный способ по-настоящему запретить кому-либо доступ к вашим данным, и большинство людей считают, что это больше безопасности, чем нужно.
Sidenote:
Обфускация в Javascript, как известно, вызывает некоторые ошибки. Обфускаторы получают немного лучше об этом, но многие наряды решают, что они видят достаточную выгоду от минимизации и gzipping, а добавленная экономия обфускации не является всегда стоит проблемы. Если вы пытаетесь защитить свой источник, возможно, вы решите, что это стоит того, чтобы сделать ваш код труднее читать. JSMin - хорошая альтернатива.
Ответ 2
Я удивлен, что никто не упомянул Google Closure Compiler. Это не просто minify/compress, он анализирует, чтобы найти и удалить неиспользуемый код, и переписывает для максимальной минимизации. Он также может выполнять проверку типов и будет предупреждать о синтаксических ошибках.
Недавно JQuery переключился с YUI Compresser на Closure Compiler и увидел " улучшенное улучшение
Ответ 3
Обфускация никогда не может работать. Для тех, кто действительно хочет получить ваш код, это просто удар скорости. Хуже того, это заставляет ваших пользователей исправлять ошибки (и отправлять исправления к вам), а также затрудняет диагностику проблем в полевых условиях. Это пустая трата времени и денег.
Поговорите с адвокатом об законодательстве об интеллектуальной собственности и каковы ваши юридические возможности. "Open Source" не означает, что "люди могут читать источник". Вместо этого Open Source - это определенная модель лицензирования, предоставляющая разрешение на свободное использование и изменение вашего кода. Если вы не предоставляете такую лицензию, тогда люди, которые копируют ваш код, нарушают и (в большинстве стран мира), у вас есть юридические возможности, чтобы остановить их.
Единственный способ защитить свой код - это не отправлять его. Переместите важный код на стороне сервера и получите свой общедоступный код Javascript, чтобы Ajax вызывал его.
Посмотрите мой полный ответ об обфускаторах здесь.
Ответ 4
Вы можете полностью запутать исходный код javascript, но он всегда будет реконструирован только благодаря тому, что на клиентском компьютере будет фактически запущен весь исходный код... лучший вариант, который я могу представить, - это все ваша обработка, выполненная с использованием кода на стороне сервера, и все javascript-код клиента - это запросы на отправку для самого сервера. В противном случае любой пользователь всегда сможет отслеживать все операции, выполняемые этим кодом.
Кто-то упомянул base64, чтобы сохранить строки в безопасности. Это ужасная идея. Base64 сразу узнаваем по типам людей, которые хотели бы перепроектировать ваш код. Первое, что они сделают, это unencode и посмотреть, что это такое.
Ответ 5
Существует ряд инструментов для обфускации JavaScript, которые свободно доступны; однако я считаю важным отметить, что трудно запутать JavaScript до такой степени, что он не может быть реконструирован.
С этой целью существует несколько вариантов, которые я использовал в некоторой степени сверхурочно:
-
Компрессор YUI. Yahoo! JavaScript-компрессор делает хорошую работу по уплотнению кода, который улучшит время загрузки. Существует небольшой уровень обфускации, который работает относительно хорошо. По сути, Compressor будет изменять имена функций, удалять пустое пространство и изменять локальные переменные. Это то, что я использую чаще всего. Это инструмент Java с открытым исходным кодом.
-
JSMin - это инструмент, написанный Дугласом Крокфордом, который пытается минимизировать ваш источник JavaScript. В собственных словах Крокфорда "JSMin не запутывает, но он угадает". Основная цель состоит в том, чтобы минимизировать размер вашего источника для более быстрой загрузки в браузерах.
-
Бесплатный обфускатор JavaScript. Это веб-инструмент, который пытается обфускать ваш код, фактически кодируя его. Я думаю, что компромиссы его формы кодирования (или обфускации) могут зависеть от размера файлов; однако, это вопрос личных предпочтений.
Ответ 6
Что я буду делать:
A. Тролль-хакер!
Это будет во второй части мой поддельный/запутанный секретный код 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. Обмагивание кода немного
Что это?
- тот же код, что и выше, в base64
- это не SECRET код javascript
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C Создайте жесткий файл php с реальным кодом внутри
Что делает этот php-код?
- Проверяет правильный реферер (домен/директория/код вашей пусковой установки)
- Проверяет пользовательский HEADER
- Проверяет пользовательскую переменную POST
Если все в порядке, он покажет вам правильный код, иначе поддельный код или запрет 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: весь код написан для современных браузеров. polyfill требуется гораздо больше кода.
ИЗМЕНИТЬ
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=';}; ?>
Ответ 7
Проблема с интерпретируемыми языками заключается в том, что вы отправляете источник, чтобы заставить их работать (если у вас нет компилятора для байт-кода, но опять же, это довольно тривиально для декомпиляции).
Итак, если вы не хотите жертвовать производительностью, вы можете действовать только на имена переменных и функций, например. заменив их a, b... aa, ab... или a101, a102 и т.д. И, конечно же, удалите столько пространства/новых строк, сколько сможете (что делают так называемые компрессоры JS).
Обфускация строк будет иметь успех, если вы должны зашифровать их и расшифровать их в режиме реального времени. Кроме того, отладчик JS может отображать конечные значения...
Ответ 8
Попробуйте JScrambler. Я недавно дал ему отклик и был впечатлен им.
Он предоставляет набор шаблонов для обфускации с предопределенными настройками для тех, кто не заботится о деталях и просто хочет быстро это сделать. Вы также можете создавать пользовательскую обфускацию, выбирая любые преобразования/методы, которые вы хотите.
Ответ 9
Вопреки большинству других ответов, которые я предлагаю против компрессора YUI; вы должны использовать Google Closure.
Не так много, потому что он сжимает больше, но в основном потому, что он будет ловить ошибки javascript, такие как a = [1,2,3,];
, которые заставляют IE сходить с ума.
Ответ 10
Приложение с открытым исходным кодом на основе Javascript довольно глупо. Javascript - это интерпретируемый язык на стороне клиента. Обфускация - это не большая защита.
JS obfuscation обычно делается для уменьшения размера script, а не для "защиты". Если вы находитесь в ситуации, когда вы не хотите, чтобы ваш код был общедоступным, Javascript - неправильный язык.
Существует множество инструментов, но у большинства из них есть слово "компрессор" (или "minifier" ) по его названию..
Ответ 11
Я могу рекомендовать утилиту JavaScript Патрика Дж. О'Нила. Он может запутывать/сжимать и сжимать, и, похоже, это очень хорошо. Тем не менее, я никогда не пытался интегрировать его в сборку script любого типа.
Что касается обфускации против минимизации - я не большой поклонник первого. Это делает невозможным отладку (Ошибка в строке 1... "Подождите, есть только одна строка" ), и они всегда требуют времени для распаковки. Но если вам нужно... хорошо.
Ответ 12
Вы не можете защитить код на стороне клиента: просто нажмите F12 в Google Chrome, приостановите выполнение javascript, и вы получите все строки, даже зашифрованные. Украсить его и переименовать переменные, и вы получите почти исходный код.
Если вы пишете javascript на стороне сервера (например, NodeJS), вы боитесь, что кто-то взломает ваш сервер и захочет сделать работу хакера более сложной, предоставив вам больше времени, чтобы получить ваш доступ, а затем используйте компиляторы javacript:
Вам нужно использовать Closure Compiler for Advanced Compilation, поскольку он единственный инструмент, который переименовывает все ваши переменные, даже если они используются в нескольких файлах/модулях. Но у него просто проблема: она работает только в том случае, если вы пишете в ней стиль кодирования.
Ответ 13
Dean Edward Packer - отличный обфускатор, хотя он в первую очередь запутывает код, а не любые строковые элементы, которые у вас могут быть в вашем коде.
Смотрите: Онлайн-инструмент сжатия Javascript и выберите Пакер (Дин Эдвардс) из раскрывающегося меню
Ответ 14
Существует альфа-версия компрессора Obfuscator довольно хорошо, вы можете сообщить об ошибке cna, если после обфускации ваш код не запускается.
Обфускация javascript с грязным кодом
Ответ 15
Вы также можете попробовать это как альтернативу.
ObfuscateJS: Obfuscator Javascript
Ответ 16
Я бы предложил сначала минимизировать что-то вроде YUI Compressor, а затем преобразовать все строки и числа в значения HEX, используя что-то вроде http://www.javascriptobfuscator.com/
Таким образом, код будет практически недоступен для понимания, и я думаю, что на этом этапе потребуется больше времени, чтобы Хакер снова запустил ваш код, чем фактически, если он переписал с нуля. Переписывание и клонирование - это то, что вы не можете остановить. Ведь мы свободные люди!
Ответ 17
Я использую утилиту Closure-Compiler для обфускации java- script. Он минимизирует код и имеет больше возможностей для обфускации.
Эта утилита доступна в коде Google по адресу ниже:
Closure Tools
Но теперь дни, когда я слышу большую часть UglifyJS. Вы можете найти различное сравнение между Closure Compiler и UglifyJS, в котором Uglify кажется победителем.
UglifyJS: быстрый новый компрессор JavaScript для Node.js Thats On Par With Closure
Вскоре я бы дал шанс UglifyJS.
Ответ 18
Я использую Jasob в течение многих лет, и это руки вниз лучший obfuscator там.
Он имеет расширенный интерфейс, но все еще интуитивно понятен и прост в использовании.
Он также будет обрабатывать файлы HTML и CSS.
Лучший способ использовать это - префикс всех ваших личных переменных с чем-то вроде подчеркивания, затем используйте функцию sort
, чтобы сгруппировать их все вместе и проверить их как цели для обфускации.
Пользователи могут просматривать ваш источник, но гораздо труднее расшифровать, когда ваши частные переменные преобразуются из _sUserPreferredNickName
в a
.
Двигатель автоматически подсчитает количество целевых переменных и приоритизирует их, чтобы получить максимальное сжатие.
Я не работаю для Jasob, и я ничего не получаю от их продвижения, просто предлагая дружеский совет.
Недостатком является то, что он не свободен и немного дорогой, но все же стоит того, когда укладывается в альтернативу - "свободные" варианты даже не приближаются.
Ответ 19
Вы пробовали Bananascript? Он создает сильно сжатый и полностью нечитаемый код.
Ответ 20
Это одно уменьшает, но не запутывает. Если вы не хотите использовать командную строку Java, вы можете вставить свой javascript в веб-форму.
Ответ 21
У меня создается впечатление, что некоторые предприятия (например, JackBe) помещают зашифрованный код JavaScript внутри *.gif файлов, а не файлы JS, в качестве дополнительной меры обфускации.
Ответ 22
В качестве обфускатора/компрессора JavaScript/HTML/CSS вы также можете попробовать Patu Digua.
Ответ 23
Попробуйте этот инструмент Javascript Obfuscator
Я использовал его в своей игре с HTML5, и не только уменьшил его размер с 950 КБ до 150, но также сделал нечитаемые компиляторы закрытия исходного кода и minifiers обратимыми. Я лично не знаю, как отменить это обфускацию.
Ответ 24
Вам определенно стоит взглянуть на Obfuscriptor.
Я выхожу за пределы типичных трюков Javascript, которые мы видели из других инструментов, таких как YUI Compressor или Google Closure.
Обфусканный код больше похож на зашифрованный. В отличие от всего, что я видел раньше.
Ответ 25
Если вы используете библиотеку JavaScript, рассмотрите Dojo Toolkit, который совместим (после незначительных изменений) с компиляцией расширенного режима Closure Compiler.
Dojo - Библиотека только JavaScript
Совместимость с компилятором Closure
Код, скомпилированный с расширенным режимом Closure, практически невозможно перепроектировать, даже проходя через декодер, поскольку вся база кода (в том числе в библиотеке) запутана. В среднем он также составляет 25%.
JavaScript-код, который просто минимизирован (YUI Compressor, Uglify и т.д.), легко реконструировать после прохождения через декоратор.
Ответ 26
Я использовал это в прошлом, и он хорошо справляется. Это не бесплатно, но вам обязательно нужно взглянуть.
JavaScript Obfuscator и Encoder