Jak Mogę ukryć lub zaszyfrować kod JavaScript? [duplikat]

To pytanie ma już odpowiedź tutaj:

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?

Author: Samuel Liew, 2009-06-20

8 answers

Można to zaciemnić, ale nie da się go całkowicie ochronić.

Przykład obfuscator: http://www.javascriptobfuscator.com/Default.aspx

 65
Author: Sev,
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.

 6
Author: Alan,
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).

 6
Author: cmroanirgo,
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 .

 5
Author: Sophie Alpert,
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.

 3
Author: Nosredna,
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.

 2
Author: Andrew Harry,
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.

 2
Author: BakerTheHacker,
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>
 0
Author: RJBaytos,
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