Как скрыть код javascript на веб-странице?

100

Можно ли скрыть код Javascript из html веб-страницы, когда исходный код просматривается через функцию просмотра исходного кода в браузерах?

Я знаю, что код можно скрыть, но я бы предпочел, чтобы он был скрыт от функции исходного кода.

Арун Наир
источник
1
он на стороне клиента, и поэтому он будет находиться на всех клиентах (браузерах)
naveen
8
Зачем вам скрывать Javascript? Не похоже, чтобы вы когда-либо помещали какие-либо конфиденциальные данные, которые вы не хотите, чтобы пользователь нашел в них ... Верно ?!
Пол
1
Как браузер узнает, какой Javascript запускать?
Wylie
1
У @PaulPRO есть хороший аргумент - зачем вам скрывать JavaScript? Любой, кто хочет знать, что вы делаете, ВСЕГДА сможет получить ваш скрипт несколькими нажатиями клавиш. Они не будут полагаться только на View-Source. Тот, кто не знает, как получить сценарий, скорее всего, не заинтересуется им.
Стивен Чанг
1
@UdayHiwarale Очень легко увидеть, какие запросы GET и другие HTTP выполняются клиентом (просто откройте консоль разработчика и перейдите на вкладку сети). При разработке веб-сайта вы должны предполагать на сервере, что все запросы подделаны злоумышленником - и поэтому вы должны проверять все данные и тщательно избегать каждой строки, которую вы вставляете в SQL или другой код.
Suzanne Dupéron

Ответы:

137

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

Как уже говорили другие, нет способа защитить javascript, предназначенный для запуска в браузере, от определенного зрителя. Если браузер может его запустить, то любой решительный человек может его просмотреть / запустить.

Но если вы поместите свой javascript во внешний файл javascript, который включен в:

<script type="text/javascript" src="http://mydomain.com/xxxx.js"></script>

теги, то код javascript не будет сразу виден с помощью команды View Source - таким образом будет виден только сам тег script. Это не означает, что кто-то не может просто загрузить этот внешний файл javascript, чтобы увидеть его, но вы спросили, как уберечь его от команды просмотра исходного кода браузера, и это сделает это.

Если вы действительно хотите усложнить просмотр исходного кода, вы должны сделать все следующее:

  1. Поместите его во внешний файл .js.
  2. Обфускируйте файл, чтобы большинство имен собственных переменных были заменены короткими версиями, чтобы все ненужные пробелы были удалены, чтобы его нельзя было прочитать без дальнейшей обработки и т. Д.
  3. Динамически включайте файл .js, программно добавляя теги сценария (как это делает Google Analytics). Это еще больше затруднит доступ к исходному коду с помощью команды «Просмотр исходного кода», так как там будет нелегко щелкнуть ссылку.
  4. Поместите как можно больше интересной логики, которую вы хотите защитить, на сервере, который вы получаете через вызовы ajax, а не выполняете локальную обработку.

С учетом всего сказанного, я думаю, вам следует сосредоточиться на производительности, надежности и улучшении своего приложения. Если вам абсолютно необходимо защитить какой-то алгоритм, поместите его на сервер, но в остальном соревнуйтесь за то, чтобы быть лучшим в своих силах, а не за наличие секретов. В конечном итоге именно так в Интернете работает успех.

jfriend00
источник
2
Хороший способ ответить на вопрос напрямую. Использование JavaScript для генерации<script> будет держать его из View Source лучше (еще видны под живой DOM) - то есть, он не может быть просто «право нажал на» в Source View. Возможно, указанный <script>элемент будет удален после выполнения JavaScript, что сделает его немного более громоздким (но не невозможным), чтобы получить исходный код ... конечно, сетевой трафик будет очень легко отображаться в Firebug или аналогичном ;-)
3
@Quentin - ваш URL-адрес источника просмотра глуп - это не то, о чем здесь спрашивают или предлагают. Код может просмотреть любой человек. Я сказал это так же, как и все остальные. Вопрос только в том, насколько это просто и, согласно заданному конкретному вопросу, насколько это заметно, когда кто-то просматривает исходный код? Мое предложение убирает его на один шаг из View Source - и все, но это действительный дополнительный шаг.
jfriend00
fetch ("СКРИПТ ДЛЯ СКРЫТИЯ URL-адреса или DATAURL"). then (function (t) {return t.text () || false;}). then (c => self [atob ("ZXZhbA")] (c))
Zibri 05
Я думаю, мы можем также добавить oncontextmenu = 'return false;' внутри тега html.
falero80s 08
@ falero80s - это пытается остановить контекстное меню, но не останавливает все остальные способы просмотра источника страницы.
jfriend00 08
38

Нет, это невозможно.

Если вы не передадите его браузеру, значит, в браузере его нет.

Если да, то он (или легко читаемая ссылка на него) составляет часть источника.

Квентин
источник
4
Я не уверен, что этот ответ действительно ответил на заданный вопрос (хотя он получил 10 голосов за 15 минут). Они спросили, как уберечь код от команды просмотра исходного кода браузеров. Это возможно. Смотрите мой ответ ниже. Они не спрашивали, как предотвратить просмотр кода решительным хакером.
jfriend00
8
Это не займет много на пути решимости нажмите на ссылку в представлении источника для HTML - документа , чтобы добраться до View Source для сценария.
Quentin
На мой взгляд, вопрос не был правильно истолкован. Создание файла JS является обычным делом, пользователь хочет (я думаю), как скрыть любое значение переменной JS, когда кто-то выбирает вариант «просмотреть исходный код страницы». +1 с моей стороны.
shaILU
Этот ответ не имеет смысла. здесь лучше дать предложение. Лучше использовать внешний файл.
Лалит Мохан
15

Мое решение основано на последнем комментарии. Это код invisible.html

<script src="http://code.jquery.com/jquery-1.8.2.js"></script>
<script type="text/javascript" src="invisible_debut.js" ></script>
<body>
</body>

Чистый код invisible_debut.js:

$(document).ready(function () {
var ga = document.createElement("script"); //ga is to remember Google Analytics ;-)
ga.type = 'text/javascript';
ga.src = 'invisible.js';
ga.id = 'invisible';
document.body.appendChild(ga);
$('#invisible').remove();});

Обратите внимание, что в конце я удаляю созданный скрипт. invisible.js - это:

$(document).ready(function(){
    alert('try to find in the source the js script which did this alert!');
    document.write('It disappeared, my dear!');});

invisible.js не отображается в консоли, потому что он был удален, а не в исходном коде, потому что он создан javascript.

Что касается invisible_debut.js, я запутал его, а это значит, что очень сложно найти URL-адрес invisible.js. Не идеально, но достаточно сложно для нормального хакера.

Арман Арапян
источник
3
Странно то, что я выполнил именно те шаги, которые могу найти invisible.jsв источниках. Версия Chrome 34.0.1847.131 м
Boyang
2
@Boyang, его просто нет в консоли, но если мы знаем путь, мы все равно можем его найти.
Панадол Чонг
1
Не только это, но он всегда будет отображаться на вкладке «Сеть» большинства инструментов разработки. Опять же, у каждого уважающего себя хакера есть DevTools.
GoldBishop
13

Use Html Encrypter Часть головы, которая имеет

<link rel="stylesheet" href="styles/css.css" type="text/css" media="screen" />
<script type="text/javascript" src="script/js.js" language="javascript"></script>

copy and paste it to HTML Encrypter and the Result will goes like this
and paste it the location where you cut the above sample

<Script Language='Javascript'>
<!-- HTML Encryption provided by iWEBTOOL.com -->
<!--
document.write(unescape('%3C%6C%69%6E%6B%20%72%65%6C%3D%22%73%74%79%6C%65%73%68%65%65%74%22%20%68%72%65%66%3D%22%73%74%79%6C%65%73%2F%63%73%73%2E%63%73%73%22%20%74%79%70%65%3D%22%74%65%78%74%2F%63%73%73%22%20%6D%65%64%69%61%3D%22%73%63%72%65%65%6E%22%20%2F%3E%0A%3C%73%63%72%69%70%74%20%74%79%70%65%3D%22%74%65%78%74%2F%6A%61%76%61%73%63%72%69%70%74%22%20%73%72%63%3D%22%73%63%72%69%70%74%2F%6A%73%2E%6A%73%22%20%6C%61%6E%67%75%61%67%65%3D%22%6A%61%76%61%73%63%72%69%70%74%22%3E%3C%2F%73%63%72%69%70%74%3E%0A'));
//-->

HTML ENCRYPTER Примечание: если у вас есть java-скрипт на вашей странице, попробуйте экспортировать его в файл .js и сделать его как в примере выше.

И также этот шифровальщик не всегда работает в каком-то коде, который может испортить ваш веб-сайт ... Выберите лучшую часть, которую вы хотите скрыть, например, в <form> </form>

Это может быть изменено опытным пользователем, но не все новички, как я, знают это.

Надеюсь, это поможет

ХИНАЮПАКС
источник
3
Указанная вами ссылка не открыта из-за ошибки кода 404.
Акаш Лимбани
Такой же подход используется для внедрения злоумышленниками вредоносного кода на сайт. Некоторые из более совершенных инструментов Security Web Crawler ищут такой код и очищают его от исходного кода страницы.
GoldBishop
8

Я не уверен, что есть способ скрыть эту информацию. Независимо от того, что вы делаете, чтобы запутать или скрыть то, что вы делаете в JavaScript, все равно сводится к тому, что вашему браузеру необходимо загрузить его, чтобы использовать. Современные браузеры имеют готовые инструменты веб-отладки / анализа, которые упрощают извлечение и просмотр сценариев (например, просто нажмите F12в Chrome).

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

Марк Карпентер
источник
Допустим, вы беспокоитесь о том, чтобы раскрыть секрет. Допустим, вы помещаете его в файл PHP и вызываете через Ajax. Затем любой может вызвать этот PHP-файл и узнать секрет. Вероятно, есть способ защитить секреты с помощью PHP, и я изо всех сил пытался его найти. Создайте случайное число и потребуйте, чтобы все ресурсы предоставили его в качестве аргумента для файла PHP. Я думаю, что это работает, но не в том случае, если злоумышленник использует инструменты разработчика.
Дэвид Спектор
8

'Это невозможно!'

Ах да это ....

//------------------------------
function unloadJS(scriptName) {
  var head = document.getElementsByTagName('head').item(0);
  var js = document.getElementById(scriptName);
  js.parentNode.removeChild(js);
}


//----------------------
function unloadAllJS() {
  var jsArray = new Array();
  jsArray = document.getElementsByTagName('script');
  for (i = 0; i < jsArray.length; i++){
    if (jsArray[i].id){
      unloadJS(jsArray[i].id)
    }else{
      jsArray[i].parentNode.removeChild(jsArray[i]);
    }
  }      
}
Addinall
источник
4
Очень хороший ответ. Он действительно скрывает использование javascript, однако, только когда вы используете Element Inspector / Developer Tools, вы все равно можете увидеть, просматриваете ли вы через View Source. (По крайней мере, на хроме)
Патрик Бард
переменная "голова" здесь избыточна или выполняет какую-то важную функцию?
Мастер Джеймс
3
он скрывает это только частично ... любая открытая функция (глобальная) может быть показана инструментами разработчика, и она будет отображаться как анонимная функция, но инструменты разработки
сообщают
это только скрывает его от источника ... любая другая функция будет делать то же самое: fetch ("SCRIPT TO HIDE"). then (function (t) {return t.text () || false;}). then (c = > self [atob ("ZXZhbA")] (c))
Зибри
5

Думаю, я нашел решение, позволяющее скрыть определенные коды JavaScript в исходном коде браузера. Но для этого вам нужно использовать jQuery.

Например:

В вашем index.php

<head>
<script language = 'javascript' src = 'jquery.js'></script>
<script language = 'javascript' src = 'js.js'></script>
</head>

<body>
<a href = "javascript:void(null)" onclick = "loaddiv()">Click me.</a>

<div id = "content">
</div>

</body>

Вы загружаете файл в тело html / php, вызываемый функцией jquery в файле js.js.

js.js

function loaddiv()
{$('#content').load('content.php');}

Вот уловка.

В вашем файле content.php поместите другой тег заголовка, а затем вызовите оттуда другой файл js.

content.php

<head>
<script language = 'javascript' src = 'js2.js'></script>
</head>

<a href = "javascript:void(null)" onclick = "loaddiv2()">Click me too.</a>

<div id = "content2">
</div>

в файле js2.js создайте любую желаемую функцию.

пример:

js2.js

function loaddiv2()
{$('#content2').load('content2.php');}

content2.php

<?php
echo "Test 2";
?>

Пожалуйста, перейдите по ссылке, затем скопируйте и вставьте ее в имя файла jquery.js

http://dl.dropbox.com/u/36557803/jquery.js

Надеюсь, это поможет.

Джепп
источник
1
Это обеспечит минимальную защиту. Просто перейти на вкладку сети инструментов разработчика браузера и увидеть все загруженные скрипты, в том числе загруженные через Ajax.
JJJ
4

Вы могли бы использовать document.write.

Без jQuery

<!DOCTYPE html>
<html>
<head><meta charset=utf-8></head>
<body onload="document.write('<!doctype html><html><head><meta charset=utf-8></head><body><p>You cannot find this in the page source. (Your page needs to be in this document.write argument.)</p></body></html>');">
</body></html>

Или с jQuery

$(function () {
  document.write("<!doctype html><html><head><meta charset=utf-8></head><body><p>You cannot find this in the page source. (Your page needs to be in this document.write argument.)</p></body></html>")
});
Голубая овца
источник
2

Невозможно!

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

Габриэле Брунори
источник
1

Подход, который я использовал несколько лет назад -

Нам нужен файл jsp, файл java сервлета и файл java фильтра.

Предоставьте пользователю доступ к файлу jsp. URL-адрес типа пользователя для файла jsp.

Случай 1 -

  • Файл Jsp перенаправит пользователя на сервлет.
  • Сервлет выполнит часть основного скрипта, встроенную в файл xxxxx.js, и
  • Используя Printwriter, он отобразит ответ пользователю.

  • Тем временем сервлет создаст ключевой файл.

  • Когда сервлет пытается выполнить файл xxxx.js в нем, фильтр
    активируется и обнаруживает, что файл ключа существует, и, следовательно, удаляет
    файл ключа .

Таким образом, один цикл закончился.

Короче говоря, ключевой файл будет создан сервером и немедленно удален фильтром.

Это будет происходить при каждом ударе.

Случай 2 -

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

Вместо создания файла можно использовать значение настройки в переменной сеанса.

Бхушан Махаджан
источник