Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Защита javascript от модификации извне (https://javascript.ru/forum/misc/55991-zashhita-javascript-ot-modifikacii-izvne.html)

aerohotter 24.05.2015 22:27

Защита javascript от модификации извне
 
Здравствуйте товарищи разработчики! По долгу службы начальник распорядился заняться доскональным изучением javascript, хотя до этого я работал чисто на написании модулей на php. Когда уже знаешь один язык на второй идти куда проще с вилами. В итоге моего изучения мне было поручено написать расширение для Chrome.
Суть расширения в следующем:
К странице www.mydomain.com/test_page подключается js скрипт, который в переменную собирает тело документа (между тегами <body></body>).
var test = document.body.innerHTML;

Далее AJAX-ом делаем отправку содержимого переменной test на сервер. Посланные на сервер данные обрабатываются и в зависимости от содержания некоторых элементов страницы выдаём AJAX-ом response в расширение пользователю и оповещаем его по конкретной ситуации.
Особенности:
1) Сайт с которого будем тянуть "тело" не наш, поэтому и такие костыли с выдиранием контента страницы. Т.е. мы посредники. Пользователь ставящий расширение даёт нам разрешение на граббинг тела страницы.
2) Мог возникнуть логичный вопрос: почему бы не потянуть curl-ом сервером? Но тут логичный ответ - кука защищённая для хоста, т.е. через document.cookie мы не вытянем её. Да и не хорошо воровать куки, всё же личный кабинет.
Итого по пунктам 1, 2 всё сводится к граббингу тела документа с разрешения пользователя (= установка расширения).
Теперь вопрос, который стоял в названии темы. Я долго вчитывал разные мануалы по js, в т.ч. и ваш на сайте learn.javascript.ru, но не нашёл ответа как защитить мой скрипт от модификации пользователем. Если к примеру он хочет подать левые данные серверу вместо истинных. Ведь, учитывая, что скрипт отрабатывает на стороне пользователя есть возможность вклинить вместо
var test = document.body.innerHTML;

какой-нибудь
var test = "<div>fake</div>"

И уйдёт вместо боди AJAX-ом на сервер этот фейк, а я даже не узнаю был ли модифицирован исходный скрипт, чтобы отвергнуть эти данные и выдать пользователю ошибку через расширение. Вот и итоговый вопрос: есть ли механизм защиты javascript от модификации извне? Или не защиты, а хотя бы оповещения о том, что совершена модификация исходного скрипта? Буду благодарен за дельные ответы. Надеюсь это не такая нерешаемая задача как "защита javascript от копирования".
Никогда не любил обработку на стороне пользователя, но по другому никак(((

Vlasenko Fedor 24.05.2015 23:45

2) Мог возникнуть логичный вопрос: почему бы не потянуть curl-ом сервером?
Хреново знаете php, не только с помощью curl можно передать cookie? можно и file_get_contents ...
как защитить мой скрипт от модификации пользователем никак
Цитата:

подать левые данные серверу вместо истинных
создайте систему токенов, скрипт грузится ведь с вашего сервака вот на основании ip даты по только известному вам механизму генерьте токен ключ в js
Ответ отправляйте с вашим ключом и проверяйте его на валидность ip с которого пришел? время и т.д
Ведь средствами php тоже можно генерировать js легко js.php
<?php
header('Content-type: text/javascript; charset: UTF-8');
?>
alert('This js code');

KosBeg 25.05.2015 08:40

Можно попробовать МИНИФИЦИРОВАТЬ СКРИПТ, ПОТОМ ОБФУСЦИРОВАТЬ, ПОТОМ ОПЯТЬ ОБФУСЦИРОВАТЬ НО ДРУГИМ ОБФУСКАТОРОМ,
Звучит страшно, на работает достаточно надежно =)
Если это выглядит сложно, просто ОДИН раз обфусцируйте скрипт, и будет Вам щастье :D
Что такое обфускация - найдете в интернете,
Хотя можно использовать и вариант написаный сверху
Цитата:

Сообщение от Poznakomlus
Ведь средствами php тоже можно генерировать js легко js.php


aerohotter 25.05.2015 10:53

Спасибо всем за ответы. Начну по порядку:

Цитата:

Сообщение от Poznakomlus
Хреново знаете php, не только с помощью curl можно передать cookie? можно и file_get_contents ...

Знак "?" - тут подразумевалась запятая или это вопрос ко мне? Если это утверждение, то я не понимаю какая связь между моими знаниями по php и то что я в контексте своей проблемы указал про curl? file_get_contents мне известен само собой, но я им не пользуюсь для парсинга веба, только клиентской библиотекой работы с URL =>cURL. У file_get_contents для веба есть свои недостатки, из-за которых я даже в его сторону и не смотрю. Так что к чему эта фраза я не знаю. Замените в моём посте curl на file_get_contents - смысл не изменится...

Цитата:

Сообщение от Poznakomlus
как защитить мой скрипт от модификации пользователем никак

В принципе ожидаемо. На стороне пользователя защищаться бесполезно во всех аспектах это я уже понял.

Цитата:

Сообщение от Poznakomlus
создайте систему токенов

Это явно перекликается с этой статьей: атака CSRF. Но это решит проблему, когда пытаются подсунуть неверные данные с другого IP, т.е. злоумышленник не пользователь нашего расширения. А как быть если наш пользователь? На информ. защите нас учили угрозы по максимуму идентифицировать и ликвидировать. Так что не стоит отбрасывать тот момент, что хацкер может быть со стороны клиента и токен у него будет.

Цитата:

Сообщение от Poznakomlus
Ведь средствами php тоже можно генерировать js легко js.php

Мы не генерируем средствами php javascript. С помощью расширения в head подключается js и происходит то, что я описал в стартовом сообщении.

Цитата:

Сообщение от KosBeg
Звучит страшно, на работает достаточно надежно =)

Обфускация в js решается за 15 минут не криворуким взломщиком. Неплохо, но увы не то. Всё же обфускацию в основе применяют для уменьшения читабельности и как метод борьбы с копированием скрипта, а мне хватило бы оповещения об его модификации.

Токен это хорошо, но решает проблему лишь частично.

aerohotter 25.05.2015 13:08

Господа, а что скажите по поводу этого?
Защита объекта от изменения в JavaScript
Близко ли к истине?

KosBeg 25.05.2015 15:20

Цитата:

Сообщение от aerohotter
написать расширение для Chrome

мне пришла безумная идея!
поскольку это расширение, а не юзерскрипт, в нем может быть запаковано НЕСКОЛЬКО скриптов
Главная идея в том, чтобы один скрипт проверяет md5-хеш другого скрипт, и если он не совпадает - делать какое-то оповещение на сервер
http://javascript.ru/php/md5 - функция md5() на JS
http://javascript.ru/php/md5_file - функция высчитывания md5() для файлов на JS

PS: хотя файл который проверяет можно тоже поменять...
явно не вариант...

aerohotter 26.05.2015 01:36

Цитата:

Сообщение от KosBeg (Сообщение 372258)
Главная идея в том, чтобы один скрипт проверяет md5-хеш другого скрипт, и если он не совпадает - делать какое-то оповещение на сервер

Не годно по причине того, что таким образом мы можем проверить только контрольную сумму отправляемого с сервера скрипта. У нас же стоит цель проверить на изменение со стороны пользователя.
Всё же пришёл к выводу, что отлавливать модификацию скрипта нереально. Подмена с другого IP - реально, токенами. Но если хацкер под шкурой пользователя расширения, то получается огромная дырища.

Aetae 26.05.2015 02:19

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

KosBeg 26.05.2015 08:41

Цитата:

Сообщение от aerohotter
что отлавливать модификацию скрипта нереально

я порыскав в инете тоже пришел к такому выводу.
Почему?
Скрипт в любом случае исполняется на клиенте, будь-то обычный скрипт, юзерскрипт или расширение -- по-этому НИКТО не мешает модифицировать скрипт... (про Node.JS я не говорил - он исполняется на сервере :p )
Даже если его минифицировать и обфусцировать - его можно относительно легко привести в нормальный вид, а потом делать что хочешь...
Цитата:

Сообщение от aerohotter
Господа, а что скажите по поводу этого?
Защита объекта от изменения в JavaScript

var point = { x: 17, y: -5 };
Object.freeze(point);

point.x = 25;
alert(point.x);

это не вариант - опять же, ничего не мешает удалить строку Object.freeze(test);

aerohotter 26.05.2015 12:14

Цитата:

Сообщение от Aetae (Сообщение 372332)
Ничто не мешает "злому хакеру" вскрыть ваше расширение или сам браузер и слать запросы на сервер вручную. Защита от пользователя на стороне пользователя принципиально невозможна, единственный "вариант" - это когда затраты на реверс-инжиниринг больше возможной прибыли.

Да суть расширений для браузеров в том и есть, что js код получить очень просто - можно дебаггером (по F8) остановить и по одной операции отследить что грузится и куда отправляется. Я, понимая, что это бессмысленно уже бы ставил вопрос о не защите, а хотя бы определения модификации скрипта. Увы, это тоже не решаемая задача, не было придумано в js защищённого от изменения метода для определения сути данного вопроса. Думаю это была бы полезная функция для многих. В основе такой метод нужен для AJAX. Какой скрипт выполнится - оригинальный или что там перепишет хацкер-шалун для себя - не важно. Ключевое, что за пургу попытается AJAX-ом отправить на сервер. Вот тут и помог бы метод определяющий что за скрипт посылает запрос на сервер - оригинальный до единой строчки или рукописный.

Цитата:

Сообщение от KosBeg (Сообщение 372351)
это не вариант - опять же, ничего не мешает удалить строку Object.freeze(test);

Я уже потестил, разобрался. Это защита объекта в рамках создания неизменяемых или узко изменяемых объектов, т.е. примитивная защита для себя в рамках одного скрипта (создание объектов констант?).


Часовой пояс GMT +3, время: 01:55.