Як я можу приховати (захистити) JavaScript? [зачинено]


714

Я хочу зробити програму JavaScript, яка не є відкритим кодом, і, таким чином, я хочу дізнатися, як можна приховати свій JS-код? Чи можливо це?


15
Мені буде цікаво почути причину, коли ви намагаєтесь придушити код, це може дати якийсь необхідний контекст, щоб дати корисну відповідь.
JohnFx

45
Єдиний спосіб по-справжньому зберегти щось в секреті - це не надсилати його клієнту . Якщо їх немає, вони не можуть його прочитати. Надсилати його в зашифрованому вигляді - це просто просити неприємності в руках нечисленних людей, які насправді хвилюються, і всі інші не будуть кидатися навколо, навіть якщо ви надішлете його в чистому порядку (див. DRM).
Стипендіати доналу


8
Пошкодження коду - це не дуже гарна ідея. Це лише спричинить незручності законним користувачам (наприклад, коли їм потрібно виправити помилку), і не зробить нічого, щоб «захистити» його від людей, які мають (фінансовий) стимул зробити його реверсивним. Це принципово неможливо запобігти реверс-інжиніринг Javascript коду.
Sven Slootweg

14
Аргумент не заперечувати здається мені хибним. Якщо ви дійсно не думаєте, що ваші користувачі можуть виправити / повідомити про помилки, тоді вам слід це зробити. Це може зменшити час завантаження за рахунок мінімізації. Він ніколи не зупинить справді відданого хакера, але він сповільнить його / її, і він зупинить напівспроможні спроби злому. Це зробити дуже просто, і є багато інструментів (див. Інші відповіді), я б сказав, звичайно, це робити, оскільки у більшості випадків є лише переваги, але не сподівайтеся, що це забезпечить справжню безпеку або зупинить, щоб хтось копіював ваш код якщо вони дуже хочуть. Єдиний спосіб зробити це - тримати сторону сервера коду та використовувати ajax.
Бенджамін

Відповіді:


404

Опущення:

Спробуйте компресор YUI . Це дуже популярний інструмент, розроблений, вдосконалений та підтримуваний командою Yahoo UI.

Ви також можете використовувати:

ОНОВЛЕННЯ: Спочатку це питання задавали більше 10 років тому, і YUI більше не підтримується. Компілятор закриття Google все ще використовується, і UglifyJS можна запустити локально через менеджер пакетів вузлів:npm install -g uglify-js

Дані приватних рядків:

Збереження приватних значень рядків - це інша проблема, і затуплення насправді не принесе користі. Звичайно, упакувавши своє джерело у пошкоджений, мінімізований безлад, ви маєте легку версію безпеки через незрозумілість . Здебільшого саме ваш користувач переглядає джерело, а рядкові значення клієнта призначені для їх використання, тому подібне значення приватних рядків часто не потрібно.

Якби у вас дійсно було значення, яке ви ніколи не хотіли, щоб користувач бачив, у вас було б кілька варіантів. По-перше, ви можете зробити якесь шифрування, яке розшифровується при завантаженні сторінки. Це, мабуть, було б одним із найбезпечніших варіантів, але також багато роботи, яка може бути непотрібною. Можливо, ви могли б base64 кодувати деякі рядкові значення, і це було б простіше .. але хтось, хто дійсно хотів ці рядкові значення, може легко їх розшифрувати . Шифрування - єдиний спосіб по-справжньому не допустити доступу будь-кого до ваших даних, і більшість людей вважають, що це більш безпечно, ніж потрібно.

Sidenote:

Як відомо, неясність у Javascript викликає деякі помилки. У обфуськатор отримують трохи краще про це, але багато наряди вирішують , що вони бачать досить вигоди від Мінімізація та gzipping , і додав економія заплутування не завжди варта свічок . Якщо ви намагаєтесь захистити своє джерело, можливо, ви вирішите, що воно варте вашого часу, просто щоб ваш код важче читався. JSMin - хороша альтернатива.


32
Хочу додати, що виконання кодування base64 не принесе користі безпеці, оскільки це тривіально зворотна процедура. Навіть шифрування не допоможе, якщо воно розшифроване на стороні клієнта. Єдиний спосіб забезпечити безпеку рядка - це клієнт ТОЛЬКО бачити зашифрований рядок, і він передається
Клавдіу,

16
сервер для подальшої обробки.
Клавдіу

9
FYI, онлайн-компресор YUI можна знайти тут: refresh-sf.com/yui
mtness

7
Шифрування значень рядків буде мати лише корисніше користь, ніж кодування їх base64, якщо їх потрібно розшифрувати браузеру для їх використання. Причина полягає в тому, що вам доведеться також надати браузеру ключ шифрування, і все, що може зробити користувач, може і користувач.
Бен

9
Коли я роблю мінімізацію за допомогою компресора YUI, я переконуюсь, що він використовує "безпечні" методи мінімізації, тобто він зберігає напівколонки --preserve-semi. Перезапис приватних змінних у параметри a, b, c тощо зазвичай є безпечним. Ще одна річ, яку я роблю, - це змусити мініфікатор поставити перерву рядка після кожної крапки з комою в коді --line-break 0. Тоді у виробництві, якщо він помиляється, у мене принаймні є дійсна контрольна лінія, з якої можна працювати, і я можу знайти цей код у своїй розробці. В іншому випадку ви просто виявите помилку в масивному рядку коду і не маєте уявлення, де помилка.
zuallauz

136

Я дивуюсь, що ніхто не згадав про компілятор закриття Google . Він не просто мінімізує / стискає, він аналізує, щоб знайти та видалити невикористаний код, і переписує для максимального мінімізації. Він також може перевірити тип і попередить про синтаксичні помилки.

Нещодавно JQuery перейшов з компресора YUI на компілятор закриття і побачив " суцільне поліпшення "


60
так, але нещодавно вони покинули компілятор Closure і зараз використовують UglifyJS. Код JQuery виявився баггі після стискання компілятора закриття
Chielus

Я хотів би зазначити, що якщо ви працюєте з кутовими. цей інструмент насправді не працюватиме через введення залежності та перейменування аргументів, якщо тільки немає прапорця, якого я не бачу.
iConnor

1
Корисний інструмент, але він не заплутається, тому, мабуть, ніхто інший його не згадував.
Madbreaks

1
@Madbreaks з розширеними оптимізаціями ( developers.google.com/closure/compiler/docs/api-tutorial3 ) дозволить мінімізувати код до точки затухання. Змінні можуть бути перейменовані, наприклад, для стислості.
Джейсон Хол

Google також не є безпечним варіантом
Fillipo Sniper

121

Заплутаність ніколи насправді не може спрацювати. Для всіх, хто дійсно хоче отримати ваш код, це просто швидкість. Що ще гірше, це заважає вашим користувачам не виправляти помилки (і доставляти виправлення до вас), а також ускладнює діагностику проблем у цій галузі. Це марна трата вашого часу та грошей.

Порадьтеся з юристом про право інтелектуальної власності та які ваші правові варіанти. "Відкритий код" не означає "люди можуть читати джерело". Натомість Open Source - це конкретна модель ліцензування, яка дає дозвіл на вільне використання та зміну вашого коду. Якщо ви не надаєте таку ліцензію, тоді люди, що копіюють ваш код, порушують, і (у більшості країн світу) у вас є законні можливості їх припинити.

Єдиний спосіб дійсно захистити свій код - це не надсилати його. Перемістіть важливий сервер коду та запросіть свій загальнодоступний код Javascript на Ajax.

Дивіться мою повну відповідь про обскураторів тут.


14
+1 про юриста, але це може не працювати в інших країнах / юрисдикціях.
jmort253

16
Юристи, ймовірно, створюють більше витрат / проблем, ніж втрачений код, продумайте дуже ретельно і влаштуйте багато грошей, щоб залучити юристів !!
andora

11
-1: Я вважаю, що знайти юриста, який розуміє JavaScript, буде важко ... Не кажучи вже про гонорари та кількість часу, необхідного для пошуку "порушників". Чи дійсно хтось може порушувати ліцензію, яка похована у файлах HTML / JavaScript, якщо він ніколи нічого не підписував? +1 для дзвінків AJAX.
Алерті

12
@Alerty 1) Ліцензії в основному стосуються надання матеріалів, захищених авторським правом. Ви маєте мало права користуватися ним без ліцензії. Вам не потрібно підписувати його, щоб отримати права. Ліцензія відрізняється від контракту. 2а) Оскільки питання стосується того, що люди копіюють та користуються HTML / Javascript без дозволу, ліцензія не "закопується", вона знаходиться прямо там, про що робиться. 2b) Ви маєте мало права використовувати чужі захищені авторським правом матеріали без ліцензії. 3) Адвокату не потрібно розуміти Javascript, а лише закон про інтелектуальну власність.
Schwern

4
@Alerty Не будь тупим. Йдеться про покарання тих, хто копіює файл для використання на власному сайті без дозволу. Те, про що ви говорите, - це контракт, а не ліцензія. Контракти вимагають взаємної згоди і є перевагою. Ліцензії надають право на використання інтелектуальної власності. Ліцензії - це один спосіб (власник дарує вам речі), підписувати вас не потрібно, оскільки ви нічого не віддаєте. Багато "ліцензійних угод на програмне забезпечення" насправді є договорами, оскільки вони виходять за рамки ліцензування власності, а також іноді смішні речі, такі як право подавати позов.
Шверн

49

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

Хтось згадав base64, щоб захистити рядки. Це жахлива ідея. Base64 одразу впізнається за типом людей, які хочуть змінити інженерний код. Перше, що вони зроблять - це розкодувати його і подивитися, що це таке.


45
Куди б я не поїхав, найпоширеніша відповідь на тему "як я можу приховати Javascript?" "Ви не повинні турбуватися з цього приводу, тому що хтось може його знеструмити". Це насправді не відповідь.
Тревіс Вілсон

2
@Vivek: Трохи пізно, але я дійсно мав на увазі "код на стороні сервера". Можна запускати javascript не в браузері, а лише на сервері, але я не знаю, наскільки це часто.
Клавдіу

8
@Travis: Я не сказав "ти не повинен про це турбуватися". Я щойно сказав, що якщо ви хочете програму з закритим кодом, ви не збираєтесь писати її в JavaScript на стороні клієнта, тому що будь-яка обфускація, яку ви робите, не завадить їй зробити (досить легко) реверсивну інженерію.
Клавдіу

8
Правильно. Який жодним чином не відповідає "як я можу приховати свій JavaScript". Заплутаність - це не абстрактне поняття, а технічне. Оп просто запитав "як?"
Madbreaks

2
@Madbreaks: Питання полягало в тому, щоб не робити його кодом відкритим кодом. Безпосередня технічна відповідь прийнята, але краща відповідь у контексті (як у тому, що ви насправді намагаєтесь зробити?) - IMO, що у вас не може бути JavaScript на стороні клієнта, який не є відкритим кодом, оскільки у всіх є джерело, незалежно від того, як ви його притуплюєте. У будь-якому випадку обидва відповіді є тут, і люди можуть читати та отримувати користь з обох.
Клавдіу

45

Є ряд інструментів обфускування JavaScript, які є у вільному доступі; однак, я думаю, що важливо відзначити, що важко заплутати JavaScript до того моменту, коли він не може бути реверсованим.

З цією метою є кілька варіантів, якими я певною мірою користувався:

  • Компресор YUI . Компресор JavaScript Yahoo! Хороша робота з конденсації коду, що покращить його час завантаження. Існує невеликий рівень затуплення, який працює відносно добре. По суті, компресор буде змінювати назви функцій, видаляти пробіли та змінювати локальні змінні. Це те, чим я користуюсь найчастіше. Це інструмент на основі Java з відкритим кодом.

  • JSMin - це інструмент, написаний Дугласом Крокфордом, який прагне мінімізувати джерело JavaScript. За власними словами Крокфорда, "JSMin не притуплює, але робить неприємним". Основна його мета - мінімізувати розмір джерела для швидшого завантаження в браузерах.

  • Безкоштовний JavaScript Obfuscator . Це веб-інструмент, який намагається придушити ваш код, фактично кодуючи його. Я думаю, що компроміси його форми кодування (або затуманення) можуть відбутися ціною розміру файлів; однак це питання особистої переваги.


19
Оскільки Javascript-код повинен працювати на машині клієнта, не просто важко заплутатися до того моменту, коли код не може бути реверсованим, але неможливо .
Шверн

20
йдеться про статистику. який поріг, через який хтось збирається отримати доступ до вашого коду із затуманенням і без нього? вони ще можуть отримати доступ, але чим вище поріг, тим менше людей. чим менше людей знає про щось, тим безпечніше щось. стандартна практика класифікації безпеки.
Cris Stringfellow

1
Пошук / заміна @PeterR в текстовому редакторі зробить ваше життя набагато складнішим, намагаючись прочитати його або змінити інженер. це не ідеально, але додає додатковий шар роздратування / складності, видаляючи контекстні підказки. Більшість програмістів не такі розумні, як ви, саме це робить цей чудовий стримуючий фактор.
СЕР

1
@SED Я не знаю жодного програміста, який не міг би знайти / замінити купу [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]вар принаймні [var1, var2,..]протягом однієї хвилини. Я можу буквально знеструмлювати, повторно відступати та шукати / замінювати імена var протягом двох хвилин. І ні, я розумніший за пересічного молодшого Дева. Простий факт полягає в тому, що немає жодного способу затьмарити клієнтську сторону JS. Ви можете придбати собі 5 хвилин, MAX, але це не приносить користі. Цей матеріал справді просто продати тому, хто не знає код на доданій "Безпеці". Ніхто, хто ніколи не писав рядок JS, не купив би цього лайна.
Пітер Р

3
@PeterR "Я можу буквально знерухомити , повторно відступити та шукати / замінювати імена var протягом двох хвилин", - впевнено, продовжуйте і спробуйте це у багатопрохідному мінімізованому, затуманеному 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 referer = http://here.is/my/launcher.html

ТАЙНИЙ javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

FAKE = window.open('', '_self', '');window.close();

Тепер .. якщо ви визначаєте обробники подій у javascript SECRET, він, ймовірно, доступний .. вам потрібно визначити їх зовні за допомогою коду запуску та вказувати на вкладену функцію SECRET.

Так ... чи є простий спосіб отримати код? document.body.appendChild(document.createElement('div')).innerText='Awesome';

Я не впевнений, чи працює це, але я використовую хромовані та перевірені елементи, ресурси, мережу, джерела, часову шкалу, профілі, аудити, але я не знайшов рядок вище.

Примітка1: якщо ви відкриєте URL-адресу Troll.php з мережі Перевірити елемент-> в хромі, ви отримаєте підроблений код.

Примітка2: весь код написаний для сучасних браузерів. polyfill потрібно набагато більше коду.

EDIT

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.
кокко

1
Це те, про що я тільки думав, тролюючи сухаря. Я хотів би побачити щось подібне без використання PHP :)
pgarciacamou

6
Навіть якщо це смішно, веб-розробник, який вміє правильно перевірити сайт, може якось отримати вихідний код. Я дійсно думаю, що немає можливості приховати будь-який тип даних в той момент, коли ви розміщуєте їх в Інтернеті.
кокко

Я не думаю, що це будь-який вид омертвіння. однак знає, як відкрити консоль, він також може знати про кодування / декодування base64, дуже просто.
Т.Тодуа

19

Спробуйте JScrambler . Нещодавно я дав йому віджимання і був вражений ним. Він надає набір шаблонів для притуплення із заздалегідь заданими налаштуваннями для тих, хто не надто дбає про деталі та просто хоче це швидко зробити. Ви також можете створити власну обфускування, вибравши будь-які перетворення / методи, які ви хочете.


7
Підписка на JScrambler дуже дорога ... Найдешевша підписка вимагає мінімум 3-місячну ціну 145 доларів - це божевільна.
barbushin

1
Тепер у них вільний план. Інші плани передплати все ще такі цінні.
користувач7610

2
Вільний план включає лише оптимізацію та мінімізацію.
Жан Хомінал

1
"Вільний план включає оптимізацію та мінімізацію", так, ні. Заплутаність та оптимізація не йдуть разом, вибачте.
NiCk Newman

2
Переглядаючи веб-сайт JScrambler сьогодні та більше, тому цінові плани, я не бачу безкоштовного варіанту. Лише безкоштовна пробна версія ..
KDT

18

Проблема з інтерпретованими мовами полягає в тому, що ви надсилаєте джерело, щоб змусити їх працювати (якщо у вас немає компілятора для байт-коду, але знову ж таки, це досить тривіально для декомпіляції).

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


17

Всупереч більшості інших відповідей, які я пропоную проти YUI Compressor; ви повинні використовувати Google Closing .

Не багато тому, що він стискає більше, а здебільшого тому, що він сприймає помилки javascript, наприклад, a = [1,2,3,];які змушують IE переходити у мережу.


5
не слід перевіряти свій код на помилки та несумісність будь-яким способом, перш ніж обдумувати ?? не має нічого спільного з
омраченням

13

Додаток, що не працює з відкритим кодом, заснований на Javascript, є досить нерозумним. Javascript - мова, що інтерпретується на стороні клієнта.

Обфускування JS зазвичай робиться для зменшення розміру сценарію, а не для "захисту". Якщо ви знаходитесь в ситуації, коли ви не хочете, щоб ваш код був відкритим, Javascript - це не потрібна мова.

Навколо є багато інструментів, але більшість з них має назву слово "компресор" (або "мініфікатор").


11

Ви не можете захистити код клієнтської сторони: просто натисніть F12 на Google Chrome, призупиніть виконання JavaScript, і ви отримаєте всі рядки, навіть ті, що зашифровані. Прикрасьте його і перейменуйте змінні, і ви отримаєте майже оригінальний код.

Якщо ви пишете javascript на сервері (тобто NodeJS), боїтесь, щоб хтось увірвався на ваш сервер, і хочете ускладнити роботу хакера, надаючи більше часу для повернення доступу, тоді використовуйте компілятори javacript :

Вам потрібно використовувати компілятор закриття в розширеній компіляції, оскільки це єдиний інструмент, який перейменовує всі ваші змінні, навіть якщо вони використовуються у кількох файлах / модулях. Але це просто проблема: вона працює лише в тому випадку, якщо ви пишете в її стилі кодування .


Закриття не є заплутаним кодом: P
NiCk Newman

1
Він не створений для цього, але добре працює: він не додає зайвого коду, як деякі компілятори (які, як правило, можна змінити, які інструменти я цитував), але змінює його на незвичайні способи, деякі навіть важко скасувати, і видалити невикористані код, який порівняно з реальним затуманенням хороший для продуктивності.
Густаво Родрігес

1
Не гарна ідея. Мінімізація / компіляція коду на стороні сервера може спричинити проблеми безпеки, якщо у мініфікатора є помилка: zyan.scripts.mit.edu/blog/backdooring-js
mgol

Помилка, яку ви цитували, стосується лише UglifyJS: вона не стосується компілятора закриття.
Густаво Родрігес

Для всіх, хто піклується про мінімізацію файлів javascript, також існує un-minifier javascript. тому я не думаю, я не думаю, що це шар безпеки взагалі
Fillipo Sniper

11

Я можу порекомендувати JavaScript Utility від Patrick J. O'Neil. Він може затуманити / ущільнити і стиснути, і, здається, це досить добре. Однак, я ніколи не намагався інтегрувати його в будь-який сценарій складання.

Що стосується опуднення та мінімізації - я не є великим прихильником колишнього. Це робить налагодження неможливим (помилка в рядку 1 ... "зачекайте, є лише один рядок"), і вони завжди потребують часу для розпакування. Але якщо потрібно ... добре.


1
Але обфускування не обов'язково стискає його в один рядок, це може бути так само просто, як зміна імен функції та змінних або перетворення рядків у base64. Мінімізація розміщує весь код на одному рядку.
rw-nandemo

Сьогодні UglifyJS здається найкращим вибором. Автор теж класний хлопець! :)
Цветомир Цонев

Що стосується налагодження, ви здебільшого можете генерувати вихідні карти, які можна включити під час тестування, щоб ви могли бачити, на якому рядку виникла помилка, навіть якщо вона спрощена.
Лука Стіб

5

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

З цим кодом буде неможливо зрозуміти, і я думаю, що на цьому етапі хакеру знадобиться більше часу, щоб відновити ваш код, ніж насправді, якщо він переписав з нуля. Переписування та клонування - це те, що ви насправді не можете зупинити. Адже ми вільні люди!


5

Пакер Діна Едварда - чудовий обскуратор, хоча він, в першу чергу, придушує код, а не будь-які рядкові елементи, які можуть бути у вас в коді.

Дивіться: Інтернет-інструмент стиснення Javascript та виберіть зі спадного меню Packer (Dean Edwards)


Це безглуздо. Його можна легко розпакувати за допомогою jsbeautifier.org
Maciej Krawczyk

4

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


4

Спробуйте цей інструмент Javascript Obfuscator

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


4

Я використовую Jasob протягом багатьох років, і це руки вниз кращий обфускатор там.
Він має вдосконалений інтерфейс користувача, але все ще інтуїтивно зрозумілий і простий у використанні.
Він також буде обробляти файли HTML та CSS.

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

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

Двигун автоматично підраховує кількість націлених змінних і надає їм пріоритет для отримання максимального стиснення.

Я не працюю на Jasob, і нічого не отримую з реклами, просто пропоную дружні поради.
Мінус полягає в тому, що він не є безкоштовним і трохи дорогим, але все-таки він вартий, коли складений проти альтернатив - "безкоштовні" варіанти навіть не наближаються.


Джейсон, схоже, більше мініфікатор, ніж обскуратор. Я щось пропускаю?
Алан Макбі - MSFT

4

Ви пробували Bananascript ? Він створює сильно стислий і абсолютно нечитабельний код.


18
він прекрасно стискає код, але просто змініть eval()в останньому рядку на console.log()і ваша консоль виплюне все
LobsterMan

4

Я використовую утиліту Closure-Compiler для придушення сценарію java-script. Він мінімізує код і має більше варіантів припущення. Ця утиліта доступна за кодом Google за URL-адресою нижче:
Інструменти закриття

Але ось уже кілька днів я чую багато про UglifyJS. Ви можете знайти різні порівняння між компілятором закриття та UglifyJS, у якому Uglify начебто є переможцем.
UglifyJS: Швидкий новий JavaScript компресор для Node.js, який нарівні із закриттям

Незабаром я дав би шанс UglifyJS.




2

Ви, безумовно, повинні поглянути на Obfuscriptor .

Я виходжу за межі типових прийомів мінімізації Javascript, які ми бачили з інших інструментів, таких як YUI Compressor або Google Closure .

Замучений код більше схожий на зашифрований. На відміну від усього, що я бачив раніше.


Дякуємо за посилання! Просто спробував зашифрований дійсно зашифрований код і код (без ключа ???). І стиснув мій сценарій від 211 до 36 Кб!

Зауважте, що Obfuscriptor попереджає, що він не працює з IE. Це дещо порушує угода.
Алан Макбі - MSFT

1
Посилання на відповідь більше не вказує на інструмент. Я не можу знайти іншої прямої посилання на нього.
buzoherbert

перша посилання мертва. "Обмускриптор"
Альп Алтунель

2

Якщо ви використовуєте бібліотеку JavaScript, розгляньте Дойо інструментарій, який сумісний (після незначних змін) із компіляцією розширеного режиму компілятора закриття.

Dojo - Єдина бібліотека JavaScript, сумісна з компілятором закриття

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

JavaScript-код, який є просто мінімізованим (YUI Compressor, Uglify тощо), легко перетворити інженером після проходження через красуню.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.