Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.05.2015, 22:27
Новичок на форуме
Отправить личное сообщение для aerohotter Посмотреть профиль Найти все сообщения от aerohotter
 
Регистрация: 20.05.2015
Сообщений: 6

Защита 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 от копирования".
Никогда не любил обработку на стороне пользователя, но по другому никак(((
Ответить с цитированием
  #2 (permalink)  
Старый 24.05.2015, 23:45
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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');
Ответить с цитированием
  #3 (permalink)  
Старый 25.05.2015, 08:40
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

Можно попробовать МИНИФИЦИРОВАТЬ СКРИПТ, ПОТОМ ОБФУСЦИРОВАТЬ, ПОТОМ ОПЯТЬ ОБФУСЦИРОВАТЬ НО ДРУГИМ ОБФУСКАТОРОМ,
Звучит страшно, на работает достаточно надежно =)
Если это выглядит сложно, просто ОДИН раз обфусцируйте скрипт, и будет Вам щастье
Что такое обфускация - найдете в интернете,
Хотя можно использовать и вариант написаный сверху
Сообщение от Poznakomlus
Ведь средствами php тоже можно генерировать js легко js.php
Ответить с цитированием
  #4 (permalink)  
Старый 25.05.2015, 10:53
Новичок на форуме
Отправить личное сообщение для aerohotter Посмотреть профиль Найти все сообщения от aerohotter
 
Регистрация: 20.05.2015
Сообщений: 6

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

Сообщение от 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 минут не криворуким взломщиком. Неплохо, но увы не то. Всё же обфускацию в основе применяют для уменьшения читабельности и как метод борьбы с копированием скрипта, а мне хватило бы оповещения об его модификации.

Токен это хорошо, но решает проблему лишь частично.
Ответить с цитированием
  #5 (permalink)  
Старый 25.05.2015, 13:08
Новичок на форуме
Отправить личное сообщение для aerohotter Посмотреть профиль Найти все сообщения от aerohotter
 
Регистрация: 20.05.2015
Сообщений: 6

Господа, а что скажите по поводу этого?
Защита объекта от изменения в JavaScript
Близко ли к истине?
Ответить с цитированием
  #6 (permalink)  
Старый 25.05.2015, 15:20
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

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

PS: хотя файл который проверяет можно тоже поменять...
явно не вариант...
Ответить с цитированием
  #7 (permalink)  
Старый 26.05.2015, 01:36
Новичок на форуме
Отправить личное сообщение для aerohotter Посмотреть профиль Найти все сообщения от aerohotter
 
Регистрация: 20.05.2015
Сообщений: 6

Сообщение от KosBeg Посмотреть сообщение
Главная идея в том, чтобы один скрипт проверяет md5-хеш другого скрипт, и если он не совпадает - делать какое-то оповещение на сервер
Не годно по причине того, что таким образом мы можем проверить только контрольную сумму отправляемого с сервера скрипта. У нас же стоит цель проверить на изменение со стороны пользователя.
Всё же пришёл к выводу, что отлавливать модификацию скрипта нереально. Подмена с другого IP - реально, токенами. Но если хацкер под шкурой пользователя расширения, то получается огромная дырища.
Ответить с цитированием
  #8 (permalink)  
Старый 26.05.2015, 02:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Ничто не мешает "злому хакеру" вскрыть ваше расширение или сам браузер и слать запросы на сервер вручную. Защита от пользователя на стороне пользователя принципиально невозможна, единственный "вариант" - это когда затраты на реверс-инжиниринг больше возможной прибыли.
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 26.05.2015, 08:41
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

Сообщение от aerohotter
что отлавливать модификацию скрипта нереально
я порыскав в инете тоже пришел к такому выводу.
Почему?
Скрипт в любом случае исполняется на клиенте, будь-то обычный скрипт, юзерскрипт или расширение -- по-этому НИКТО не мешает модифицировать скрипт... (про Node.JS я не говорил - он исполняется на сервере )
Даже если его минифицировать и обфусцировать - его можно относительно легко привести в нормальный вид, а потом делать что хочешь...
Сообщение от aerohotter
Господа, а что скажите по поводу этого?
Защита объекта от изменения в JavaScript
var point = { x: 17, y: -5 };
Object.freeze(point);

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

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

Последний раз редактировалось KosBeg, 26.05.2015 в 08:43.
Ответить с цитированием
  #10 (permalink)  
Старый 26.05.2015, 12:14
Новичок на форуме
Отправить личное сообщение для aerohotter Посмотреть профиль Найти все сообщения от aerohotter
 
Регистрация: 20.05.2015
Сообщений: 6

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

Сообщение от KosBeg Посмотреть сообщение
это не вариант - опять же, ничего не мешает удалить строку Object.freeze(test);
Я уже потестил, разобрался. Это защита объекта в рамках создания неизменяемых или узко изменяемых объектов, т.е. примитивная защита для себя в рамках одного скрипта (создание объектов констант?).
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34