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

714

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

Teifion
источник
15
Мне было бы интересно узнать причину, по которой вы пытаетесь запутать код, это может дать необходимый контекст, чтобы дать полезный ответ.
JohnFx
45
Единственный способ действительно сохранить что-то в секрете - не отправлять это клиенту . Если у них его нет, они не могут его прочитать. Отправка в зашифрованном виде - это просто вызов неприятностей от рук немногих людей, которые на самом деле заботятся, и все остальные не будут возиться, даже если вы отправите его в открытом виде (см. DRM).
Донал Феллоуз
8
Запутывать ваш код не очень хорошая идея. Это будет только доставлять неудобства законным пользователям (например, когда им нужно исправить ошибку) и ничего не делать, чтобы «защитить» ее от людей, которые имеют (финансовые) стимулы для ее реинжиниринга. В принципе невозможно предотвратить обратную разработку кода Javascript.
Свен Слотвег,
14
Аргумент не запутывать мне кажется ошибочным. Если вы действительно не думаете, что ваши пользователи могут исправлять / сообщать об ошибках, тогда вы должны это сделать. Это может уменьшить время загрузки путем минимизации. Это никогда не остановит действительно преданного хакера, но замедлит его / ее и остановит полузакрытые попытки взлома. Это очень легко сделать, и есть много инструментов (см. Другие ответы), я бы сказал, конечно, сделайте это, поскольку в большинстве случаев есть только преимущества, но не ожидайте, что это принесет реальную безопасность или остановит кого-то, кто копирует ваш код если они действительно хотят. Единственный способ сделать это - сохранить код на стороне сервера и использовать ajax.
Бенджамин

Ответы:

405

Obfuscation:

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

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

ОБНОВЛЕНИЕ: Этот вопрос первоначально задавался более 10 лет назад, и YUI больше не поддерживается. Google Closure Compiler все еще используется, и UglifyJS можно запустить локально через менеджер пакетов узла:npm install -g uglify-js

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

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

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

Примечание:

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

keparo
источник
32
Я хочу добавить, что выполнение кодирования base64 не принесет пользы для безопасности, поскольку это тривиально обратимая процедура. Даже шифрование не поможет, если оно расшифровано на стороне клиента. Единственный способ обеспечить безопасность строки - это видеть, что клиент ТОЛЬКО видит зашифрованную строку, и она передается
Claudiu
16
сервер для дальнейшей обработки.
Клавдиу
9
К вашему сведению, онлайн компрессор YUI можно найти здесь: refresh-sf.com/yui
mtness
7
Шифрование строковых значений принесет лишь немного больше пользы, чем base64-кодирование, если они должны быть расшифрованы браузером для их использования. Причина в том, что вам придется также дать браузеру ключ шифрования, и все, что браузер может сделать, может сделать и пользователь.
Бен
9
Когда я делаю минификацию с YUI Compressor, я проверяю, что он использует «безопасные» методы минимизации, то есть сохраняет точки с запятой --preserve-semi. Переписывание приватных переменных в a, b, c и т. Д. Обычно безопасно. Другая вещь, которую я делаю, - заставляет минификатор ставить разрыв строки после каждой точки с запятой в коде --line-break 0. Затем в производственном процессе, если он содержит ошибки, у меня меньше всего есть действующая контрольная строка, и я могу найти этот код в своей копии для разработки. В противном случае вы просто получите ошибку в массивной строке кода и не поймете, где ошибка.
Зуаллауз
136

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

JQuery недавно переключился с YUI Compresser на Closure Compiler и увидел « существенное улучшение »

Джейсон Холл
источник
60
да, но недавно они оставили компилятор Closure и теперь используют UglifyJS. Код JQuery был с ошибкой после сжатия компилятором закрытия
Chielus
Я хотел бы отметить, что если вы работаете с угловым. этот инструмент на самом деле не будет работать из-за внедрения зависимости и переименования аргументов, если только у меня нет флажка, который я не вижу.
iConnor
1
Полезный инструмент, но он не делает запутывания, поэтому, вероятно, никто другой не упомянул об этом.
Madbreaks
1
@ Разрушения с расширенной оптимизацией ( developers.google.com/closure/compiler/docs/api-tutorial3 ) уменьшат код до точки запутывания. Например, переменные могут быть переименованы для краткости.
Джейсон Холл
Гугл тоже не подходит для безопасности
Fillipo Sniper
121

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

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

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

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

Schwern
источник
14
+1 на юриста, но это может не сработать в других странах / юрисдикциях.
jmort253
16
Адвокаты, вероятно, создают больше затрат / проблем, чем утерянный код, очень тщательно обдумайте и выделите много денег для привлечения адвокатов !!
Андора
11
-1: Я считаю, что найти адвоката, который понимает JavaScript, было бы трудно ... Не говоря уже о гонорарах и количестве времени, необходимого для поиска "нарушителей". Может ли кто-то действительно нарушать лицензию, которая скрыта в файлах HTML / JavaScript, если он никогда ничего не подписывал? +1 за звонки AJAX.
Оповещение
12
@ Предупреждение 1) Лицензии в основном касаются предоставления материалов, защищенных авторским правом. У вас мало прав использовать его без лицензии. Вам не нужно подписывать его, чтобы получить права. Лицензия отличается от контракта. 2a) Поскольку речь идет о людях, копирующих и использующих HTML / Javascript без разрешения, лицензия не «закопана», она прямо там, где происходит изъятие. 2b) Вы не имеете права использовать чужой защищенный авторским правом материал без лицензии. 3) Адвокат не должен понимать Javascript, только закон об интеллектуальной собственности.
Шверн
4
@Alerty Не будь тупым. Речь идет о наказании тех, кто копирует файл для использования на своем сайте без разрешения. То, о чем вы говорите, это контракт, а не лицензия. Контракты требуют взаимного согласия и являются компромиссом. Лицензии предоставляют вам право на использование интеллектуальной собственности. Лицензии являются односторонним (владелец предоставляет вам вещи), вы не обязаны подписывать, потому что вы ничего не отдаете. Многие «Лицензионные соглашения на программное обеспечение» на самом деле являются контрактами, потому что они выходят за рамки лицензирования собственности и иногда приводят к таким нелепым вещам, как право предъявлять иск.
Schwern
49

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

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

Клаудиу
источник
45
Куда бы я ни пошел, самый распространенный ответ на вопрос «как я могу запутать мой Javascript?» это «вы не должны беспокоиться об этом, потому что кто-то может не запутать это». Это не совсем ответ.
Трэвис Уилсон,
2
@Vivek: Немного поздно, но я действительно имел в виду «серверный код». Яваскрипт можно запускать не в браузере, а на сервере, но я не знаю, насколько это распространено.
Клаудиу
8
@ Трэвис: я не говорил: «Не беспокойся об этом». Я только что сказал, что если вам нужна программа с закрытым исходным кодом, вы не захотите писать ее на клиентском javascript, потому что любая запутанность, которую вы делаете, не помешает (довольно легко) ее перепроектировать.
Клаудиу
8
Правильно. Который никоим образом не отвечает «как я могу запутать свой JavaScript». Запутывание не абстрактное понятие, это техническое. Оператор просто спросил "как?"
Madbreaks
2
@Madbreaks: вопрос заключался в том, чтобы не делать его код открытым исходным кодом. Непосредственный технический ответ является общепринятым, но лучший контекстный ответ (например, что вы на самом деле пытаетесь сделать?) - это, IMO, что у вас не может быть клиентского JavaScript, который не является открытым исходным кодом, потому что У каждого есть источник, независимо от того, как вы его запутываете. В любом случае оба ответа здесь, и люди могут прочитать и извлечь выгоду из обоих.
Клавдиу
45

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

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

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

  • JSMin - это инструмент, написанный Дугласом Крокфордом, который стремится минимизировать ваш источник JavaScript. По словам самого Крокфорда, «JSMin не запутывает, но он делает ужас». Его основная цель - уменьшить размер вашего источника для более быстрой загрузки в браузерах.

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

Том
источник
19
Поскольку код Javascript должен выполняться на компьютере клиента, его не просто сложно запутать до такой степени, что код не может быть изменен, но невозможен .
Шверн
20
это о статистике. по какому порогу кто-то собирается получить доступ к вашему коду с обфускацией и без нее? они все еще могут получить доступ, но чем выше порог, тем меньше людей. чем меньше людей знают о чем-то, тем безопаснее что-то. стандартная практика классификации безопасности.
Крис Стрингфеллоу
1
Поиск / замена @PeterR в текстовом редакторе значительно усложнит вашу жизнь, если вы попытаетесь ее прочитать или перепроектировать. это не идеально, но добавляет дополнительный уровень раздражения / сложности, удаляя подсказки контекста. большинство программистов не так умны, как вы, что делает это таким большим сдерживающим фактором.
SED
1
@SED Я не знаю ни одного программиста, который не мог бы найти / заменить кучу [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]переменных хотя бы [var1, var2,..]за одну минуту. Я могу буквально отключить, повторно сделать отступ и искать / заменять имена переменных в течение двух минут. И нет, я умнее обычного младшего. Простой факт заключается в том, что НЕТ способа скрыть JS на стороне клиента. Вы можете купить себе 5 минут, Макс, но это бесполезно. Этот материал на самом деле просто для того, чтобы продать кого-то, кто не знает код на добавленной «Безопасность». Никто, кто когда-либо писал линию JS, не купил бы это дерьмо.
Питер Р
3
@PeterR «Я могу буквально де-углифицировать, повторно сделать отступ и искать / заменить имена переменных в течение двух минут» - конечно, продолжайте и попробуйте это на многопроходной минимизированной, запутанной 20-мегабайтной пачке кодовой базы со структурой, которая принимает недели, чтобы разобраться даже с оригинальным, закомментированным исходным кодом. И чтобы сделать это еще сложнее, существуют инструменты запутывания, которые намеренно делают ваш код поврежденным, если отступы, строки и т. Д. Изменяются.
Джон Вайс
23

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

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

Это будет во второй части моего фальшивого / запутанного секретного кода JavaScript LAUNCHER. Тот, который вы видите в исходном коде.

Что означает этот код?

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

B. немного запутать код

Что это?

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

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

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

Что это за php код?

  1. Проверяет правильность реферера (домен / каталог / код вашего модуля запуска)
  2. Проверки на заказ HEADER
  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 SECRET, он, вероятно, доступен .. вам нужно определить их снаружи с помощью кода запуска и указания на вложенную функцию SECRET.

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

Я не уверен, что это работает, но я использую Chrome и проверил Элементы, Ресурсы, Сеть, Источники, Временную шкалу, Профили, Аудиты, но я не нашел строку выше.

примечание 1: если вы откроете URL Troll.php из Inspect element-> network в 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=';}; ?>
кокко
источник
1
о, да, я бы также запутал код JavaScript.
Cocco
1
Это то, о чем я только думал, троллинг взломщика. Я хотел бы видеть что-то подобное без использования PHP :)
pgarciacamou
6
Даже если это смешно, веб-разработчик, способный правильно осмотреть сайт, может каким-то образом получить исходный код. Я действительно думаю, что нет способа скрыть какие-либо данные в тот момент, когда вы размещаете их в Интернете.
кокко
Это не какая-то запутанность, я думаю. однако знает, как открыть консоль, он может также знать о кодировке / декодировании base64, очень просто.
Т.Тодуа
19

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

Энтони
источник
7
Подписка на JScrambler очень и очень дорогая ... Самая дешевая подписка требует минимум 3 месяца, цена $ 145 - это безумие.
Барбушин
1
Теперь у них есть бесплатный план. Другие планы подписки все еще такие дорогие.
user7610
2
Бесплатный план включает только оптимизацию и минификацию.
Жан Хоминал
1
«Бесплатный план включает оптимизацию и минимизацию», да нет. Запутывание и оптимизация не идут вместе, извините.
Ник Ньюман
2
Глядя на сайт JScrambler сегодня и более того ценовые планы, я не вижу бесплатный вариант. Только бесплатная пробная
версия
18

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

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

PhiLho
источник
17

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

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

Томас Бонини
источник
5
не следует ли проверять ваш код на наличие ошибок и несовместимости в любом случае, прежде чем запутывать ?? не имеет ничего общего с запутыванием на самом деле
phil294
13

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

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

Вокруг множество инструментов, но у большинства есть причина «компрессор» (или «минификатор») в названии по определенной причине.

DBR
источник
11

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

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

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

Густаво Родригес
источник
Закрытие компиляции не запутывает код: P
NiCk Newman
1
Он не предназначен для этого, но работает хорошо: он не добавляет дополнительный код, как некоторые компиляторы (который обычно можно перевернуть с помощью приведенных мной инструментов), но меняет его на необычные способы, некоторые даже трудно отменить, и удаляет неиспользуемые код, который по сравнению с реальной обфускацией хорош для производительности.
Густаво Родригес
1
Не хорошая идея. Сокращение / компиляция кода на стороне сервера может привести к проблемам с безопасностью, если у минификатора есть ошибка: zyan.scripts.mit.edu/blog/backdooring-js
mgol
Приведенная вами ошибка относится только к UglifyJS: она не относится к Closure Compiler.
Густаво Родригес
Для всех тех, кто заботится о минимизации файлов javascript, есть также не минимизатор javascript. так что я не думаю, что это вообще уровень безопасности
Филлипо Снайпер
11

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

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

Цветомир Цонев
источник
1
Но запутывание не обязательно сжимает его до одной строки, это может быть так же просто, как изменить имя функции и переменной или преобразовать строки в base64. Сокращение помещает весь код в одну строку.
rw-nandemo
В настоящее время UglifyJS кажется лучшим выбором. Автор тоже классный парень! :)
Цветомир Цонев
Что касается отладки, вы можете в основном генерировать исходные карты, которые вы можете включить при тестировании, чтобы вы могли видеть, в какой строке произошла ошибка, даже если она минимизирована.
Лука Стиб
5

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

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

Динамит Блицер
источник
5

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

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

smdrager
источник
Это бессмысленно. Его можно легко распаковать с помощью jsbeautifier.org
Maciej Krawczyk
4

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

xgMz
источник
4

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

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

Jerczu
источник
4

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

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

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

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

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

Matt
источник
Похоже, Джейсон скорее минатор, чем обфускатор. Я что-то пропустил?
Алан Макби - MSFT
4

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

niutech
источник
18
он хорошо сжимает код, но просто измените eval()в последней строке значение на, console.log()и ваша консоль
вылетит
4

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

Но сейчас я много слышу о UglifyJS. Вы можете найти различные сравнения между Closure Compiler и UglifyJS, в которых Uglify кажется победителем.
UglifyJS: быстрый новый JavaScript-компрессор для Node.js, который наравне с закрытием

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

shaILU
источник
3

В качестве обфускатора / компрессора JavaScript / HTML / CSS вы также можете попробовать Patu Digua .

Адриан
источник
3

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

Крис С
источник
1
Примечание: ссылка теперь не работает.
Скотт С. Уилсон,
1
@ScottWilson спасибо, обновил его
Крис С
2

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

Я не ограничиваюсь типичными приемами минимизации Javascript, которые мы видели в других инструментах, таких как YUI Compressor или Google Closure .

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

Майк
источник
Спасибо за ссылку! Только что попробовал obfuscriptor и код действительно зашифрован (без ключа ???). И сжал мой скрипт с 211 до 36 Кб!
Обратите внимание, что Obfuscriptor предупреждает вас, что он не работает с IE. Для некоторых это нарушение соглашения.
Алан Макби - MSFT
1
Ссылка на ответ больше не указывает на инструмент. Я не могу найти другую живую ссылку на это.
Buzoherbert
первая ссылка мертва «Обфускриптор»
Алп Алтунель
2

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

Dojo - единственная библиотека JavaScript, совместимая с компилятором Closure

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

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

Стивен Чунг
источник