Pull to refresh

JavaScript: Прячем скрипт от посторонних глаз

Хотелось ли Вам когда-нибудь спрятать от посторонних людей на своей страничке скрипт, который реализует нереально красивое появление меню или выполнение других действий, которые Вы бы не хотели видеть в скором времени на каждом втором сайте?
Если да, то способ изложенный в этой статье Вам пригодится совместно с обфускацией кода. При этом оговорюсь сразу, что способ не 100-процентный, но от большинства непрофессионалов и части профессионалов он возможно защитит.

Теория


Допустим у нас есть страничка nojs.php, а на ней скрипт secret.js, который надо спрятать. Браузер и пользователь могут получить скрипт с сервера следующими путями:
  1. Загрузка скрипта непосредственно размещенного на странице или подгруженного с помощью DOM;
  2. Просмотр скрипта в окне Исходный код страницы;
  3. Сохранение страницы со всеми файлами на жесткий диск;
  4. Ввод прямого URL в адресной строке.

В первом случае браузер обязательно передает http-заголовок HTTP_REFERER.
Во втором и третьем случае он передается не всеми браузерами (Chrome, FireFox выдают ранее загруженный скрипт из кэша; Opera, IE загружают скрипт вновь, но уже без отправки referer).
В четвертом случае referer не передается ни одним из этих четырех браузеров.
Если выдавать JavaScript динамически с проверкой наличия заголовка referer в запросе, то мы сразу же защитимся от Opera и IE, но для Crome и Firefox придется придумать что-то позаковыристее. Мы загрузим сначала один скрипт, который в свою очередь загрузит другой скрипт, при этом обе загрузки будем проверять на наличие http-referer. Методом научного тыка установлено, что если динамически создать скрипт на странице document.createElement(«script»), а потом удалить его со страницы, то скрипт будет работать как обычно, но сохраняться он не будет.

Практика


nojs.php

Эта страничка несет в себе цель загрузить script1.php

<? header('Content-Type:text/html;charset=utf-8'); ?>
<!DOCTYPE html><HEAD><META http-equiv="Content-Type" content="text/html; charset=utf-8" />
<TITLE>Найди JS</TITLE></HEAD>
<BODY><DIV class="root">
Через 10 секунд Вы должны увидеть работу скрываемого скрипта в виде аллерта
<A href="javascript:deadoralive();">нажмите ссылку после алерта, дабы убедиться что события тоже не отвалились.</A>
<A href="script2.php">По этой ссылке можно увидеть скрываемый скрипт</a>
</DIV><DIV id="fictive" style="display:none"></DIV></BODY>
<SCRIPT src="script1.php"></SCRIPT> <!-- В этом месте подключается первый фильтр наличия referer -->
</HTML>

script1.php

Его задача: динамически загрузить script2.php, если есть заголовок referer. Таймауты можно уменьшить, в зависимости от примерного времени выполнения скрываемого скрипта.

<?
header('Content-Type:text/javascript;charset=utf-8');
if (isset($_SERVER['HTTP_REFERER'])) { 
    // создаем скрипт динамически; загружаем код с сервера; добавляем его на страницу; удаляем со страницы; проверяем работоспособность
    echo 'var div1=document.getElementById("fictive"); var sc=document.createElement("script"); sc.src="script2.php"; div1.appendChild(sc); window.setTimeout("div1.removeChild(sc);", 5000); window.setTimeout("deadoralive();", 10000);';
} else {
    echo 'alert("Я фиктивный скрипт 1");';
};
?>

script2.php

Его задача: выдать конечный скрипт, если есть заголовок referer

<?
header('Content-Type:text/javascript;charset=utf-8');
if (isset($_SERVER['HTTP_REFERER'])) {
    // Здесь находится код, который надо спрятать
    echo 'function deadoralive(){alert("Я живой");};';
} else {
    echo 'alert("Я фиктивный скрипт 2");';
};
?>

Итоги


В итоге мы получаем, что мы не можем ни посмотреть в исходном коде страницы, ни скачать, ни сохранить скрываемый скрипт средствами тестируемых четырех браузеров. Вообще же можно посмотреть его двумя способами:
  • Переход по ссылке прямо ведущей на script2.php и расположенной на странице нашего сайта;
  • Формирование http-запроса с указанием в нем заголовка referer.

Повысыть эффективность скрытия можно такими методами:
  1. С помощью mod-rewrite заменять идущие к серверу script1.js и script2.js на script1.php и script2.php соответственно, чтобы на странице были всем привычные файлы js, так как php резко бросается в глаза;
  2. Сделать фиктивный скрипт максимально сложным, правдоподобным и запутанным, чтобы человек пытающийся его разобрать изрядно помучался перед осознанием того, что его обманули;
  3. Обфускация кода.

Здесь можно взять примеры файлов одним архивом.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.