Как я могу запутать (защитить) JavaScript? [закрытый]

Я хочу сделать приложение JavaScript, которое не является открытым исходным кодом, и поэтому я хочу узнать, как можно запутать мой код JS? Возможно ли это?

24 ответов


обфускации:

попробовать Юи компрессора. Это очень популярный инструмент, построенный, усовершенствованный и поддерживаемый командой Yahoo UI.

вы также можете использовать:

Частные Строковые Данные:

сохранение строковых значений private-это другая проблема, и обфускация не будет действительно много пользы. Конечно, упаковав свой источник в искаженный, уменьшенный беспорядок, у вас есть легкая версия безопасность через безвестности. Большую часть времени ваш пользователь просматривает источник, а строковые значения на клиенте предназначены для их использования, поэтому такое частное строковое значение часто не требуется.

Если бы у вас действительно было значение, которое вы никогда не хотели, чтобы пользователь видел, у вас было бы несколько вариантов. Во-первых, ты может сделать какое-то шифрование, которое расшифровывается при загрузке страницы. Это, вероятно, будет один из самых безопасных вариантов, но и много работы, которая может быть ненужной. Вероятно, вы могли бы base64 кодировать некоторые строковые значения, и это было бы проще.. но кто-то, кто действительно хотел эти строковые значения, мог легко расшифровать их. Шифрование-единственный способ действительно предотвратить доступ к вашим данным, и большинство людей считают, что это более безопасно, чем они необходимость.

Sidenote:

обфускация в Javascript, как известно, вызывает некоторые ошибки. Обфускаторы становятся немного лучше об этом, но многие наряды решают, что они видят достаточно пользы от сокращение и gzipping, и добавленные сбережения запутывания не всегда стоит проблема. Если вы пытаетесь защитить свой источник, возможно, вы решите, что это стоит вашего времени, просто чтобы сделать свой код труднее читать. помощью jsmin является хорошей альтернативой.


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

jQuery недавно переключился с Yui Compresser на компилятор закрытия и увидел "значительное улучшение"


обфускация никогда не может работать. Для тех, кто действительно хочет получить ваш код, это просто лежачий полицейский. Хуже того, он не позволяет пользователям исправлять ошибки (и отправлять исправления обратно вам) и затрудняет диагностику проблем в этой области. Это пустая трата времени и денег.

поговорите с адвокатом о праве интеллектуальной собственности и о том, каковы ваши юридические варианты. "С Открытым Исходным Кодом" не означает ,что "люди могут читать источник". Вместо этого, Open Source конкретная модель лицензирования, предоставляющая разрешение на свободное использование и изменение кода. Если вы не предоставляете такую лицензию, люди, копирующие ваш код, нарушают ее, и (в большинстве стран мира) у вас есть законные возможности остановить их.

единственный способ защитить ваш код-не отправлять его. Переместите важный серверный код и попросите свой общедоступный код Javascript выполнить вызовы Ajax к нему.

см. мой полный ответ о обфускаторах здесь.


вы можете запутать источник javascript все, что хотите, но он всегда будет реверсивно-движимым только в силу того, что требуется, чтобы весь исходный код фактически запускался на клиентской машине... лучший вариант, который я могу придумать,-это вся ваша обработка с помощью серверного кода, а все, что делает клиентский код javascript, - это отправлять запросы на обработку самому серверу. В противном случае любой человек всегда сможет отслеживать все операции, которые выполняет код.

кто-то упоминается в base64, чтобы держать струны в безопасности. Это ужасная идея. Base64 сразу распознается по типам людей,которые хотели бы перепроектировать ваш код. Первое, что они сделают, это раскодируют его и посмотрят, что это такое.


существует ряд инструментов обфускации JavaScript, которые свободно доступны; однако я думаю, что важно отметить, что трудно запутать JavaScript до такой степени, что он не может быть реверсивно спроектирован.

с этой целью есть несколько вариантов, которые я использовал в некоторой степени сверхурочно:

  • Юи компрессора. Компания Yahoo!JavaScript-компрессор хорошо конденсирует код, который улучшит время загрузки. Там небольшой уровень обфускации, который работает относительно хорошо. По сути, компрессор изменит имена функций, удалит пробелы и изменит локальные переменные. Это то, что я использую чаще всего. Это инструмент на основе Java с открытым исходным кодом.

  • помощью jsmin это инструмент, написанный Дугласом Крокфордом, который стремится минимизировать ваш источник JavaScript. По словам самого Крокфорда, " JSMin не запутывает, но уродует."Это основная цель, чтобы уменьшить размер вашего источник для более быстрой загрузки в браузерах.

  • Бесплатный JavaScript Obfuscator. Это веб-инструмент, который пытается запутать ваш код, фактически кодируя его. Я думаю, что компромиссы его формы кодирования (или запутывания) могут прийти за счет размера файла; однако это вопрос личных предпочтений.


что бы я сделал:

А. Тролль хакер!

это будет во второй части моей поддельной / запутанной секретной пусковой установки кода javascript. Тот, который вы видите в исходном коде.

что делает этот код?

  1. загружает реальный код
  2. задает заголовок
  3. публикует пользовательскую переменную

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'});
}

Б. запутать код a мало

что это?

  1. это один и тот же код, что и выше в base64
  2. это не секретный код javascript

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

C создать жесткий для отображения php файл с реальным кодом внутри

что делает этот php-код?

  1. проверяет правильность реферера (домен/dir / код вашего лаунчера)
  2. проверяет таможня Заголовок
  3. проверяет пользовательскую переменную 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

секретный javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

фейк = window.open('', '_self', '');window.close();

сейчас .. если вы определяете обработчики событий в секретном javascript, это, вероятно, доступно.. вы должны определить их снаружи с помощью launchcode и указывая к вложенной секретной функции.

так... есть ли простой способ получить код? document.body.appendChild(document.createElement('div')).innerText='Awesome';

я не уверен, что это работает, но я использую chrome и проверенные элементы,ресурсы,сеть,источники,временную шкалу,профили,аудиты, но я не нашел строку выше.

Примечание 1: Если u открыть Тролль.PHP url из Inspect element - >network в chrome вы получаете поддельный код.

note2: весь код написан для современных браузеров. polyfill нужно много еще код.

редактировать

лаунчер.HTML-код

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

Троль.в 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=';}; ?>

попробовать JScrambler. Недавно я дал ему вращение и был впечатлен им. Он предоставляет набор шаблонов для обфускации с предопределенными настройками для тех, кто не заботится о деталях и просто хочет сделать это быстро. Вы также можете создать пользовательскую запутанность, выбрав любые преобразования / методы, которые вы хотите.


проблема с интерпретируемыми языками заключается в том, что вы отправляете источник, чтобы заставить их работать (если у вас нет компилятора для байт-кода, но опять же, довольно тривиально декомпилировать).

поэтому, если вы не хотите жертвовать производительностью, вы можете действовать только на имена переменных и функций, например. заменив их на a, b... aa, ab... или a101, a102 и т. д. И, конечно же, удалите столько места / новых линий, сколько сможете (это то, что делают так называемые компрессоры JS).
Обфускация строк есть хит производительности, если вам нужно зашифровать их и расшифровать в режиме реального времени. Кроме того, отладчик JS может отображать конечные значения...


вопреки большинству других ответов, которые я предлагаю против компрессора YUI; вы должны использовать Закрытие Google.

Не так много, потому что он сжимает больше, но в основном потому, что он будет ловить ошибки javascript, такие как a = [1,2,3,]; которые делают IE идти с ума.


приложение на основе Javascript с открытым исходным кодом довольно глупо. Javascript-это интерпретируемый язык на стороне клиента.. Обфускация-не лучшая защита..

JS obfuscation обычно делается для уменьшения размера скрипта, а не для его" защиты". Если вы находитесь в ситуации, когда вы не хотите, чтобы ваш код был общедоступным, Javascript не является правильным языком..

есть много инструментов вокруг, но большинство из них имеют слово "компрессор" (или "minifier") в своем названии для причина..


вы не можете защитить код на стороне клиента: просто нажмите F12 в Google Chrome, приостановить выполнение javascript и вы получите все строки, даже те, что зашифрованы. украшения и переименовать переменные и вы получите практически оригинальный код.

Если вы пишете серверный javascript (т. е. NodeJS) боится, что кто-то взломает ваш сервер и хочет сделать работу хакера более сложной, давая вам больше времени, чтобы получить доступ обратно, то использовать компиляторы javacript:

вам нужно использовать компилятор закрытия в расширенной компиляции, так как это единственный инструмент, который переименовывает все ваши переменные, даже если они используются в нескольких файлах/модулях. Но у него просто есть проблема: он работает, только если вы пишете в нем кодирование стиле.


Я могу порекомендовать Утилита JavaScript Патрик Дж. О'Нил. Он может запутать / компактировать и сжимать, и кажется, что это довольно хорошо. Тем не менее, я никогда не пытался интегрировать его в какой-либо сценарий сборки.

Что касается обфускации против минимизации - я не большой поклонник первого. Это делает невозможной отладку (ошибка в строке 1... "подождите, есть только одна строка"), и они всегда занимают время, чтобы распаковать. Но если понадобится... что ж.


упаковщик Дина Эдварда-отличный обфускатор, хотя он в первую очередь запутывает код, а не любые строковые элементы, которые могут быть в вашем коде.

посмотреть: Онлайн Инструмент Сжатия Javascript и выберите Packer (Dean Edwards) из выпадающего списка


Я бы предложил сначала минимизировать что-то вроде компрессора YUI, а затем преобразовать все строки и числа в шестнадцатеричные значения, используя что-то вроде http://www.javascriptobfuscator.com/

с этим код будет почти невозможно понять, и я думаю, что на этом этапе хакеру потребуется больше времени, чтобы повторно ввести ваш код, чем на самом деле, если он переписал с нуля. Переписывание и клонирование-это то, что вы не можете остановить. Ведь мы свободные люди !


Я использую Jasob в течение многих лет, и это руки вниз лучший обфускатор там.
Он имеет расширенный интерфейс, но по-прежнему интуитивно понятен и прост в использовании.
Он также будет обрабатывать файлы HTML и CSS.

лучший способ использовать его, чтобы префикс все ваши частная переменные с чем-то вроде подчеркивания, затем используйте sort, чтобы сгруппировать их все вместе и Регистрация их в качестве объектов для запутывания.

пользователи все еще могут просматривать ваш источник, но гораздо сложнее расшифровать, когда ваши личные переменные преобразуются из чего-то вроде _sUserPreferredNickName to a.

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

Я не работаю на Jasob, и я ничего не получаю от продвижения их, просто предлагая некоторые дружеские советы.
Недостатком является то, что это не бесплатно и немного дорогой, но все же стоит того, когда он сложен против альтернатив - "бесплатные" варианты даже не приближаются.


вы пробовали Bananascript? Он производит сильно сжатый и совершенно нечитаемый код.


Я использую утилиту Closure-Compiler для обфускации java-скрипта. Он уменьшает код и имеет больше возможностей для запутывания. Эта утилита доступна в Google code по адресу ниже URL:
Инструменты Закрытия

но теперь дни я слышу много UglifyJS. Вы можете найти различное сравнение между компилятором закрытия и UglifyJS, в котором Uglify кажется победителем.
UglifyJS: Быстрый Новый Компрессор JavaScript Для Узла.js, который на одном уровне с Закрытие

скоро я бы дал шанс UglifyJS.


У меня сложилось впечатление, что некоторые предприятия (например: JackBe) помещают зашифрованный код JavaScript внутри *.gif-файлы, а не JS-файлы, в качестве дополнительной меры запутывания.


в качестве JavaScript / HTML / CSS obfuscator / compressor вы также можете попробовать Digua Пату.


попробуйте этот инструмент Javascript Obfuscator

Я использовал его в своей игре HTML5 не только уменьшил его размер с 950KB до 150, но и сделал исходный код нечитаемым компиляторы закрытия и минификаторы обратимы я лично не знаю, как отменить это запутывание.


вы определенно должны рассмотреть возможность взглянуть на Obfuscriptor.

Я выходит за рамки типичных Javascript minifying трюков, которые мы видели из других инструментов, таких как Юи компрессора или Закрытие Google.

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


это minifies но не скрыть. Если вы не хотите использовать Java командной строки, вы можете вставить javascript в веб-форму.


Если вы используете библиотеку JavaScript, рассмотрите Dojo Toolkit, который совместим (после незначительных изменений) с компиляцией расширенного режима компилятора закрытия.

Dojo-Единственная Библиотека JavaScript Совместимость с компилятором закрытия

код, скомпилированный с расширенным режимом закрытия, почти невозможно перепроектировать, даже проходя через beautifier, как весь базовый код (includinhg библиотеки) запутанным. Это также 25% небольшие в среднем.

код JavaScript, который просто минимизируется (компрессор YUI, Uglify и т. д.) легко реверсивный инженер после прохождения через beautifier.


Я использовал это в прошлом, и он делает хорошую работу. Это не бесплатно, но вы определенно должны взглянуть.
JavaScript Obfuscator & Encoder