Как написать безопасный код на JS

  • Автор темы Gidroponika
  • Дата начала
G

Gidroponika

Почему сложно писать безопасный код на JS
Итак, вот 5 причин, почему сложно писать безопасный код на JS

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

Динамическая суть JavaScript
JavaScript динамический, слаботипизированный и асинхронный. А это все признаки того, что попасть в беду легче легкого.

1. Языковые средства вроде eval и включения стороннего кода через script src позволяют исполнять строки прямо в рантайме. Как следствие — сложно дать «статические гарантии» того, что код будет вести себя определенным образом. Динамический анализ это тоже затрудняет (см.

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

).

JavaScript-Security.png

Использование eval
2. Слабая типизация приводит к тому, что применять устоявшиеся методы статического анализа непросто — по крайней мере в сравнении со статически типизированными языками (например, Java).

3. Асинхронные колбэки, вызовы которых JavaScript допускает через механизмы вроде setTimeout и XMLHttpRequest (тот самый знаменитый AJAX), по статистике прячут в себе больше всего коварных ошибок.

Замысловатые возможности JS
Чего только не притащили в JavaScript с годами! В частности, в нем есть

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

,

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

и

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

. Они делают язык еще динамичнее, а написание безопасного кода — сложнее.

1. Прототипы. Смысл их в том, что программы пишутся в духе объектно ориентированного подхода, но без использования классов. При таком подходе объекты наследуют необходимые им свойства напрямую от других объектов (прототипов). При этом в JS прототипы могут быть переопределены прямо в рантайме. И если это переопределение случилось, то эффект сразу же распространяется на все объекты, которые наследуют свойства переопределяемого прототипа.

JavaScript-Security-2.png

Как обрабатываются прототипы
Справедливости ради надо сказать, что в новых спецификациях ECMAScript классы тоже присутствуют.

2. Функции первого класса. У JS очень гибкая модель объектов и функций. Свойства объектов и их значения могут быть созданы, изменены или удалены прямо в рантайме, и ко всем есть доступ через функции первого класса.

3. Замыкания. Если объявить функцию внутри другой функции, то первая получает доступ к переменным и аргументам последней. Причем эти переменные продолжают существовать и остаются доступными внутренней функции — даже после того, как внешняя функция, в которой эти переменные определены, завершилась.

Из-за такой гибкости и динамичности JavaScript (см. пункты 1 и 3) определение набора всех доступных свойств объекта при статическом анализе — неразрешимая задача. Однако веб-разработчики повсеместно используют динамические особенности языка, а соответственно, пренебрегать ими при анализе кода нельзя. Иначе какая тут гарантия безопасности?

Тесное взаимодействие между JavaScript и DOM
Это нужно, чтобы обеспечить «бесшовное» обновление веб-страницы, прямо в рантайме. DOM, как известно, представляет собой стандартную объектную модель, нейтральную по отношению к платформам и языкам, которая предназначена для отрисовки документов HTML и XML. У DOM есть собственный API для работы с отображаемым документом: для динамического доступа, перемещения и обновления отображаемого документа (его содержимого, структуры и стиля). Изменения в DOM могут вноситься динамически, через JavaScript. И эти изменения сразу же отображаются в браузере.

Благодаря DOM загруженные в браузер веб-страницы можно обновлять поэтапно по ходу подгрузки данных с сервера. Однако у такого удобства есть и оборотная сторона: фрагменты кода, которые отвечают за динамическое взаимодействие между JS и DOM, особенно подвержены ошибкам.

JavaScript-Code-Security.png

Наиболее распространенные ошибки в веб-приложенияхСложные событийные взаимодействия
JavaScript — это язык, управляемый событиями (event-driven). Он позволяет разработчикам регистрировать на узлах DOM так называемых «слушателей событий» — event listeners. И хотя большинство событий вызываются действиями пользователя, существуют и такие, которые могут быть инициированы и без этого, — например, события по времени и асинхронные вызовы. При этом каждое событие может отдаваться эхом по всему дереву DOM и активировать сразу несколько «слушателей». Иногда отследить все это — довольно нетривиальная задача.

JavaScript-Code-Security-2.png

Как обрабатываются события
По этим причинам код на JS может быть труден для понимания, анализа и тестирования. Облегчат жизнь веб-разработчику и помогут писать безопасный код специальные утилиты.

Утилиты для тестирования кода на JS
Существуют утилиты для парсинга (например,

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

,

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

), оптимизации (например,

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

) и статического анализа кода на наличие распространенных синтаксических ошибок (например,

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

).

Кроме того, есть несколько проверенных фреймворков, которые помогают веб-разработчикам покрывать JS-код тестами. Среди них:

Кроме того, существуют тестирующие фреймворки, которые эмулируют поведение браузера и позволяют автоматически прогонять тестовые примеры. Они особенно актуальны при отладке участков кода, которые отвечают за взаимодействие между JS и DOM, и предоставляют удобную инфраструктуру для манипулирования DOM.

К примеру,

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

,

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

и

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

предоставляют API, через который можно запускать экземпляры браузера и работать с ними. Через API ты можешь активировать события и получать доступ к элементам DOM прямо в рантайме — то есть тестировать код в условиях, максимально приближенных к реальным. Конечно, немалую часть работы придется проделывать вручную, но даже это уже неплохая помощь в тестировании.

Утилиты для статического анализа
Ранее утилиты для выявления проблемных участков кода представляли собой статические анализаторы. То есть, учитывая все динамические причуды JS, могли предоставить только ограниченную помощь. Однако и они бывают полезными в анализе. Вот несколько основных примеров.


Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

— статический анализатор, который исследует зависимости между функциями JS, стилями CSS, тегами HTML и изображениями. Смысл этой утилиты — находить при статическом анализе неиспользуемые ресурсы. Однако с динамикой WARI, конечно, не справится.


Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

— утилита для анализа статического кода, которая сама написана на JavaScript. Она проверяет код на соответствие хорошим практикам.


Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

— JS-оптимизатор, который автоматически переписывает код с целью сделать его быстрее и компактнее. Заодно в трубу вылетают все комментарии и любые неиспользуемые участки кода.

WebScent (см.

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

) — продвинутый статический анализатор. В работе он исходит из того, что клиентский JS-код (тот, который загружается в браузер) не хранится на стороне сервера в целом виде, а рассеян по серверному коду кусками. «Душок» в этих кусках не может быть легко обнаружен до тех пор, пока из них не будет сгенерирован цельный клиентский код. WebScent анализирует клиентский код с тем, чтобы найти проблемные места в серверном коде. При этом работа статического анализатора WebScent в основном сводится к распутыванию замесов HTML, CSS и JS — с целью обнаружить дублирующийся код и ошибки в синтаксисе HTML.

РЕКОМЕНДУЕМ:​

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

Утилиты для динамического анализа

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

— утилита, в которой объединены статический и динамический анализ. Она анализирует код на наличие тринадцати антипаттернов. Семь из них (в том числе lazy object и long function) — общие для всех языков программирования, а шесть остальных (closure smells, excessive global variables, nested callbacks и другие) специфичны для JavaScript.


Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

— автоматизированная утилита, которая помогает веб-разработчику понимать код при просмотре: объясняет причину присутствия структур DOM, выполняет динамический анализ, а также предоставляет умный автокомплит для кода, который взаимодействует с DOM.


Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

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

Выводы
Итак, отследить происходящее при выполнении скриптов на JS бывает непросто, но, вооружившись подходящими инструментами, найти и переписать проблемные места можно даже в самом запутанном коде. Впрочем, JavaScript не стоит на месте: в нем появляются новые и новые возможности, теперь он часто используется для написания приложений (как мобильных, так и десктопных), а также все чаще встречается на серверах (и не только) благодаря Node.js. А это значит, что и искусство ловли багов нужно выводить на новый уровень.
 
Название темы
Автор Заголовок Раздел Ответы Дата
АнАлЬнАя ЧуПаКаБрА [Гайд] - Как написать человеку в Вк если вы у него в ЧС. Другое 0
S Как написать сообщение вк если ты в чс СИ/Фишинг/Мошенничество 41
R Как написать простейший компилятор Другие ЯП 0
АнАлЬнАя ЧуПаКаБрА Гайд как написать простенький проэкт в Private Keeper Полезные статьи 5
Admin Как написать вирус для Андроид. Часть 5 Вирусология 0
Admin Как написать вирус для Андроид. Часть 4 Вирусология 0
Admin Как написать вирус для Андроид. Часть 3 Вирусология 0
Admin Как написать вирус для андроид. Часть 2 Вирусология 1
Admin Как написать вирус для андроид Вирусология 0
Support81 Важно!!! Мобильный аудит Wi-Fi сетей: как быстро найти уязвимости с помощью Stryker WiFi/Wardriving/Bluejacking 0
wrangler65 Интересно Как МВД России ищет киберпреступников и как оставаться анонимным в 2025 Анонимность и приватность 0
Support81 JPEG, пицца и разоблачения: как Error Level Analysis считывает ложь по пикселям Новости в сети 0
Support81 Ваш VPN — это троян. Он выглядит как защита, но работает как слежка Новости в сети 0
Support81 От идеологии к наживе: как хактивисты превращаются в киберпреступников Полезные статьи 0
Support81 Дарквеб 2024: эксплойты по цене машины, логи — как хлеб в магазине Новости в сети 0
Support81 Важно!!! Как Tor стал символом свободы, паранойи и мифов одновременно Анонимность и приватность 0
Support81 Письмо от «шефа», фальшивая переписка и счёт на услуги — как российские компании теряют деньги, не заметив подмены Новости в сети 0
Support81 За деньги — да: как преступники «купили» службу поддержки Coinbase Новости в сети 0
Support81 Открыл PSD — получил троян. Как хакеры «кошмарят» графических дизайнеров Новости в сети 0
Support81 Услуги 18+, отмывание и прописка в США — как один Telegram-рынок объединил КНДР и китайскую мафию Новости в сети 0
Support81 Seed → POST-запрос → пустой баланс: как устроена быстрая и чистая кража крипты через FreeDrain Новости в сети 0
Support81 Одна атака — минус миллиард: как Marks & Spencer потерял состояние за пару дней Новости в сети 0
Support81 Из пепла: как 4chan смог перезапустить себя после разрушительного взлома Новости в сети 0
Support81 CouchDB как проходной двор: эксплойты для критической SSH-уязвимости уже гуляют по сети Новости в сети 0
Support81 Фишинг с печатью Google — как злоумышленники смогли обмануть DKIM Новости в сети 0
Support81 Исповедь хакера: как случайный эксперимент оставил без связи тысячи людей в Бразилии Новости в сети 0
Support81 Фейковые айтишники, настоящие миллиарды и немного ядерной программы: как прокачанные фишеры замиксовали $1,5 млрд Новости в сети 0
Support81 Microsoft дала ИИ настоящий инструмент программиста — и он впервые узнал, как сложно быть человеком Новости в сети 0
Support81 25 000 за воздух: как «таможенники» из Telegram разводят на доверии Новости в сети 0
Support81 $21 млн в крипте: как офицеры КСИР прикрылись «борьбой с мошенничеством» Новости в сети 0
Support81 Шифрование не спасет: как хакеры читают "защищенные" сообщения без взлома Новости в сети 0
Support81 Невидимая империя зла: как ИИ, дети и крипта строят цифровую империю Новости в сети 1
Support81 DNS без штанов: как нас сдают провайдерам по умолчанию Новости в сети 0
Support81 Комната 641А: как инженер AT&T раскрыл систему массовой слежки Новости в сети 0
Support81 "Чудо-решение" или маркетинг: как Google создает иллюзию объективности для продвижения технологий Новости в сети 0
Support81 Фрод в рекламе: как мошенники крадут бюджеты и что с этим делать Новости в сети 0
Support81 Невидимый взломщик: как обычные разговоры позволяют взломать GPT-4o Новости в сети 0
Support81 5 лет до точки невозврата: как квантовые компьютеры обрушат мировые банки Новости в сети 0
Support81 Вирус в заявке: как Zhong Stealer «ломает» компании через службу поддержки Новости в сети 0
Support81 Обмани себя сам: как ИИ-трейдеры ведут подписчиков к финансовому краху Новости в сети 0
Support81 Взлом, майнинг, выкуп: 5 хакеров придумали, как выжать из IT-гигантов все соки Новости в сети 0
Support81 CAPTCHA + PDF: как мошенники превратили Webflow в орудие фишинга Новости в сети 0
Support81 $16 млн и 1000 жертв: как хакеры Phobos попались в ловушку спецслужб Новости в сети 0
Support81 Мечта хакеров: как CVE-2024-52875 стала идеальным инструментом для кибератак Новости в сети 0
Support81 StarkRDP теперь LakeVPS: как злоумышленники возрождают подпольные рынки за считанные дни Новости в сети 0
Support81 Дешевле – не значит лучше: как уязвимости DeepSeek уничтожают защиту бизнеса Новости в сети 1
Support81 Важно!!! MMS возвращается: как устаревший протокол стал оружием криптомошенников Новости в сети 0
Support81 Chrome, Firefox и Edge: как Flesh Stealer стал ночным кошмаром для браузеров Новости в сети 0
Support81 Майнеры в облаке: как хакеры годами добывают криптовалюту за чужой счёт Новости в сети 0
У Статья Как скрыть цифровой след в интернете: практическое руководство. Полезные статьи 0

Название темы