Jak mogę zaciemnić (chronić) JavaScript? [Zamknięte]

714

Chcę stworzyć aplikację JavaScript, która nie jest open source, i dlatego chcę nauczyć się, jak zaciemnić mój kod JS? czy to możliwe?

Teifion
źródło
15
Byłbym zainteresowany, aby usłyszeć powód, dla którego próbujesz zaciemnić kod, może on dać jakiś potrzebny kontekst, aby dać pomocną odpowiedź.
JohnFx
45
Jedynym sposobem, aby naprawdę zachować coś w tajemnicy, jest nie wysyłanie go do klienta . Jeśli go nie mają, nie mogą go przeczytać. Przesłanie go w postaci zaszyfrowanej wymaga jedynie kłopotów z rąk kilku osób, które faktycznie się tym przejmują, a wszyscy inni nie będą się grzebać, nawet jeśli wyślesz go w czystej postaci (por. DRM).
Donal Fellows
8
Zaciemnienie kodu nie jest dobrym pomysłem. Spowoduje to jedynie niedogodności dla legalnych użytkowników (np. Gdy będą musieli naprawić błąd) i nie zrobi nic, aby „chronić” go przed ludźmi, którzy mają (finansową) zachętę do jego inżynierii wstecznej. Jest to zasadniczo niemożliwe , aby zapobiec reverse-engineering kodu JavaScript.
Sven Slootweg
14
Argument, by nie zaciemniać, wydaje mi się błędny. Jeśli nie uważasz, że Twoi użytkownicy mogą naprawiać / zgłaszać błędy, powinieneś to zrobić. Może skrócić czas ładowania, minimalizując. Nigdy nie powstrzyma on naprawdę zaangażowanego hakera, ale spowolni go i zatrzyma na wpół arsenał hakerów. Jest to bardzo łatwe i jest wiele narzędzi (zobacz inne odpowiedzi), powiedziałbym, że z pewnością zrobi to, ponieważ przez większość czasu są to tylko zalety, ale nie oczekuj, że przyniesie to prawdziwe bezpieczeństwo lub powstrzyma kogoś przed kopiowaniem twojego kodu jeśli naprawdę chcą. Jedynym sposobem na to jest utrzymanie strony serwera kodu i użycie ajax.
Benjamin

Odpowiedzi:

404

Zaciemnianie:

Wypróbuj kompresor YUI . To bardzo popularne narzędzie, zbudowane, ulepszone i obsługiwane przez zespół interfejsu użytkownika Yahoo.

Możesz także użyć:

AKTUALIZACJA: To pytanie zostało pierwotnie zadane ponad 10 lat temu i YUI nie jest już utrzymywane. Kompilator zamknięcia Google jest nadal używany, a UglifyJS można uruchomić lokalnie za pomocą menedżera pakietów węzłów:npm install -g uglify-js

Prywatny ciąg danych:

Utrzymywanie wartości ciągów w tajemnicy to inna sprawa, a zaciemnianie naprawdę nie przyniesie wiele korzyści. Oczywiście, pakując swoje źródło w zniekształcony, zminimalizowany bałagan, masz lekką wersję bezpieczeństwa poprzez zaciemnienie . Przez większość czasu to użytkownik przegląda źródło, a wartości ciągu na kliencie są przeznaczone do ich użycia, więc taka prywatna wartość ciągu nie jest często konieczna.

Jeśli naprawdę masz wartość, której użytkownik nigdy nie chciał widzieć, miałbyś kilka opcji. Po pierwsze, możesz wykonać szyfrowanie, które jest odszyfrowywane przy ładowaniu strony. Byłaby to prawdopodobnie jedna z najbezpieczniejszych opcji, ale także dużo pracy, która może być niepotrzebna. Prawdopodobnie mógłbyś zakodować base64 niektóre wartości łańcuchowe, a to byłoby łatwiejsze ... ale ktoś, kto naprawdę chciał tych wartości łańcuchowych, mógł je z łatwością zdekodować . Szyfrowanie to jedyny sposób, aby naprawdę uniemożliwić każdemu dostęp do twoich danych, a większość ludzi uważa, że ​​jest to większe bezpieczeństwo niż jest to potrzebne.

Dygresja:

Wiadomo, że zaciemnianie w JavaScript powoduje pewne błędy. Obfuscators robi się trochę lepiej, ale wiele strojów decyduje, że widzą wystarczającą korzyść z minimalizacji i gzipowania , a dodatkowe oszczędności zaciemnienia nie zawsze są warte kłopotu . Jeśli próbujesz chronić swoje źródło, być może zdecydujesz, że warto poświęcić chwilę, aby uczynić kod trudniejszym do odczytania. JSMin to dobra alternatywa.

keparo
źródło
32
Chcę dodać, że wykonanie kodu base64 nie przyniesie korzyści w zakresie bezpieczeństwa, ponieważ jest to trywialnie odwracalna procedura. Nawet szyfrowanie nie pomoże, jeśli zostanie odszyfrowane po stronie klienta. Jedynym sposobem na zapewnienie bezpieczeństwa ciągu jest to, aby klient widział TYLKO zaszyfrowany ciąg i jest on przekazywany do
Claudiu,
16
serwer do dalszego przetwarzania.
Claudiu
9
FYI, kompresor YUI Internecie można znaleźć tutaj: refresh-sf.com/yui
mtness
7
Szyfrowanie wartości ciągów przyniesie tylko nieznacznie więcej korzyści niż kodowanie base64, jeśli trzeba je odszyfrować w przeglądarce, aby z nich skorzystać. Powodem jest to, że musisz podać przeglądarce również klucz szyfrowania, a wszystko, co przeglądarka może zrobić, może zrobić również użytkownik.
Ben
9
Kiedy robię minifikację za pomocą kompresora YUI, upewniam się, że używa on „bezpiecznych” metod minifikacji, tj. Zachowuje średniki --preserve-semi. Przepisywanie zmiennych prywatnych do a, b, c itp. Jest zwykle bezpieczne. Inną rzeczą, którą robię, jest spowodowanie, aby minifikator przerywał linię po każdym średniku w kodzie --line-break 0. Następnie w produkcji, jeśli wystąpi błąd, mam przynajmniej poprawną linię odniesienia do pracy i mogę znaleźć ten kod w mojej kopii programistycznej. W przeciwnym razie po prostu pojawia się błąd w ogromnej linii kodu i nie mam pojęcia, gdzie jest błąd.
zuallauz
136

Dziwi mnie, że nikt nie wspomniał o Kompilatorze zamknięcia Google . Nie tylko minimalizuje / kompresuje, analizuje w celu znalezienia i usunięcia nieużywanego kodu, a także przepisuje w celu maksymalnego zminimalizowania. Może także sprawdzać typy i ostrzegać przed błędami składniowymi.

JQuery niedawno przeniósł się z kompresora YUI na kompilator zamknięcia i zobaczył „ solidną poprawę

Jason Hall
źródło
60
tak, ale ostatnio opuścili kompilator Closure i teraz używają UglifyJS. Kod JQuery był
błędny
Chciałbym zauważyć, że jeśli pracujesz z kątownikiem. to narzędzie tak naprawdę nie będzie działać z powodu wstrzykiwania zależności i zmiany nazw argumentów, chyba że pojawi się pole wyboru, którego nie widzę.
iConnor,
1
Przydatne narzędzie, ale nie robi zaciemnienia, dlatego prawdopodobnie nikt o nim nie wspominał.
Madbreaks
1
@Madbreaks z Advanced Optimizations ( developers.google.com/closure/compiler/docs/api-tutorial3 ) zminimalizuje kod do punktu zaciemnienia. Zmienne można na przykład zmienić na przykład dla zwięzłości.
Jason Hall
Google nie ma też opcji bezpieczeństwa
Fillipo Sniper
121

Zaciemnienie nigdy tak naprawdę nie działa. Dla każdego, kto naprawdę chce dostać się do twojego kodu, jest to po prostu wzrost prędkości. Co gorsza, uniemożliwia użytkownikom naprawianie błędów (i wysyłanie poprawek z powrotem do Ciebie) i utrudnia zdiagnozowanie problemów w terenie. To strata twojego czasu i pieniędzy.

Porozmawiaj z prawnikiem na temat prawa własności intelektualnej i jakie masz opcje prawne. „Otwarte źródło” nie oznacza „ludzie mogą czytać źródło”. Zamiast tego Open Source to szczególny model licencjonowania, który pozwala na swobodne używanie i modyfikowanie kodu. Jeśli nie przyznasz takiej licencji, osoby kopiujące Twój kod naruszają zasady i (w większości krajów) masz prawne możliwości ich zatrzymania.

Jedynym sposobem, aby naprawdę chronić swój kod, jest nie wysyłanie go. Przenieś ważny kod po stronie serwera i niech twój publiczny kod JavaScript wykonuje wywołania Ajax do niego.

Zobacz moją pełną odpowiedź na temat zaciemniaczy tutaj.

Schwern
źródło
14
+1 od prawnika, ale może nie działać w innych krajach / jurysdykcjach.
jmort253
16
Prawnicy prawdopodobnie generują więcej kosztów / problemów niż zgubiony kod, bardzo dokładnie zastanawiają się i organizują mnóstwo pieniędzy, aby zaangażować prawników !!
andora,
11
-1: Uważam, że znalezienie prawnika, który rozumie JavaScript, byłoby trudne ... Nie wspominając już o opłatach i ilości czasu potrzebnego na znalezienie „sprawców naruszenia”. Czy ktoś może naprawdę naruszać licencję zakopaną w plikach HTML / JavaScript, jeśli nigdy niczego nie podpisał? +1 za połączenia AJAX.
Alerty
12
@Alerty 1) Licencje są zasadniczo o udzielenie wykorzystanie materiałów chronionych prawem autorskim. Masz niewielkie prawo do korzystania z niego bez licencji. Nie musisz go podpisywać, aby uzyskać prawa. Licencja różni się od umowy. 2a) Ponieważ pytanie dotyczy osób kopiujących i korzystających z HTML / Javascript bez pozwolenia, licencja nie jest „zakopana”, jest tam od samego początku. 2b) Masz niewielkie prawo do korzystania z materiałów chronionych prawem autorskim innych osób bez licencji. 3) Prawnik nie musi rozumieć Javascript, tylko prawo własności intelektualnej.
Schwern
4
@Alerty Nie bądź tępy. Chodzi o ukaranie tych, którzy kopiują plik do użytku na własnej stronie bez zgody. Mówisz o umowie, a nie licencji. Kontrakty wymagają wzajemnej zgody i stanowią darowiznę. Licencje dają ci prawo do korzystania z własności intelektualnej. Licencje są jednokierunkowe (właściciel udziela ci rzeczy), nie musisz podpisywać, ponieważ niczego nie rozdajesz. Wiele „umów licencyjnych na oprogramowanie” jest tak naprawdę umowami, ponieważ wykraczają poza licencjonowanie nieruchomości i czasem są niedorzeczne, takie jak prawo do pozywania.
Schwern
49

Możesz zaciemnić źródło javascript tak, jak chcesz, ale zawsze będzie można je poddać inżynierii wstecznej tylko dlatego, że wymaga się, aby cały kod źródłowy faktycznie działał na komputerze klienckim ... najlepszą opcją, jaką mogę wymyślić, jest zakończenie przetwarzania z kodem po stronie serwera, a wszystko, co robi javascript kodu klienta, wysyła żądania przetwarzania do samego serwera. W przeciwnym razie każdy będzie zawsze w stanie śledzić wszystkie operacje wykonywane przez kod.

Ktoś wspomniał o base64, aby chronić łańcuchy. To okropny pomysł. Base64 jest natychmiast rozpoznawalny przez typy osób, które chciałyby dokonać inżynierii wstecznej twojego kodu. Pierwszą rzeczą, którą zrobią, jest odkodowanie go i zobaczenie, co to jest.

Claudiu
źródło
45
Gdziekolwiek się nie wybieram, najczęstsza odpowiedź na pytanie „jak mogę zaciemnić mój Javascript?” to „nie powinieneś się tym przejmować, ponieważ ktoś może to zaciemnić”. To nie jest tak naprawdę odpowiedź.
Travis Wilson
2
@Vivek: Trochę późno, ale tak naprawdę miałem na myśli „kod po stronie serwera”. Możliwe jest uruchamianie javascript nie w przeglądarce, tylko na serwerze, ale nie wiem, jak często to jest.
Claudiu
8
@Travis: Nie powiedziałem „nie powinieneś się tym martwić”. Powiedziałem tylko, że jeśli chcesz mieć program z zamkniętym kodem źródłowym, nie będziesz chciał pisać go w javascript po stronie klienta, ponieważ wszelkie zaciemnienia nie zapobiegną (dość łatwo) inżynierii wstecznej.
Claudiu
8
Dobrze. Co w żaden sposób nie odpowiada „w jaki sposób mogę zaciemnić mój JavaScript”. Zaciemnianie nie jest pojęciem abstrakcyjnym, jest technicznym. Op po prostu zapytał „jak?”
Madbreaks
2
@Madbreaks: Pytanie dotyczyło tego, aby jego kod nie był open source. Natychmiastowa odpowiedź techniczna jest zaakceptowana, ale lepsza odpowiedź kontekstowa (jak w tym, co naprawdę próbujesz zrobić?) Brzmi: IMO, że nie możesz mieć javascript po stronie klienta, który nie jest open source, ponieważ każdy ma źródło, niezależnie od tego, jak je zaciemnisz. Tak czy inaczej obie odpowiedzi są tutaj, a ludzie mogą czytać i korzystać z obu.
Claudiu
45

Istnieje wiele bezpłatnych narzędzi zaciemniających JavaScript; uważam jednak, że należy zauważyć, że trudno jest zaciemnić JavaScript do tego stopnia, że ​​nie można go poddać inżynierii wstecznej.

W tym celu istnieje kilka opcji, które wykorzystałem do pewnego stopnia w nadgodzinach:

  • Kompresor YUI . Kompresor JavaScriptu w Yahoo !, dobrze skrapla kod, co poprawi jego czas ładowania. Istnieje niewielki poziom zaciemnienia, który działa stosunkowo dobrze. Zasadniczo kompresor zmieni nazwy funkcji, usunie spację i zmodyfikuje lokalne zmienne. Tego najczęściej używam. To narzędzie oparte na Javie typu open source.

  • JSMin to narzędzie napisane przez Douglasa Crockforda, które stara się zminimalizować twoje źródło JavaScript. Słowami Crockforda: „JSMin nie zaciemnia, ale glifuje”. Jego głównym celem jest zmniejszenie rozmiaru źródła w celu szybszego ładowania w przeglądarkach.

  • Darmowy JavaScript Obfuscator . Jest to narzędzie internetowe, które próbuje zaciemnić kod, faktycznie go kodując. Myślę, że kompromisy w postaci kodowania (lub zaciemniania) mogą kosztować rozmiar pliku; jest to jednak kwestia osobistych preferencji.

Tomek
źródło
19
Ponieważ kod JavaScript musi działać na komputerze klienta, nie tylko trudno jest zaciemnić do tego stopnia, że ​​kodu nie można poddać inżynierii wstecznej, ale jest to niemożliwe .
Schwern
20
chodzi o statystyki. jaki jest próg, po którym ktoś uzyska dostęp do Twojego kodu z zaciemnieniem i bez? nadal mogą uzyskać dostęp, ale im wyższy próg, tym mniej ludzi. im mniej osób o czymś wie, tym coś jest bezpieczniejsze. standardowa praktyka klasyfikacji bezpieczeństwa.
Cris Stringfellow
1
@PeterR szukaj / zamień w edytorze tekstu sprawi, że twoje życie będzie o wiele trudniejsze, próbując je przeczytać lub poddać inżynierii wstecznej. nie jest idealny, ale dodaje dodatkową warstwę irytacji / trudności poprzez usunięcie wskazówek kontekstowych. większość programistów nie jest tak inteligentna jak ty, co czyni z tego tak świetny środek odstraszający.
SED
1
@SED Nie znam ani jednego programisty, który nie byłby w stanie znaleźć / zamienić kilku [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]zmiennych w co najmniej [var1, var2,..]jedną minutę. Potrafię dosłownie usunąć z glifu, ponownie wciąć i wyszukać / zamienić nazwy zmiennych w ciągu dwóch minut. I nie, jestem mądrzejszy niż przeciętny Jr. Dev. Prostym faktem jest to, że NIE ma sposobu na zaciemnienie JS po stronie klienta. Możesz kupić sobie 5 minut, MAX, ale to nie ma sensu. Te rzeczy są po prostu po to, aby sprzedać komuś, kto nie zna kodu dodanego „Bezpieczeństwo”. Nikt, kto kiedykolwiek napisał wiersz JS, nie kupiłby tego badziewia.
Peter R
3
@PeterR „Potrafię dosłownie odbarwić, ponownie wciąć i wyszukać / zamienić nazwy zmiennych w ciągu dwóch minut” - jasne, śmiało i wypróbuj to na wieloprzebiegowym zminimalizowanym, zaciemnionym, 20 MB pakiecie bazy kodu o strukturze, która zajmuje tygodnie, by zrozumieć nawet oryginalny, skomentowany kod źródłowy. Aby było jeszcze trudniej, istnieją narzędzia zaciemniające, które celowo powodują uszkodzenie kodu w przypadku zmiany wcięcia, linii itp.
John Weisz
23

Co bym zrobił:

A. Troll hakera!

To będzie w drugiej części mój fałszywy / zaciemniony tajny kod javascript LAUNCHER. Ten, który widzisz w kodzie źródłowym.

Co robi ten kod?

  1. ładuje prawdziwy kod
  2. ustawia niestandardowy nagłówek
  3. publikuje zmienną niestandardową

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. Nieco zaciemnij kod

Co to jest?

  1. to ten sam kod, co powyżej w base64
  2. to nie jest TAJEMNY kod javascript

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

C Utwórz trudny do wyświetlenia plik php z prawdziwym kodem w środku

Co robi ten kod php?

  1. Sprawdza poprawność polecającego (domena / katalog / kod twojego programu uruchamiającego)
  2. Sprawdza niestandardowy NAGŁÓWEK
  3. Sprawdza niestandardową zmienną POST

Jeśli wszystko jest w porządku, pokaże ci prawidłowy kod, w przeciwnym razie fałszywy kod lub ban ip, zamknij stronę ... cokolwiek.

<?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=';
};
?>

odsyłacz base64 = http://here.is/my/launcher.html

SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

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

Teraz .. jeśli zdefiniujesz procedury obsługi zdarzeń w javascript SECRET, prawdopodobnie jest on dostępny. Musisz zdefiniować je na zewnątrz za pomocą kodu uruchamiania i wskazać na zagnieżdżoną funkcję SECRET.

SO ... czy istnieje prosty sposób na uzyskanie kodu? document.body.appendChild(document.createElement('div')).innerText='Awesome';

Nie jestem pewien, czy to działa, ale używam chrome i sprawdziłem Elementy, Zasoby, Sieć, Źródła, Oś czasu, Profile, Audyty, ale nie znalazłem powyższej linii.

uwaga 1: jeśli otworzysz URL Troll.php z Inspect element-> network w chrome, otrzymasz fałszywy kod.

uwaga 2: cały kod jest napisany dla współczesnych przeglądarek. polyfill potrzebuje dużo więcej kodu.

EDYTOWAĆ

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=';}; ?>
cocco
źródło
1
och i tak, również zaciemniam kod javascript.
cocco
1
Właśnie o tym myślałem, trollując crackera. Chciałbym zobaczyć coś takiego bez konieczności używania PHP :)
pgarciacamou
6
Nawet jeśli jest to zabawne, programista internetowy, który jest w stanie właściwie sprawdzić witrynę, może w jakiś sposób uzyskać kod źródłowy. Naprawdę uważam, że nie ma sposobu, aby ukryć dowolny rodzaj danych w momencie, gdy umieścisz je w Internecie.
cocco
Myślę, że to nie jest żaden rodzaj zaciemnienia. jednak wie, jak otworzyć konsolę, może również wiedzieć o kodowaniu / dekodowaniu base64, bardzo proste.
T.Todua
19

Próbować JScrambler . Niedawno to zrobiłem i byłem pod wrażeniem. Zapewnia zestaw szablonów zaciemniania ze wstępnie zdefiniowanymi ustawieniami dla tych, którzy nie dbają o szczegóły i chcą tylko szybko to zrobić. Możesz również utworzyć niestandardowe zaciemnianie, wybierając dowolne transformacje / techniki, które chcesz.

Anthony
źródło
7
Subskrypcja JScrambler jest bardzo droga ... Najtańsza subskrypcja wymaga minimum 3 miesięcy cena 145 USD - to szalone.
barbushin
1
Mają teraz bezpłatny plan. Inne plany subskrypcji są nadal tak drogie.
user7610
2
Bezpłatny plan obejmuje tylko optymalizację i minimalizację.
Jean Hominal
1
„Bezpłatny plan obejmuje optymalizację i minimalizację”, tak nie. Przykro nam, zaciemnianie i optymalizacja nie idą w parze.
NiCk Newman
2
Patrząc dziś na stronę JScramblera i więcej planów cenowych nie widzę opcji bezpłatnej. Tylko bezpłatny okres próbny.
KDT
18

Problem z interpretowanymi językami polega na tym, że wysyłasz źródło, aby je uruchomić (chyba że masz kompilator do bytecode, ale z drugiej strony dekompilacja jest dość trywialna).

Jeśli więc nie chcesz poświęcać wydajności, możesz działać tylko na nazwy zmiennych i funkcji, np. zamieniając je na a, b ... aa, ab ... lub a101, a102 itd. I, oczywiście, usuwaj tyle spacji / znaków nowej linii, jak to możliwe (tak robią tak zwane kompresory JS).
Zaciemniające ciągi będą miały wpływ na wydajność, jeśli będziesz musiał je zaszyfrować i odszyfrować w czasie rzeczywistym. Ponadto debugger JS może wyświetlać ostateczne wartości ...

PhiLho
źródło
17

W przeciwieństwie do większości innych odpowiedzi, które sugeruję przeciwko YUI Compressor; powinieneś użyć Google Closure .

Nie wiele, ponieważ kompresuje więcej, ale głównie dlatego, że wyłapuje błędy javascript, takie jak a = [1,2,3,];które powodują, że IE wariuje.

Thomas Bonini
źródło
5
czy nie należy sprawdzać kodu pod kątem błędów i niezgodności w obu przypadkach przed zaciemnieniem? nie ma nic wspólnego z zaciemnianiem
phil294,
13

Aplikacja JavaScript oparta na oprogramowaniu innym niż open source jest dość głupia. JavaScript jest językiem interpretowanym po stronie klienta. Zaciemnianie nie zapewnia dużej ochrony ..

Zaciemnianie JS jest zwykle wykonywane w celu zmniejszenia rozmiaru skryptu, zamiast „chronić” go. Jeśli znajdujesz się w sytuacji, w której nie chcesz, aby Twój kod był publiczny, JavaScript nie jest właściwym językiem.

Wokół jest wiele narzędzi, ale większość z nich z jakiegoś powodu ma słowo „kompresor” (lub „minifier”).

dbr
źródło
11

Nie możesz zabezpieczyć kodu po stronie klienta: po prostu naciśnij F12 w Google Chrome, wstrzymaj wykonywanie javascript, a otrzymasz wszystkie ciągi, nawet te zaszyfrowane. Upiększ to i zmień nazwy zmiennych a otrzymasz prawie oryginalny kod.

Jeśli piszesz javascript po stronie serwera (np. NodeJS), boisz się, że ktoś włamie się na Twój serwer i chcesz utrudnić działanie hakera, dając ci więcej czasu na odzyskanie dostępu, a następnie użyj kompilatorów javacript :

Musisz użyć kompilatora zamknięcia w Advanced Compilation, ponieważ jest to jedyne narzędzie, które zmienia nazwy wszystkich zmiennych, nawet jeśli są one używane w wielu plikach / modułach. Ale ma tylko problem: działa tylko wtedy, gdy piszesz w stylu kodowania .

Gustavo Rodrigues
źródło
Kompilacja zamknięcia nie jest zaciemniającym kodem: P
NiCk Newman
1
Nie jest do tego stworzony, ale działa dobrze: nie dodaje dodatkowego kodu, jak niektóre kompilatory (które zwykle można odwrócić, które narzędzia cytowałem), ale zmienia go na nietypowe sposoby, niektóre nawet trudne do cofnięcia i usunięcia nieużywanego kod, który w porównaniu do rzeczywistego zaciemnienia jest dobry dla wydajności.
Gustavo Rodrigues
1
To nie jest dobry pomysł. Minimalizowanie / kompilowanie kodu po stronie serwera może powodować problemy z bezpieczeństwem, jeśli w minizatorze wystąpił błąd: zyan.scripts.mit.edu/blog/backdooring-js
mgol
Podany przez ciebie błąd dotyczy tylko UglifyJS: nie dotyczy kompilatora zamknięcia.
Gustavo Rodrigues,
Dla wszystkich, którzy dbają o minimalizowanie plików javascript, istnieje również un-minifier javascript. więc nie sądzę, że to w ogóle warstwa bezpieczeństwa
Fillipo Sniper
11

Mogę polecić JavaScript Utility autorstwa Patrick J. O'Neil. Może zaciemniać / kompaktować i kompresować i wydaje się być w tym całkiem niezły. To powiedziawszy, nigdy nie próbowałem zintegrować go z jakimkolwiek skryptem kompilacji.

Jeśli chodzi o zaciemnianie kontra minimalizowanie - nie jestem wielkim fanem tego pierwszego. To uniemożliwia debugowanie (błąd w linii 1 ... „czekaj, jest tylko jedna linia”) i zawsze rozpakowanie zajmuje trochę czasu. Ale jeśli musisz ... cóż.

Tsvetomir Tsonev
źródło
1
Ale zaciemnianie nie musi koniecznie kompresować go do jednego wiersza, może być tak proste, jak zmiana funkcji i nazw zmiennych lub konwersja ciągów znaków na base64. Minifying umieszcza cały kod w jednym wierszu.
rw-nandemo
Obecnie UglifyJS wydaje się najlepszym wyborem. Autor też jest fajny! :)
Tsvetomir Tsonev
Jeśli chodzi o debugowanie, możesz generować sourcemaps, które możesz uwzględnić podczas testowania, dzięki czemu możesz zobaczyć, w której linii wystąpił błąd, nawet jeśli został zminimalizowany.
Luca Steeb,
5

Sugerowałbym najpierw zminimalizować za pomocą czegoś takiego jak YUI Compressor, a następnie przekonwertować wszystkie ciągi i liczby na wartości HEX za pomocą czegoś takiego jak http://www.javascriptobfuscator.com/

Dzięki temu kod stałby się prawie niemożliwy do zrozumienia i myślę, że na tym etapie haker odtworzy Twój kod dłużej niż w rzeczywistości, gdyby napisał go od nowa. Przepisywanie i klonowanie jest tym, czego tak naprawdę nie możesz zatrzymać. W końcu jesteśmy wolnymi ludźmi!

Dynamit Blitzer
źródło
5

Dean Edward's Packer jest doskonałym zaciemniaczem, choć przede wszystkim zaciemnia kod, a nie elementy łańcucha, które możesz mieć w swoim kodzie.

Zobacz: Internetowe narzędzie do kompresji Javascript i wybierz Packer (Dean Edwards) z menu rozwijanego

smdrager
źródło
To bezcelowe. Można go łatwo rozpakować za pomocą jsbeautifier.org
Maciej Krawczyk
4

Mam wrażenie, że niektóre przedsiębiorstwa (np. JackBe) umieszczają zaszyfrowany kod JavaScript w plikach * .gif, a nie w plikach JS, jako dodatkową miarę zaciemniania.

xgMz
źródło
4

Wypróbuj to narzędzie Javascript Obfuscator

Użyłem go w mojej grze HTML5 nie tylko zmniejszyłem jego rozmiar z 950 KB do 150, ale także sprawiłem, że kod źródłowy był nieczytelny. Kompilatory zamykające i minifikatory są odwracalne. Osobiście nie wiem, jak odwrócić to zaciemnianie.

Jerczu
źródło
4

Używam Jasoba od lat i to jest najlepszy najlepszy zaciemniacz na rynku.
Ma zaawansowany interfejs użytkownika, ale nadal jest intuicyjny i łatwy w użyciu.
Będzie także obsługiwał pliki HTML i CSS.

Najlepszym sposobem na użycie tego jest poprzedzenie wszystkich prywatnych zmiennych czymś w rodzaju znaku podkreślenia, a następnie skorzystanie z tej sortfunkcji, aby zgrupować je wszystkie i zaznaczyć je jako cele zaciemnienia.

Użytkownicy nadal mogą przeglądać twoje źródło, ale znacznie trudniej jest je rozszyfrować, gdy twoje prywatne zmienne są konwertowane z czegoś podobnego _sUserPreferredNickNamedo a.

Silnik automatycznie wyliczy liczbę zmiennych docelowych i nada im priorytety, aby uzyskać maksymalną kompresję.

Nie pracuję dla Jasoba i nie czerpię korzyści z ich promowania, po prostu oferując przyjazne porady.
Minusem jest to, że nie jest darmowy i jest trochę drogi, ale nadal jest warty, gdy zestawi się go z alternatywami - „darmowe” opcje nawet się nie zbliżają.

Matt
źródło
Jason wydaje się bardziej zminimalizować niż zaciemniacz. Czy coś brakuje?
Alan McBee - MSFT
4

Czy próbowałeś Bananascript ? Tworzy wysoce skompresowany i całkowicie nieczytelny kod.

niutech
źródło
18
ładnie kompresuje kod, ale po prostu zmień eval()ostatni wiersz na, console.log()a Twoja konsola
wypluje
4

Używam narzędzia Closure-Compiler do zaciemnienia skryptu Java. Minimalizuje kod i ma więcej opcji zaciemniania. To narzędzie jest dostępne pod kodem Google pod adresem URL:
Narzędzia do zamykania

Ale teraz dni słyszę dużo o UglifyJS. Można znaleźć różne porównania między Cliler Compiler i UglifyJS, w których Uglify wydaje się być zwycięzcą.
UglifyJS: Szybki nowy kompresor JavaScript dla Node.js, który jest na równi z zamknięciem

Wkrótce dam szansę UglifyJS.

shaILU
źródło
3

Jako obfuscator / kompresor JavaScript / HTML / CSS możesz także wypróbować Patu Digua .

Adrian
źródło
3

Ten minimalizuje, ale nie zaciemnia. Jeśli nie chcesz korzystać z wiersza polecenia Java, możesz wkleić javascript do formularza internetowego.

Chris S.
źródło
1
Uwaga: Link nie działa.
Scott C Wilson,
1
@ScottWilson dzięki, zaktualizowałem
Chris S
2

Zdecydowanie powinieneś rozważyć spojrzenie na Obfuscriptor .

Wykraczam poza typowe sztuczki minimalizujące JavaScript, które widzieliśmy w innych narzędziach, takich jak YUI Compressor lub Google Closure .

Zaciemniony kod wygląda bardziej jak zaszyfrowany. W przeciwieństwie do wszystkiego, co widziałem wcześniej.

Mikrofon
źródło
Dzięki za link! Właśnie wypróbowałem obfuscriptor i kod rzeczywiście zaszyfrowany (bez klucza ???). I skompresowałem mój skrypt z 211 do 36 Kb!
Zauważ, że Obfuscriptor ostrzega, że ​​nie działa z IE. Dla niektórych jest to przełom.
Alan McBee - MSFT
1
Link w odpowiedzi nie wskazuje już narzędzia. Nie mogę znaleźć innego odniesienia na żywo.
buzoherbert
pierwszy link jest martwy. „Obfuscriptor”
Alp Altunel
2

Jeśli korzystasz z biblioteki JavaScript, rozważ Dojo Toolkit, który jest kompatybilny (po drobnych modyfikacjach) z kompilacją trybu zaawansowanego kompilatora Closure.

Dojo - jedyna biblioteka JavaScript kompatybilna z kompilatorem Closure

Kod skompilowany w trybie Closure Advanced jest prawie niemożliwy do odtworzenia, nawet przechodząc przez upiększacz, ponieważ cała baza kodu (w tym biblioteka) jest zaciemniona. Jest również średnio o 25% mniejszy.

Kod JavaScript, który jest jedynie zminimalizowany (YUI Compressor, Uglify itp.), Jest łatwy do odtworzenia po przejściu przez upiększacz.

Stephen Chung
źródło