Я хочу зробити програму JavaScript, яка не є відкритим кодом, і, таким чином, я хочу дізнатися, як можна приховати свій JS-код? Чи можливо це?
Я хочу зробити програму JavaScript, яка не є відкритим кодом, і, таким чином, я хочу дізнатися, як можна приховати свій JS-код? Чи можливо це?
Відповіді:
Опущення:
Спробуйте компресор YUI . Це дуже популярний інструмент, розроблений, вдосконалений та підтримуваний командою Yahoo UI.
Ви також можете використовувати:
ОНОВЛЕННЯ: Спочатку це питання задавали більше 10 років тому, і YUI більше не підтримується. Компілятор закриття Google все ще використовується, і UglifyJS можна запустити локально через менеджер пакетів вузлів:npm install -g uglify-js
Дані приватних рядків:
Збереження приватних значень рядків - це інша проблема, і затуплення насправді не принесе користі. Звичайно, упакувавши своє джерело у пошкоджений, мінімізований безлад, ви маєте легку версію безпеки через незрозумілість . Здебільшого саме ваш користувач переглядає джерело, а рядкові значення клієнта призначені для їх використання, тому подібне значення приватних рядків часто не потрібно.
Якби у вас дійсно було значення, яке ви ніколи не хотіли, щоб користувач бачив, у вас було б кілька варіантів. По-перше, ви можете зробити якесь шифрування, яке розшифровується при завантаженні сторінки. Це, мабуть, було б одним із найбезпечніших варіантів, але також багато роботи, яка може бути непотрібною. Можливо, ви могли б base64 кодувати деякі рядкові значення, і це було б простіше .. але хтось, хто дійсно хотів ці рядкові значення, може легко їх розшифрувати . Шифрування - єдиний спосіб по-справжньому не допустити доступу будь-кого до ваших даних, і більшість людей вважають, що це більш безпечно, ніж потрібно.
Sidenote:
Як відомо, неясність у Javascript викликає деякі помилки. У обфуськатор отримують трохи краще про це, але багато наряди вирішують , що вони бачать досить вигоди від Мінімізація та gzipping , і додав економія заплутування не завжди варта свічок . Якщо ви намагаєтесь захистити своє джерело, можливо, ви вирішите, що воно варте вашого часу, просто щоб ваш код важче читався. JSMin - хороша альтернатива.
--preserve-semi
. Перезапис приватних змінних у параметри a, b, c тощо зазвичай є безпечним. Ще одна річ, яку я роблю, - це змусити мініфікатор поставити перерву рядка після кожної крапки з комою в коді --line-break 0
. Тоді у виробництві, якщо він помиляється, у мене принаймні є дійсна контрольна лінія, з якої можна працювати, і я можу знайти цей код у своїй розробці. В іншому випадку ви просто виявите помилку в масивному рядку коду і не маєте уявлення, де помилка.
Я дивуюсь, що ніхто не згадав про компілятор закриття Google . Він не просто мінімізує / стискає, він аналізує, щоб знайти та видалити невикористаний код, і переписує для максимального мінімізації. Він також може перевірити тип і попередить про синтаксичні помилки.
Нещодавно JQuery перейшов з компресора YUI на компілятор закриття і побачив " суцільне поліпшення "
Заплутаність ніколи насправді не може спрацювати. Для всіх, хто дійсно хоче отримати ваш код, це просто швидкість. Що ще гірше, це заважає вашим користувачам не виправляти помилки (і доставляти виправлення до вас), а також ускладнює діагностику проблем у цій галузі. Це марна трата вашого часу та грошей.
Порадьтеся з юристом про право інтелектуальної власності та які ваші правові варіанти. "Відкритий код" не означає "люди можуть читати джерело". Натомість Open Source - це конкретна модель ліцензування, яка дає дозвіл на вільне використання та зміну вашого коду. Якщо ви не надаєте таку ліцензію, тоді люди, що копіюють ваш код, порушують, і (у більшості країн світу) у вас є законні можливості їх припинити.
Єдиний спосіб дійсно захистити свій код - це не надсилати його. Перемістіть важливий сервер коду та запросіть свій загальнодоступний код Javascript на Ajax.
Ви можете приховати джерело javascript все, що вам завгодно, але воно завжди буде реверсивно спрацьоване лише в силу необхідності, щоб весь вихідний код фактично працював на клієнтській машині ... найкращий варіант, про який я можу подумати, - це зробити всю вашу обробку з кодом на стороні сервера, і все те, що JavaScript код JavaScript робить - це надсилання запитів на обробку на сам сервер. В іншому випадку будь-хто завжди зможе відслідковувати всі операції, які виконує код.
Хтось згадав base64, щоб захистити рядки. Це жахлива ідея. Base64 одразу впізнається за типом людей, які хочуть змінити інженерний код. Перше, що вони зроблять - це розкодувати його і подивитися, що це таке.
Є ряд інструментів обфускування JavaScript, які є у вільному доступі; однак, я думаю, що важливо відзначити, що важко заплутати JavaScript до того моменту, коли він не може бути реверсованим.
З цією метою є кілька варіантів, якими я певною мірою користувався:
Компресор YUI . Компресор JavaScript Yahoo! Хороша робота з конденсації коду, що покращить його час завантаження. Існує невеликий рівень затуплення, який працює відносно добре. По суті, компресор буде змінювати назви функцій, видаляти пробіли та змінювати локальні змінні. Це те, чим я користуюсь найчастіше. Це інструмент на основі Java з відкритим кодом.
JSMin - це інструмент, написаний Дугласом Крокфордом, який прагне мінімізувати джерело JavaScript. За власними словами Крокфорда, "JSMin не притуплює, але робить неприємним". Основна його мета - мінімізувати розмір джерела для швидшого завантаження в браузерах.
Безкоштовний JavaScript Obfuscator . Це веб-інструмент, який намагається придушити ваш код, фактично кодуючи його. Я думаю, що компроміси його форми кодування (або затуманення) можуть відбутися ціною розміру файлів; однак це питання особистої переваги.
[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]
вар принаймні [var1, var2,..]
протягом однієї хвилини. Я можу буквально знеструмлювати, повторно відступати та шукати / замінювати імена var протягом двох хвилин. І ні, я розумніший за пересічного молодшого Дева. Простий факт полягає в тому, що немає жодного способу затьмарити клієнтську сторону JS. Ви можете придбати собі 5 хвилин, MAX, але це не приносить користі. Цей матеріал справді просто продати тому, хто не знає код на доданій "Безпеці". Ніхто, хто ніколи не писав рядок JS, не купив би цього лайна.
Що я б робив:
А. Троль хакера!
Це буде у другій частині мого підробленого / затуманеного секретного коду 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. Трохи притупіть код
Що це?
(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 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=';}; ?>
Спробуйте JScrambler . Нещодавно я дав йому віджимання і був вражений ним. Він надає набір шаблонів для притуплення із заздалегідь заданими налаштуваннями для тих, хто не надто дбає про деталі та просто хоче це швидко зробити. Ви також можете створити власну обфускування, вибравши будь-які перетворення / методи, які ви хочете.
Проблема з інтерпретованими мовами полягає в тому, що ви надсилаєте джерело, щоб змусити їх працювати (якщо у вас немає компілятора для байт-коду, але знову ж таки, це досить тривіально для декомпіляції).
Отже, якщо ви не хочете жертвувати продуктивністю, ви можете діяти лише на імена змінних та функцій, наприклад. замінивши їх на a, b ... aa, ab ... або a101, a102 і т. д. І, звичайно, видаліть стільки місця / нових рядків, скільки можете (саме так роблять JS компресори).
Заблукаючі рядки будуть вражати ефективність, якщо вам доведеться зашифрувати їх і розшифрувати в режимі реального часу. Плюс відладчик JS може показати кінцеві значення ...
Всупереч більшості інших відповідей, які я пропоную проти YUI Compressor; ви повинні використовувати Google Closing .
Не багато тому, що він стискає більше, а здебільшого тому, що він сприймає помилки javascript, наприклад, a = [1,2,3,];
які змушують IE переходити у мережу.
Додаток, що не працює з відкритим кодом, заснований на Javascript, є досить нерозумним. Javascript - мова, що інтерпретується на стороні клієнта.
Обфускування JS зазвичай робиться для зменшення розміру сценарію, а не для "захисту". Якщо ви знаходитесь в ситуації, коли ви не хочете, щоб ваш код був відкритим, Javascript - це не потрібна мова.
Навколо є багато інструментів, але більшість з них має назву слово "компресор" (або "мініфікатор").
Ви не можете захистити код клієнтської сторони: просто натисніть F12 на Google Chrome, призупиніть виконання JavaScript, і ви отримаєте всі рядки, навіть ті, що зашифровані. Прикрасьте його і перейменуйте змінні, і ви отримаєте майже оригінальний код.
Якщо ви пишете javascript на сервері (тобто NodeJS), боїтесь, щоб хтось увірвався на ваш сервер, і хочете ускладнити роботу хакера, надаючи більше часу для повернення доступу, тоді використовуйте компілятори javacript :
Вам потрібно використовувати компілятор закриття в розширеній компіляції, оскільки це єдиний інструмент, який перейменовує всі ваші змінні, навіть якщо вони використовуються у кількох файлах / модулях. Але це просто проблема: вона працює лише в тому випадку, якщо ви пишете в її стилі кодування .
Я можу порекомендувати JavaScript Utility від Patrick J. O'Neil. Він може затуманити / ущільнити і стиснути, і, здається, це досить добре. Однак, я ніколи не намагався інтегрувати його в будь-який сценарій складання.
Що стосується опуднення та мінімізації - я не є великим прихильником колишнього. Це робить налагодження неможливим (помилка в рядку 1 ... "зачекайте, є лише один рядок"), і вони завжди потребують часу для розпакування. Але якщо потрібно ... добре.
Я б запропонував спочатку поєднати з чимось на зразок YUI Compressor, а потім перетворити всі рядки та числа в значення HEX, використовуючи щось на зразок http://www.javascriptobfuscator.com/
З цим кодом буде неможливо зрозуміти, і я думаю, що на цьому етапі хакеру знадобиться більше часу, щоб відновити ваш код, ніж насправді, якщо він переписав з нуля. Переписування та клонування - це те, що ви насправді не можете зупинити. Адже ми вільні люди!
Пакер Діна Едварда - чудовий обскуратор, хоча він, в першу чергу, придушує код, а не будь-які рядкові елементи, які можуть бути у вас в коді.
Дивіться: Інтернет-інструмент стиснення Javascript та виберіть зі спадного меню Packer (Dean Edwards)
Спробуйте цей інструмент Javascript Obfuscator
Я використовував його в моїй грі HTML5 не тільки зменшив її розмір з 950 КБ до 150, але і зробив вихідний код нечитабельними компіляторами закриття та мініфіксаторами зворотними.
Я використовую Jasob протягом багатьох років, і це руки вниз кращий обфускатор там.
Він має вдосконалений інтерфейс користувача, але все ще інтуїтивно зрозумілий і простий у використанні.
Він також буде обробляти файли HTML та CSS.
Найкращий спосіб використовувати це - приєднати всі ваші приватні змінні чимось на зразок підкреслення, а потім скористатись sort
функцією, щоб згрупувати їх усі разом і перевірити їх як цілі для придушення.
Користувачі можуть по- , як і раніше переглядати джерело, але це набагато важче розшифрувати , коли ваші приватні змінні перетворюються з чого - то , як _sUserPreferredNickName
в a
.
Двигун автоматично підраховує кількість націлених змінних і надає їм пріоритет для отримання максимального стиснення.
Я не працюю на Jasob, і нічого не отримую з реклами, просто пропоную дружні поради.
Мінус полягає в тому, що він не є безкоштовним і трохи дорогим, але все-таки він вартий, коли складений проти альтернатив - "безкоштовні" варіанти навіть не наближаються.
Ви пробували Bananascript ? Він створює сильно стислий і абсолютно нечитабельний код.
eval()
в останньому рядку на console.log()
і ваша консоль виплюне все
Я використовую утиліту Closure-Compiler для придушення сценарію java-script. Він мінімізує код і має більше варіантів припущення. Ця утиліта доступна за кодом Google за URL-адресою нижче:
Інструменти закриття
Але ось уже кілька днів я чую багато про UglifyJS. Ви можете знайти різні порівняння між компілятором закриття та UglifyJS, у якому Uglify начебто є переможцем.
UglifyJS: Швидкий новий JavaScript компресор для Node.js, який нарівні із закриттям
Незабаром я дав би шанс UglifyJS.
Як JavaScript / HTML / CSS obfuscator / компресор, ви також можете спробувати Patu Digua .
Цей варіант мінімізується, але не заплутує. Якщо ви не хочете використовувати командний рядок Java, ви можете вставити javascript у веб-форму.
Ви, безумовно, повинні поглянути на Obfuscriptor .
Я виходжу за межі типових прийомів мінімізації Javascript, які ми бачили з інших інструментів, таких як YUI Compressor або Google Closure .
Замучений код більше схожий на зашифрований. На відміну від усього, що я бачив раніше.
Якщо ви використовуєте бібліотеку JavaScript, розгляньте Дойо інструментарій, який сумісний (після незначних змін) із компіляцією розширеного режиму компілятора закриття.
Dojo - Єдина бібліотека JavaScript, сумісна з компілятором закриття
Код, складений в режимі Closure Advanced, неможливо переробити інженером, навіть пройшовши крізь красувач, оскільки вся база коду (включаючи бібліотеку) затуманена. Це також в середньому на 25%.
JavaScript-код, який є просто мінімізованим (YUI Compressor, Uglify тощо), легко перетворити інженером після проходження через красуню.
Я раніше це використовував, і це робить хорошу роботу. Це не безкоштовно, але обов'язково варто поглянути.
JavaScript Obfuscator & Encoder