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?
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?
Odpowiedzi:
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.
--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.
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ę ”
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.
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.
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.
[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.
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?
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?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C Utwórz trudny do wyświetlenia plik php z prawdziwym kodem w środku
Co robi ten kod php?
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=';}; ?>
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.
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 ...
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.
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”).
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 .
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óż.
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!
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
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.
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 sort
funkcji, 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 _sUserPreferredNickName
do 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ą.
Czy próbowałeś Bananascript ? Tworzy wysoce skompresowany i całkowicie nieczytelny kod.
eval()
ostatni wiersz na, console.log()
a Twoja konsola
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.
Jako obfuscator / kompresor JavaScript / HTML / CSS możesz także wypróbować Patu Digua .
Ten minimalizuje, ale nie zaciemnia. Jeśli nie chcesz korzystać z wiersza polecenia Java, możesz wkleić javascript do formularza internetowego.
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.
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.
Używałem tego w przeszłości i robi to dobrą robotę. To nie jest darmowe, ale zdecydowanie powinieneś rzucić okiem.
JavaScript Obfuscator & Encoder