Jak Mogę ukryć lub zaszyfrować kod JavaScript? [duplikat]
To pytanie ma już odpowiedź tutaj:
- Jak mogę zaciemnić (chronić) JavaScript? [zamknięty] 24 odpowiedzi
Czy Jest jakiś sposób, aby ukryć lub zaszyfrować kod JavaScript, aby uniemożliwić ludziom przeglądanie, kopiowanie i / lub modyfikowanie prawnie zastrzeżonych programów?
8 answers
Można to zaciemnić, ale nie da się go całkowicie ochronić.
Przykład obfuscator: http://www.javascriptobfuscator.com/Default.aspx
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 22:52:57
Nie, to niemożliwe. Jeśli działa w przeglądarce klienta, musi zostać pobrany przez przeglądarkę klienta. To dość trywialne, aby użyć Fiddler do sprawdzenia sesji HTTP i pobrać wszelkie pobrane pliki js.
Są sztuczki, których możesz użyć. Jednym z najbardziej oczywistych jest użycie obfuscatora javascript.
Z drugiej strony, zaciemnienie zapobiega tylko przypadkowym szpiegom i nie uniemożliwia ludziom podnoszenia i używania Twojego kodu.
Możesz wypróbować skompilowany skrypt akcji w postaci flash movie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 22:53:57
Podczas gdy wszyscy ogólnie zgadzają się, że szyfrowanie Javascript jest złym pomysłem , istnieje kilka małych przypadków użycia, w których spowolnienie ataku jest lepsze niż nic. Możesz zacząć od Yui Compressor (Jak powiedział @Ben Alpert), lub JSMin, Uglify lub wiele innych.
Jednak głównym przypadkiem, w którym chcę naprawdę "ukryć rzeczy", jest publikowanie adresu e-mail. Uwaga: Po kliknięciu na "inspect element" pojawia się problem Chrome. Pokaże Twój oryginalny kod: za każdym razem. Dlatego zaciemnianie jest ogólnie uważane za lepszy sposób.
W tej notce, przyjmuję atak na dwa pręty, wyłącznie po to, aby spowolnić spam boty. Obfuscate/minify js i następnie uruchomić go ponownie przez koder (ponownie, ten drugi krok jest całkowicie bez sensu w chrome).
Chociaż nie do końca czysty koder Javascript, najlepszy koder html jaki znalazłem to http://hivelogic.com/enkoder / . zmieni to:
<script type="text/javascript">
//<![CDATA[
<!--
var c=function(e) { var m="mail" + "to:webmaster";var a="somedomain"; e.href = m+"@"+a+".com";
};
//-->
//]]>
</script>
<a href="#" onclick="return c(this);"><img src="images/email.png" /></a>
Do to:
<script type="text/javascript">
//<![CDATA[
<!--
var x="function f(x){var i,o=\"\",ol=x.length,l=ol;while(x.charCodeAt(l/13)!" +
"=50){try{x+=x;l+=l;}catch(e){}}for(i=l-1;i>=0;i--){o+=x.charAt(i);}return o" +
".substr(0,ol);}f(\")87,\\\"meozp?410\\\\=220\\\\s-dvwggd130\\\\#-2o,V_PY420" +
"\\\\I\\\\\\\\_V[\\\\\\\\620\\\\o710\\\\RB\\\\\\\\610\\\\JAB620\\\\720\\\\n\\"+
"\\{530\\\\410\\\\WJJU010\\\\|>snnn|j5J(771\\\\p{}saa-.W)+T:``vk\\\"\\\\`<02" +
"0\\\\!610\\\\'Dr\\\\010\\\\630\\\\400\\\\620\\\\700\\\\\\\\\\\\N730\\\\,530" +
"\\\\2S16EF600\\\\;420\\\\9ZNONO1200\\\\/000\\\\`'7400\\\\%n\\\\!010\\\\hpr\\"+
"\\= -cn720\\\\a(ce230\\\\500\\\\f730\\\\i,`200\\\\630\\\\[YIR720\\\\]720\\\\"+
"r\\\\720\\\\h][P]@JHADY310\\\\t230\\\\G500\\\\VBT230\\\\200\\\\Clxhh{tzra/{" +
"g0M0$./Pgche%Z8i#p`v^600\\\\\\\\\\\\R730\\\\Q620\\\\030\\\\730\\\\100\\\\72" +
"0\\\\530\\\\700\\\\720\\\\M410\\\\N730\\\\r\\\\530\\\\400\\\\4420\\\\8OM771" +
"\\\\`4400\\\\$010\\\\t\\\\120\\\\230\\\\r\\\\610\\\\310\\\\530\\\\e~o120\\\\"+
"RfJjn\\\\020\\\\lZ\\\\\\\\CZEWCV771\\\\v5lnqf2R1ox771\\\\p\\\"\\\\tr\\\\220" +
"\\\\310\\\\420\\\\600\\\\OSG300\\\\700\\\\410\\\\320\\\\410\\\\120\\\\620\\" +
"\\q)5<: 0>+\\\"(f};o nruter};))++y(^)i(tAedoCrahc.x(edoCrahCmorf.gnirtS=+o;" +
"721=%y;++y)87<i(fi{)++i;l<i;0=i(rof;htgnel.x=l,\\\"\\\"=o,i rav{)y,x(f noit" +
"cnuf\")" ;
while(x=eval(x));
//-->
//]]>
</script>
Może to wystarczy, aby spowolnić kilka spam botów. Nie miałem żadnego spamu przy użyciu tego (!jeszcze).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-03 22:33:47
Jedną z najlepszych kompresorów (nie konkretnie obfuscator) jest Yui Compressor .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 22:54:08
Jeśli masz coś konkretnego, co chcesz ukryć( jak własny algorytm), umieść to na serwerze lub umieść to w filmie Flash i wywołaj to za pomocą JavaScript. Pisanie ActionScript jest bardzo podobne do pisania JavaScript i można komunikować się między JavaScript i ActionScript. Możesz zrobić to samo z Silverlight, ale Silverlight nie ma błysku penetracji.
Pamiętaj jednak, że każdy telefon komórkowy może uruchomić JavaScript, ale nie Silverlight lub Flash, więc okaleczasz użytkowników telefonów komórkowych, jeśli wybierzesz Flash lub Silverlight.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 23:34:09
Jedynym bezpiecznym sposobem ochrony kodu jest nie oddawanie go. Dzięki wdrożeniu klienta nie ma możliwości unikania dostępu klienta do kodu.
Więc krótka odpowiedź brzmi: nie możesz tego zrobić
Dłuższą odpowiedzią jest flash lub Silverlight. Chociaż wierzę, że silverlight chętnie zdradzi sekrety z reflektorem działającym na kliencie.
Nie jestem pewien, czy istnieje coś symulowanego z platformą flash.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 22:57:29
JavaScript jest językiem skryptowym i dlatego pozostaje w formie czytelnej dla człowieka, dopóki nie nadejdzie czas na jego interpretację i wykonanie przez środowisko uruchomieniowe JavaScript.
Jedynym sposobem na częściowe ukrycie tego, przynajmniej przed mniej technicznymi umysłami, jest zaciemnienie.
Zaciemnienie utrudnia ludziom jej odczytanie, ale nie jest niemożliwe dla technicznie doświadczonych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 23:29:20
Wiem, że to stary wątek, ale chciałbym tylko dodać jedną metodę ukrywania skryptów, choćby po to, by utrudnić oglądanie. Kluczem jest użycie AJAX i jego działanie całkowicie zsynchronizowane ze skryptami po stronie serwera, takimi jak Php. W ten sposób cały algorytm nie jest całkowicie odsłonięty i byłby całkowicie bez znaczenia dla każdego, kto chce ukraść Twoje kody. Oczywiście nie jest to w 100% niezawodne rozwiązanie, ponieważ skrypty po stronie klienta byłyby i nadal mogą być narażone, jeśli naciśniesz F12 na przykład w chrome. Ponadto, jeśli Twoje skrypty java opierają się na wielu procesach po stronie serwera, to naprawdę nie musisz się martwić.
W tym skrypcie, prawdziwa zawartość-twoje rzeczywiste skrypty po stronie klienta - są pobierane tylko za pomocą metody get (ps: nadal możesz zobaczyć zawartość, podążając za adresem url - aby tego uniknąć, użyj metody post):
<?Php
//THE FOLLOWING VARIABLE IS ADDED TO ENABLE TOGGLING OF THIS FUNCTIONALITY:
$obscureScripts = TRUE;
//IF OBSCURE SCRIPT FUNCTIONALITY IS ALLOWED,
//THE SYSTEM SHOULD ONLY ALLOW REQUESTS TRIGGERED BY SPECIFIED GET METHOD
//OTHER THAN THAT, OR UNLESS $_GET['fetch'] == 'content', PERFORM THE FOLLOWING SCRIPTS:
if ($obscureScripts && !(isset($_GET['fetch']) && $_GET['fetch'] == 'content'))
{ //OPEN A SESSION
session_start();
//CREATE AN INDICATOR THAT THIS METHOD HAS BEEN USED
$_SESSION['obscr'] = 'set';
//CLOSE SESSION WRITER
session_write_close();
//ECHO THE FAKE CONTENTS OF YOUR PAGE
echo "<script type='text/javascript' src='plugins/jquery-1.9.0.min.js'></script> \n".
"<script> \n".
"$.get \n".
"( '?fetch=content', \n".
" function(data) \n".
" { $('body').fadeOut \n".
" ( function() \n".
" { $(this).empty().html(data).fadeIn(100); \n".
" } \n".
" ); \n".
" } \n".
"); \n".
"</script> \n".
"<html><head><title>Page Front</title><link rel='icon' href='icon.ico'/></head> \n".
"<body bgcolor='#121212'><center>Loading...</center></body></html> \n";
//THE FAKE CONTENTS WOULD IN TURN RUN A JQUERY SCRIPT TO RETRIEVE THE ACTUAL PAGE CONTENT
//DO NOT RUN THE REST OF THE SCRIPT/PAGE
exit();
}
//IF OBSCURE SCRIPT FUNCTIONALITY IS ON, AND IF A FETCH REQUEST WAS MADE,
//PERFORM THE FOLLOWING VALIDATION
else if ($obscureScripts && isset($_GET['fetch']) && $_GET['fetch'] == 'content')
{ //ATTEMPT TO RETRIEVE EXISTING SESSION
session_start();
//CHECK IF A SESSION WAS SET: THIS IS TO INDICATE THE LOADING OF FAKE CONTENTS AND THAT
//THE REAL CONTENTS ARE ONLY LOADED ONCE - BY THE JQUERY SCRIPTS PREVIOUSLY LOADED
if (isset($_SESSION['obscr']) && $_SESSION['obscr'] == 'set')
{ //ONCE CONFIRMED, UNSET THE SESSION TO PREVENT ANOTHER REQUEST
unset($_SESSION['obscr']);
//IF THE SESSION BECAME EMPTY AFTER UNSETTING THE 'obscr' SESSION VARIABLE,
//DELETE THE SESSION
if (empty($_SESSION))
{ session_unset();
session_destroy();
}
//CLOSE THE SESSION WRITER AND PROCEED TO THE REST OF THE CONTENTS
session_write_close();
//NOTICE THAT THERE'S NOT exit() OR die() REQUEST HERE.
//THIS MEANS THAT THE SCRIPT WOULD PROCEED TO THE CONTENTS
}
//IF NO SESSION IS SET, THIS MEANS THAT THE GET METHOD IS PROBABLY BEING REQUESTED
//FOR THE SECOND TIME; PROBABLY NOT BY THE PRE-LOADED SCRIPTS
//IF SO, PERFORM THE FOLLOWING:
else
{ //CLOSE THE SESSION WRITER
session_write_close();
//RELOAD THE PAGE BY REDIRECTING TO SELF
header('Location: '.$_SERVER['PHP_SELF']);
//PREVENT SHOWING ANYTHING AFTER THIS CODE
exit();
}
}
?>
<html>
<head><title>The content you want to hide</title></head>
<body>Your precious content.</body>
</html>
Ponownie, nie jest to metoda niezawodna. Każdy może całkowicie wyprzedzić wstępnie załadowany skrypt, o ile Uruchom metodę get przed nią. Użyłem sesji PHP, aby ograniczyć dostęp; to można jeszcze poprawić.
Szczerze mówiąc, to tylko dodatkowy ładunek procesu. Ale to nie powstrzymuje nikogo przed próbowaniem, prawda?
PS: Wybacz mi, jeśli moje kody i użycie terminologii są trochę prymitywne. W momencie pisania PHP zajmuję się dopiero od roku.
Metoda Post:
<?Php
//THE FOLLOWING VARIABLE IS ADDED TO ENABLE TOGGLING OF THIS FUNCTIONALITY:
$obscureScripts = TRUE;
//IF OBSCURE SCRIPT FUNCTIONALITY IS ALLOWED,
//THE SYSTEM SHOULD ONLY ALLOW REQUESTS TRIGGERED BY SPECIFIED GET METHOD
//OTHER THAN THAT, OR UNLESS $_GET['fetch'] == 'content', PERFORM THE FOLLOWING SCRIPTS:
if ($obscureScripts && !(isset($_POST['fetch']) && $_POST['fetch'] == 'content'))
{ //OPEN A SESSION
session_start();
//CREATE AN INDICATOR THAT THIS METHOD HAS BEEN USED
$_SESSION['obscr'] = 'set';
//CLOSE SESSION WRITER
session_write_close();
//ECHO THE FAKE CONTENTS OF YOUR PAGE
echo // USING HEREDOC THIS TIME
<<<SCRIPT
<script type='text/javascript' src='plugins/jquery-1.9.0.min.js'></script>
<script>
\$.post
( "{$_SERVER['PHP_SELF']}",
{ fetch:"content"
}
).done
( function(data)
{ \$("body").empty().html(data);
}
);
</script>
<html>
<head>
<title>Page Front</title>
</head>
<body>
<center>Loading...</center>
</body>
</html>
SCRIPT;
//THE FAKE CONTENTS WOULD IN TURN RUN A JQUERY SCRIPT TO RETRIEVE THE ACTUAL PAGE CONTENT
//DO NOT RUN THE REST OF THE SCRIPT/PAGE
exit();
}
//IF OBSCURE SCRIPT FUNCTIONALITY IS ON, AND IF A FETCH REQUEST WAS MADE,
//PERFORM THE FOLLOWING VALIDATION
else if ($obscureScripts && isset($_POST['fetch']) && $_POST['fetch'] == 'content')
{ //ATTEMPT TO RETRIEVE EXISTING SESSION
session_start();
//CHECK IF A SESSION WAS SET: THIS IS TO INDICATE THE LOADING OF FAKE CONTENTS AND THAT
//THE REAL CONTENTS ARE ONLY LOADED ONCE - BY THE JQUERY SCRIPTS PREVIOUSLY LOADED
if (isset($_SESSION['obscr']) && $_SESSION['obscr'] == 'set')
{ //ONCE CONFIRMED, UNSET THE SESSION TO PREVENT ANOTHER REQUEST
unset($_SESSION['obscr']);
//IF THE SESSION BECAME EMPTY AFTER UNSETTING THE 'obscr' SESSION VARIABLE,
//DELETE THE SESSION
if (empty($_SESSION))
{ session_unset();
session_destroy();
}
//CLOSE THE SESSION WRITER AND PROCEED TO THE REST OF THE CONTENTS
session_write_close();
//NOTICE THAT THERE'S NOT exit() OR die() REQUEST HERE.
//THIS MEANS THAT THE SCRIPT WOULD PROCEED TO THE CONTENTS
}
//IF NO SESSION IS SET, THIS MEANS THAT THE GET METHOD IS PROBABLY BEING REQUESTED
//FOR THE SECOND TIME; PROBABLY NOT BY THE PRE-LOADED SCRIPTS
//IF SO, PERFORM THE FOLLOWING:
else
{ //CLOSE THE SESSION WRITER
session_write_close();
//RELOAD THE PAGE BY REDIRECTING TO SELF
header('Location: '.$_SERVER['PHP_SELF']);
//PREVENT SHOWING ANYTHING AFTER THIS CODE
exit();
}
}
?>
<html>
<head><title>The content you want to hide</title></head>
<body>Your precious content.</body>
</html>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-28 16:04:29