Как защитить файлы JavaScript?
-
16-10-2019 - |
Вопрос
Я знаю, что невозможно скрыть исходный код, но, например, если мне нужно связать файл JavaScript из моего CDN на веб -страницу, и я не хочу, чтобы люди знали местоположение и/или содержание этого скрипта, это возможный?
Например, чтобы связать сценарий с веб -сайта, мы используем:
<script type="text/javascript" src="http://somedomain.com/scriptxyz.js">
</script>
Теперь можно ли скрыть от пользователя, откуда от скрипта или скрыть содержимое скрипта и все еще использовать его на веб -странице?
Например, сохранив его в моем частном CDN, который нуждается в пароле для доступа к файлам, будет ли это работать? Если нет, то что будет работать, чтобы получить то, что я хочу?
Решение
Хороший вопрос с простым ответом: Вы не можете!
JavaScript-это язык программирования на стороне клиента, поэтому он работает на машине клиента, поэтому вы не можете ничего скрыть от клиента.
Запутывание вашего кода - хорошее решение, но этого недостаточно, потому что, хотя это сложно, кто -то может расшифровать ваш код и «украсть» ваш сценарий.
Есть несколько способов затруднить ваш код, чтобы быть украденным, но, как я не сказал, что ничто не является пулевым.
Вне моей головы, одна идея состоит в том, чтобы ограничить доступ к вашим внешним файлам JS извне страницы, в который вы внедряете свой код. В этом случае, если у вас есть
<script type="text/javascript" src="myJs.js"></script>
и кто -то пытается получить доступ к myjs.js Файл в браузере, ему не следует предоставить никакого доступа к источнику скрипта.
Например, если ваша страница записана в PHP, вы можете включить скрипт через include
функционируйте и позвольте сценарию решить, есть ли это Безопасно"вернуть его источник.
В этом примере вам понадобится внешний файл "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.
Еще одна интересная идея заключается в том, что в конце вашего сценария вы удаляете содержимое вашего элемента сценария DOM, так что после того, как браузер оценивает ваш код, код исчезает:
<script id="erasable" type="text/javascript">
//your code goes here
document.getElementById('erasable').innerHTML = "";
</script>
Все это просто простые взломы, которые не могут, и я не могу подчеркнуть это достаточно: не могу, полностью защитить ваш код JS, но они могут безвредить кого -то, кто пытается «украсть» ваш код.
Обновлять:
Я недавно наткнулся Очень интересная статья написано Патрик Вейд О том, как скрыть свой код JS, и он раскрывает другой подход: вы можете кодировать свой исходный код в изображение! Конечно, это тоже не пуленевое доказательство, но это другое изгородь что вы могли бы построить вокруг своего кода.
Идея этого подхода заключается в том, что большинство браузеров могут использовать элемент Canvas для манипулирования пикселями на изображениях. А поскольку Pixel Canvas представлен 4 значения (RGBA), каждый пиксель может иметь значение в диапазоне 0-255. Это означает, что вы можете хранить персонажа (фактическое это код ASCII) в каждом пикселе. Остальная часть кодирования/декодирования тривиальна.
Спасибо, Патрик!
Другие советы
Единственное, что вы можете сделать, это запутанно Ваш код, чтобы затруднить чтение. Независимо от того, что вы делаете, если вы хотите, чтобы JavaScript выполнил в своем браузере, им придется иметь код.
Прочитайте это. Анкет Он имеет очень хороший способ скрыть ваш код в источнике просмотра и инструменте отладки, таким как Firebug.
От моих знаний, это невозможно.
Ваш браузер должен иметь доступ к файлам JS, чтобы выполнить их. Если у браузера есть доступ, то пользователь браузера также имеет доступ.
Если вы защищаете свои файлы JS, то браузер не сможет получить к ним доступ, победив целью JS в первую очередь.
Вскоре вы можете сделать что-то подобное (если вы можете создать сценарии на стороне сервера, что, похоже, вы можете):
Вместо того, чтобы загружать сценарий, как обычно, отправьте запрос AJAX на страницу PHP (это может быть что угодно; я просто использую его сам). Попросите PHP найти файл (возможно, в непубличной части сервера), откройте его с file_get_contents
, и вернуться (читай: echo
) содержимое как строку.
Когда эта строка возвращается в JavaScript, пусть она создает новый script
теж, заполняйте его innerHTML
С кодом, который вы только что получили, и прикрепите тег к странице. (Ты мощь есть проблемы с этим; innerHTML
Может быть, не то, что вам нужно, но вы можете экспериментировать.)
Если вы сделаете это много, вы можете даже захотеть настроить страницу PHP, которая принимает переменную GET с именем сценария, чтобы вы могли динамически получать различные сценарии, используя один и тот же PHP. (Может быть, вместо этого вы могли бы использовать пост, чтобы у другого было труднее увидеть, что вы делаете. Я не знаю.)
РЕДАКТИРОВАТЬ: Я думал, ты только пытался скрыть расположение сценария. Это, очевидно, не поможет, если вы пытаетесь скрыть сам скрипт.
Google Closure Compiler, Юи Компрессор, Министерство, /Упаковщик/... и т. Д., Это варианты сжатия/запутывания ваших кодов JS. Но никто из них не может помочь вам скрыть ваш код от пользователей.
Любой, у кого есть приличные знания, может легко декодировать/декодировать ваш код, используя такие инструменты, как JS Beautifier. Анкет Вы называете это.
Таким образом, ответ в том, что вы всегда можете усложнить свой код читать/декодировать, но наверняка нет способа скрыть.
Я думаю, что единственным способом является размещение необходимых данных на сервере и позволить только пользователю зарегистрированного входа в систему получить доступ к данным по мере необходимости (вы также можете сделать некоторую сторону сервера вычислений). Это не защищает ваш код JavaScript, но сделает его неработающим без кода на стороне сервера
Как я уже говорил в комментарии, я оставил на ответе Gion_13 раньше (пожалуйста, прочтите), вы действительно не можете. Не с JavaScript.
Если вы не хотите, чтобы код был доступным на стороне клиента (= кража без больших усилий), я предложу использовать PHP (ASP, Python, Perl, Ruby, JSP + Java-Servlets), который является обработанным сервером -Сас и только результаты выполнения вычислений/кода предоставляются пользователю. Или, если вы предпочитаете, даже вспыхивайте или Java-Applet, который позволяет вычислению на стороне клиента, но скомпилируется и, следовательно, труднее в обратном двигателе (не невозможно таким образом).
Только мои 2 цента.