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

Как защитить файлы javascript?

Я знаю, что невозможно скрыть исходный код, но, например, если мне нужно связать файл JavaScript с моего CDN с веб-страницей, и я не хочу, чтобы люди знали местоположение и/или содержимое этого script, возможно ли это?

Например, чтобы связать a script с веб-сайтом, мы используем:

<script type="text/javascript" src="http://somedomain.com/scriptxyz.js">
</script>

Теперь можно скрыть от пользователя, откуда приходит script, или скрыть содержимое script и все еще использовать его на веб-странице?

Например, если сохранить его в моем личном CDN, который требует пароль для доступа к файлам, это сработает? Если нет, что будет работать, чтобы получить то, что я хочу?

4b9b3361

Ответ 1

Хороший вопрос с простым ответом: вы не можете!

Javascript - это язык программирования на стороне клиента, поэтому он работает на клиентской машине, поэтому вы ничего не можете скрыть от клиента.
Обфускание вашего кода - хорошее решение, но этого недостаточно, потому что, хотя это сложно, кто-то может расшифровать ваш код и "украсть" ваш script.
Есть несколько способов сделать ваш код трудно украденным, но, поскольку я ничего не сказал, это пуленепробиваемый.

Сверху моей головы одна идея состоит в том, чтобы ограничить доступ к вашим внешним js файлам за пределами страницы, в которую вы вставляете свой код. В этом случае, если у вас есть

<script type="text/javascript" src="myJs.js"></script>

и кто-то пытается получить доступ к файлу myJs.js в браузере, ему не должен быть предоставлен доступ к источнику script.
Например, если ваша страница написана на php, вы можете включить script через функцию include и позволить script решить, безопасно ли это вернуть источник.
В этом примере вам понадобится внешний файл "js" (написанный в php) myJs.php:

<?php
    $URL = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    if ($URL != "my-domain.com/my-page.php")
    die("/\*sry, no acces rights\*/");
?>
// your obfuscated script goes here

который будет включен в вашу главную страницу my-page.php:

<script type="text/javascript">
    <?php include "myJs.php"; ?>;
</script> 

Таким образом, только браузер мог видеть содержимое файла js.

Еще одна интересная идея заключается в том, что в конце вашего script вы удаляете содержимое вашего элемента dom script, чтобы после того, как браузер оценил ваш код, код исчезнет:

<script id="erasable" type="text/javascript">
    //your code goes here
    document.getElementById('erasable').innerHTML = "";
</script>

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

Обновление:

Недавно я встретил очень интересную статью, написанную Патрик Вайд о том, как скрыть свой js-код, и он раскрывает другой подход: вы можете кодировать исходный код в изображение! Конечно, это тоже не доказательство пули, но это еще один забор, который вы могли бы построить вокруг своего кода.
Идея такого подхода заключается в том, что большинство браузеров могут использовать элемент canvas для обработки пикселей на изображениях. И поскольку пиксель canvas представлен 4 значениями (rgba), каждый пиксель может иметь значение в диапазоне 0-255. Это означает, что вы можете хранить символ (фактический его ascii-код) в каждом пикселе. Остальная часть кодирования/декодирования тривиальна.
Спасибо, Патрик!

Ответ 2

Единственное, что вы можете сделать, это obfuscate ваш код, чтобы сделать его более трудным для чтения. Независимо от того, что вы делаете, если вы хотите, чтобы javascript выполнялся в своем браузере, они должны иметь код.

Ответ 3

Прочитайте это. Он имеет очень хороший способ скрыть ваш код как в источнике представления, так и в инструменте отладки, таком как firebug.

Ответ 4

Насколько мне известно, это невозможно.

Ваш браузер должен иметь доступ к файлам JS, чтобы их можно было выполнить. Если браузер имеет доступ, пользователь браузера также имеет доступ.

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

Ответ 5

Сверху моей головы вы можете сделать что-то вроде этого (если вы можете создавать серверные скрипты, которые звучат так, как вы можете):

Вместо загрузки script как обычно, отправьте запрос AJAX на страницу PHP (это может быть что угодно, я просто использую его сам). Попросите PHP найти файл (возможно, на непубличной части сервера), откройте его с помощью file_get_contents и верните (читайте: echo) содержимое в виде строки.

Когда эта строка вернется к JavaScript, создайте новый тег script, заполните его innerHTML кодом, который вы только что получили, и прикрепите тег к странице. (У вас могут быть проблемы с этим: innerHTML может быть не таким, как вам нужно, но вы можете экспериментировать.)

Если вы это сделаете много, вы можете даже захотеть создать страницу PHP, которая принимает переменную GET с именем script, чтобы вы могли динамически захватывать разные сценарии с использованием того же PHP. (Возможно, вы могли бы использовать POST вместо этого, чтобы сделать его немного сложнее для других людей, чтобы увидеть, что вы делаете. Я не знаю.)

EDIT: Я думал, что вы только пытаетесь скрыть расположение script. Это явно не поможет, если вы пытаетесь скрыть сам script.

Ответ 6

Забудьте об этом, это не выполнимо.

Независимо от того, что вы попробуете, это не сработает. Все, что нужно сделать пользователю, чтобы обнаружить ваш код, и его местоположение - посмотреть на вкладке net в firebug или использовать fiddler, чтобы увидеть, какие запросы выполняются.

Ответ 7

Google Closure Compiler, компрессор YUI, Minify, /Packer/... и т.д., являются параметрами для сжатия/обфускации ваших JS-кодов. Но ни один из них не поможет вам скрывать ваш код от пользователей.

Любой человек с приличным знанием может легко декодировать/де-обфускацию вашего кода с помощью таких инструментов, как JS Beautifier. Вы называете это.

Итак, ответ: вы всегда можете сделать свой код труднее читать/декодировать, но наверняка нет возможности скрыться.

Ответ 8

Я думаю, что единственный способ - разместить требуемые данные на сервере и разрешить только зарегистрированному пользователю доступ к данным по мере необходимости (вы также можете сделать некоторые вычисления на стороне сервера). Это не защитит ваш код javascript, но сделает его неработоспособным без кода на стороне сервера.

Ответ 9

Как я уже сказал в комментарии, я оставил на gion_13 ответ раньше (пожалуйста, прочитайте), вы действительно не можете. Не с javascript.

Если вы не хотите, чтобы код был доступен на стороне клиента (= stealable без особых усилий) моим предложением было бы использовать PHP (ASP, Python, Perl, Ruby, JSP + Java-Servlets), который обрабатывается на стороне сервера, и пользователю предоставляются только результаты выполнения вычисления/кода. Или, если хотите, даже Flash или Java-апплет, которые позволяют выполнять вычисление/выполнение на стороне клиента, но скомпилированы и, следовательно, сложнее обратный движок (это не невозможно).

Только мои 2 цента.