Защита 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) Мог возникнуть логичный вопрос: почему бы не потянуть curl-ом сервером?
Хреново знаете php, не только с помощью curl можно передать cookie? можно и file_get_contents ... как защитить мой скрипт от модификации пользователем никак Цитата:
Ответ отправляйте с вашим ключом и проверяйте его на валидность ip с которого пришел? время и т.д Ведь средствами php тоже можно генерировать js легко js.php <?php header('Content-type: text/javascript; charset: UTF-8'); ?> alert('This js code'); |
Можно попробовать МИНИФИЦИРОВАТЬ СКРИПТ, ПОТОМ ОБФУСЦИРОВАТЬ, ПОТОМ ОПЯТЬ ОБФУСЦИРОВАТЬ НО ДРУГИМ ОБФУСКАТОРОМ,
Звучит страшно, на работает достаточно надежно =) Если это выглядит сложно, просто ОДИН раз обфусцируйте скрипт, и будет Вам щастье :D Что такое обфускация - найдете в интернете, Хотя можно использовать и вариант написаный сверху Цитата:
|
Спасибо всем за ответы. Начну по порядку:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Токен это хорошо, но решает проблему лишь частично. |
Господа, а что скажите по поводу этого?
Защита объекта от изменения в JavaScript Близко ли к истине? |
Цитата:
поскольку это расширение, а не юзерскрипт, в нем может быть запаковано НЕСКОЛЬКО скриптов Главная идея в том, чтобы один скрипт проверяет md5-хеш другого скрипт, и если он не совпадает - делать какое-то оповещение на сервер http://javascript.ru/php/md5 - функция md5() на JS http://javascript.ru/php/md5_file - функция высчитывания md5() для файлов на JS PS: хотя файл который проверяет можно тоже поменять... явно не вариант... |
Цитата:
Всё же пришёл к выводу, что отлавливать модификацию скрипта нереально. Подмена с другого IP - реально, токенами. Но если хацкер под шкурой пользователя расширения, то получается огромная дырища. |
Ничто не мешает "злому хакеру" вскрыть ваше расширение или сам браузер и слать запросы на сервер вручную. Защита от пользователя на стороне пользователя принципиально невозможна, единственный "вариант" - это когда затраты на реверс-инжиниринг больше возможной прибыли.
|
Цитата:
Почему? Скрипт в любом случае исполняется на клиенте, будь-то обычный скрипт, юзерскрипт или расширение -- по-этому НИКТО не мешает модифицировать скрипт... (про Node.JS я не говорил - он исполняется на сервере :p ) Даже если его минифицировать и обфусцировать - его можно относительно легко привести в нормальный вид, а потом делать что хочешь... Цитата:
var point = { x: 17, y: -5 }; Object.freeze(point); point.x = 25; alert(point.x); это не вариант - опять же, ничего не мешает удалить строку Object.freeze(test); |
Цитата:
Цитата:
|
Цитата:
Или написал свой скрипт, тот нарисовал форму в своем воображении и отгрузил по указанному урлу. Ничего не надо модифицировать вообще. Хоть заобфусцируйтесь. Шифрование? Вот и займитесь PGP. Только сразу с ФСБ договоритесь. Ихний сорм не любит когда валятся нипанятные данные. |
Как юзероскриптописатель я навидался всяких методов защиты скриптов - ничего из этого не работает. Все можно скачать и заполучить хоть через alert'ы. Это если нуна получить какие-то сведения, подделать их и отгрузить. Все получается если покопаться. Было бы зачем.
Так вот, походу сделали какую-то уродску партнерку. Сделайте как люди делают - как социал разрешает аутентификацию по своим счетам. Вы запрашиваете, вам выдают форму, юзер вводит, отгружает, _тот_ сервер проверяет и дает отмашку - проканало или не проканало. Я в этом деле не разбирался, но думаю достаточно что ваш партнер разрешит вашему домену кроссдоменный запрос. |
Цитата:
|
Всем спасибо за ответы. Будем думать как переделать всю систему. Всё-таки javascript имеет недостатки связанные с защитой от модификации (никаких методов не заложено для определения сего, а может оно и не надо?).
Плюсов само собой тоже не мало - на радость серверам можно перекладывать работу на комп пользователя в некоторых случаях :) |
Такое понимание не редкость, в реальности все в точности наоборот. Ява-скрипт всегда выполняется локально и хтмл для программиста - единственный средство построить интерфейс. Возможность скрипта общаться с каким-то там сервером - особая и специальная и разрешается только в случае когда браузер точно знает что скрипт загружен с такого-то домена. Во всех остальных случаях, и, кстати, при локальной работе с канвасом, такие транзакции запрещены, Это абсолютно логично, если понимать что сервер - просто _другой_ компьютер, с которым не налажены отношения. Допустим если вы запустите виндовый скрипт (WScript) в локальной сети он будет пользоваться всеми теми разрешениями и политикой, которая сконфигурирована для локальной сети. А в отношении сервера из глобальной сети нет никакой другой политики кроме запрещено все что сервер не разрешил.
То есть скрипт в браузере никто и звать его никак. При чем тут средства защиты от каких-то там модификаций, если любой такой скрипт уже существует для модификации хтмля? Словом это не порок, а сущность скриптов в браузере как в программе. В любой другой которая предоставляет API для скриптов - бейсика, ява- или там епл-скрипта - эквипенисуально. |
aerohotter,
Разделите задачу: 1. В принципе, отправка скрытой роst-формы, сгенерённой скриптом даст Вам кук клиента. 2. Имея кук, - сервером читаем страницу |
Часовой пояс GMT +3, время: 02:27. |