Как защитить файлы javascript?
Я знаю, что невозможно скрыть исходный код, но, например, если мне нужно связать файл JavaScript с моего CDN с веб-страницей, и я не хочу, чтобы люди знали местоположение и/или содержимое этого script, возможно ли это?
Например, чтобы связать a script с веб-сайтом, мы используем:
<script type="text/javascript" src="http://somedomain.com/scriptxyz.js">
</script>
Теперь можно скрыть от пользователя, откуда приходит script, или скрыть содержимое script и все еще использовать его на веб-странице?
Например, если сохранить его в моем личном CDN, который требует пароль для доступа к файлам, это сработает? Если нет, что будет работать, чтобы получить то, что я хочу?
Ответы
Ответ 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 цента.