Подтвердить что ты не робот

Как я могу скрыть или зашифровать код JavaScript?

Есть ли способ скрыть или зашифровать код JavaScript, чтобы люди не просматривали, не копировали и/или не изменяли проприетарные программы?

4b9b3361

Ответ 1

Вы можете запутать это, но нет способа полностью защитить его.

пример обфускатора: https://obfuscator.io

Ответ 2

Нет, это невозможно. Если он запущен в клиентском браузере, он должен быть загружен браузером клиента. Это довольно тривиально использовать Fiddler для проверки HTTP-сессии и получения любых загруженных js файлов.

Есть трюки, которые вы можете использовать. Одним из наиболее очевидных является использование обфускатора javascript.

Опять же, обфускация только предотвращает случайное отслеживание и не препятствует людям поднимать и использовать ваш код.

Вы можете попробовать скомпилированное действие script в виде флеш-ролика.

Ответ 3

В то время как все согласятся с тем, что шифрование Javascript является плохой идеей, есть несколько небольших случаев, когда замедление атаки лучше, чем ничего. Вы можете начать с YUI Compressor (как @Ben Alpert), или JSMin, Uglify или еще много.

Однако основной случай, когда я хочу "скрыть вещи", - это когда я публикую адрес электронной почты. Обратите внимание, что есть проблема с Chrome, когда вы нажимаете "проверять элемент". Он будет показывать ваш исходный код: каждый раз. Вот почему обфускация обычно рассматривается как лучший способ пойти.

В этой заметке я беру двухструнную атаку, чтобы просто замедлить спам-ботов. я Обфускайте/уменьшите js, а затем снова запустите его через кодер (опять же, этот второй шаг совершенно бессмыслен в chrome).

Хотя не совсем чистый кодировщик Javascript, лучший html-кодер, который я нашел, http://hivelogic.com/enkoder/. Это сделает следующее:

<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>

в это:

<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>

Возможно, этого достаточно, чтобы замедлить несколько спам-ботов. У меня не было никакого спама, используя этот (! Еще).

Ответ 4

Один из лучших компрессоров (не специально обфускатор) - это YUI Compressor.

Ответ 5

JavaScript - это язык сценариев и, следовательно, остается в читаемой человеком форме, пока не настало время его интерпретировать и выполнить с помощью среды выполнения JavaScript.

Единственный способ частично скрыть это, по крайней мере от менее технических умов, - это запутать.

Обфускация усложняет для людей чтение, но не невозможно для технически подкованных.

Ответ 6

Если у вас есть что-то конкретное, вы хотите скрыть (например, собственный алгоритм), поместите его на сервер или поместите в Flash-фильм и вызовите его с помощью JavaScript. Написание ActionScript очень похоже на написание JavaScript, и вы можете общаться между JavaScript и ActionScript. Вы можете сделать то же самое с Silverlight, но Silverlight не имеет прокрутки Flash.

Однако помните, что любые мобильные телефоны могут запускать ваш JavaScript, но не Silverlight или Flash, так что вы наносите ущерб своим мобильным пользователям, если вы идете с Flash или Silverlight.

Ответ 7

Единственный безопасный способ защитить свой код - это не отдать его. При развертывании клиента не обойтись без доступа клиента к коду.

Итак, короткий ответ: вы не можете этого сделать.

Более длинный ответ касается flash или Silverlight. Хотя я считаю, что silverlight с радостью отдает секреты с рефлектором, работающим на клиенте.

Я не уверен, существует ли что-то симулятивное с флеш-платформой.

Ответ 8

Я знаю, что это старый поток, но я бы просто хотел добавить один метод скрытия ваших скриптов, хотя бы для того, чтобы сделать его немного сложнее для просмотра. Ключ должен использовать AJAX и полностью синхронизировать его с вашими серверными сценариями, такими как Php. Таким образом, весь алгоритм не полностью раскрыт и будет абсолютно бессмысленным для всех, кто хочет украсть ваши коды. Конечно, это не 100% -ое надежное решение, так как ваши клиентские скрипты будут и могут быть выставлены, если вы нажмете F12 на хроме, например. Кроме того, если ваши java-скрипты зависят от большого количества серверных процессов, в действительности вам вообще не нужно будет волноваться.

В этом script истинное содержимое - ваши фактические скрипты на стороне клиента - извлекается только через метод get (ps: вы все равно можете видеть содержимое, следуя URL-адресу - чтобы избежать этого, используйте метод 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 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>

Опять же, это не дурацкий метод. Любой может полностью обогнать предварительно загруженный script, пока он запускает метод get перед ним. Я использовал сеансы PHP для ограничения доступа; которые могут быть улучшены.

Честно говоря, это просто дополнительная загрузка процесса. Но это не мешает никому пытаться, верно?

PS: Простите меня, если мои коды и использование терминологий немного рудиментарны. Я только делал Php в течение года на момент написания.

Способ публикации:

    <?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 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>