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

31 Окт
2011

Хотелось ли Вам когда-нибудь спрятать от посторонних людей на своей страничке скрипт, который реализует нереально красивое появление меню или выполнение других действий, которые Вы бы не хотели видеть в скором времени на каждом втором сайте?
Если да, то способ изложенный в этой статье Вам пригодится совместно с обфускацией кода. При этом оговорюсь сразу, что способ не 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. Обфускация кода.

Здесь можно взять примеры файлов одним архивом.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх