Техники безопасного программирования на JavaScript

JavaScript является одним из наиболее широко используемых языков программирования для разработки веб-приложений, а также становится все более распространенным в мобильных приложениях. По данным Stack Overflow, почти 70% людей-разработчиков программируют на JavaScript. Поэтому в этой статье мы рассмотрим некоторые методы безопасного кодирования для JavaScript, подчеркивая роль разработчиков как ключевых игроков в предотвращении уязвимостей и потенциальных угроз для их программного обеспечения.

Его популярность делает его одной из главных целей для киберпреступников. По данным организации Secure Coding, JavaScript занимает четвертое место в списке наиболее уязвимых языков программирования, уступая только языкам Java, PHP и C. Зная это, очень важно, чтобы разработчики, использующие этот язык в своей повседневной работе, были активны в принятии мер безопасности и защиты кода своих приложений.

Как работает JavaScript
JavaScript — это язык управления памятью. То есть при создании функций, переменных, строк и т.д. движок выделяет определенный объем памяти и самостоятельно освобождает его, когда он больше не нужен. JavaScript делает этот процесс автоматически за вас!

Таким образом, когда резерв освобождается, память может быть использована для других целей. Для этого существует сборщик мусора, который в фоновом режиме восстанавливает выделенную память. Таким образом, этот мусоросборщик удаляет некоторые объекты, когда они становятся недоступными.

Такой жизненный цикл памяти в JavaScript предотвращает возникновение классических проблем переполнения буфера, переполнения данных, как в языках C и C++. Однако существует множество способов, с помощью которых код, написанный на этом языке, может быть уязвим для таких распространенных атак, как SQL Injection и Cross-Site Scripting.

Избегайте атак межсайтового скриптинга (XSS)
Межсайтовый скриптинг (XSS) возникает, когда злоумышленник внедряет вредоносный код в клиентскую часть веб-приложения, обычно в виде сценария в браузере. Дефекты позволяют браузеру принимать эти недоверенные данные без надлежащей проверки, что позволяет злоумышленнику получить доступ к любым файлам cookie, маркерам сеанса или другой конфиденциальной информации, сохраненной браузером и используемой на этом сайте.

Чтобы избежать этого типа угроз, мы рекомендуем использовать следующие методы:

Всегда проверяйте и очищайте вводимые пользователем данные.
Убедитесь, что он содержит только допустимые символы, которые не могут быть использованы для атак типа XSS.

Используйте безопасные методы, такие как innerText вместо innerHTML
Для манипулирования объектной моделью документа (DOM) используйте безопасные методы, такие как innerText вместо innerHTML, что позволит избежать XSS на основе DOM. innerHTML обычно используется для вставки тегов, текста и изображений в веб-страницу, создавая риск безопасности, по этой причине innerHTML не используется для вставки чистого текста.

Понимание на практике на следующем примере, создав свойство:

Пример с использованием innerHTML:

Результат с помощью innerHTML:

Пример использования innerText:

Результат с использованием innerText:

Короче говоря, innerText извлекает и определяет содержимое тега как обычный текст, а innerHTML извлекает и определяет содержимое в формате HTML.

Используйте структуры и функции, которые помогают предотвратить XSS-атаки
Node.Js, пакетная сборка движка V8 JavaScript от Google, имеет глобальные функции encodeURI и encodeURIComponent, которые могут помочь вам в этом. Также важно рассмотреть возможность использования таких пакетов, как XSS-Filters.

Безопасно применять эти фильтры следующим образом:

document.write(“<a href=” + xssFilters.uriInUnQuotedAttr(url) + “>” + xssFilters.uriInHTMLData(url) + “</a>”);
Войдите в полноэкранный режим Выход из полноэкранного режима

XSS-фильтры в основном разработаны на основе спецификации HTML 5. Принцип заключается в том, что для каждого непрограммируемого контекста вывода необходимо экранировать определенные символы.

На стороне сервера (Node.js) установите xss-filters npm и включите его в качестве зависимости для вашего проекта:

npm install xss-filters –save

В самом репозитории XSS-Filters есть более продвинутые руководства, а также объяснение того, как установить его на стороне клиента (браузера)

Избегайте атак SQL Injection
Атака SQL Injection заключается в «внедрении» SQL-запроса через входные данные на стороне клиента в приложение. Успешная эксплуатация позволяет злоумышленнику читать конфиденциальные данные из базы данных и изменять их.

В случае с Javascript, базы данных SQL уязвимы для этого типа атак, если параметры запроса легко эксплуатируются путем выполнения произвольных операторов.

Чтобы избежать этого типа угроз, мы рекомендуем использовать следующие методы:

Правильно выполняйте проверку вводимых пользователем данных
Рассмотрим пример использования фреймворка Express.Js (или просто Express), одного из наиболее широко используемых фреймворков в связке с Node.Js, в представлении уязвимости для данного типа атак:

В данном случае приложение получает идентификаторы пользователей с этого URL и извлекает соответствующий адрес электронной почты через запрос к базе данных, потому что в этом фрагменте кода есть две лазейки:

Первый — запрос к базе данных был построен с использованием конкатенации строк.

Вторая лазейка заключается в том, что пользовательский ввод конкатенируется с запросом, а не рассматривается как недоверенные данные.

Злоумышленник может создать идентификационный параметр строки запроса, чтобы получить доступ ко всем таблицам в базе данных приложения. Вставив, например, эти строковые параметры:

В результате получается следующий запрос:

Успешный запрос предоставит злоумышленнику список всех таблиц в базе данных. Поэтому для борьбы с SQL Injection разработчикам необходимо всегда выполнять правильную проверку ввода, так как если проверка не пройдет, SQL-запрос не будет выполнен.

Используйте параметризованные запросы или подготовленные операторы вместо конкатенаций
В этом случае параметризованные запросы служат для абстрагирования синтаксиса SQL от входных параметров. В примере на Node.Js ниже показан код авторизации, где имя пользователя и пароль будут получены из HTTP-запроса. sqlQuery содержит запрос, который был создан для аутентификации входных данных….. SQL-запрос выполняется в строке 6, как вы можете видеть:

Изъян в этом коде заключается в SQL-запросе и отсутствии санации имени пользователя и пароля, входных данных. В этом случае вместо конкатенации следует использовать подготовленный оператор или параметризованный запрос. Подготовленный оператор служит для абстрагирования синтаксиса SQL от любых входных параметров.

Пример использования подготовленного отчета:

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

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

Всегда проверяйте сторонние библиотеки на наличие уязвимостей:

Добавьте код целостности для вашего приложения
Действуя на стороне front-end, вы, скорее всего, использовали теги для импорта библиотек сторонних разработчиков. Но что, если ресурс был подделан? Это то, что может произойти при рендеринге внешних ресурсов в ваше веб-приложение, что приведет к потере безопасности в вашем приложении.

Чтобы справиться с этой ситуацией, можно добавить код целостности, известный как Subresource Integrity (SRI), чтобы браузеры проверяли, что ресурсы, такие как сети доставки контента (CDN), которые они получают, доставляются без неожиданных манипуляций. Он работает, позволяя вам предоставить криптографический хэш, которому должен соответствовать получаемый ресурс.

Стоит помнить, что прежде чем оценить, был ли он взломан, необходимо убедиться, что используемый вами внешний код не содержит уязвимостей.

Обновление версий пакетов NPM
Если в какой-либо версии пакета NPM вы обнаружите символы типа ^ или ~, это означает, что происходит автоматический выпуск вторичных и патч-версий.

Включение обновления этих пакетов поможет снизить риски безопасности.

Используйте некоторые средства управления пакетами
Отслеживание всех пакетов, которые вы используете в своем веб-приложении, поможет вам держать под контролем уязвимости сторонних разработчиков.

Это можно сделать с помощью менеджера пакетов, например, npm, Yarn или pnpm. Помимо управления, они также предоставляют инструменты для аудита ваших пакетов и помогают найти распространенные проблемы безопасности JavaScript.

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

Когда мы смотрим на разработанный процесс развития, мы видим, что первым шагом является обучение и наращивание потенциала в этом виде навыков.

Очевидно, что этот вид деятельности необходим для процесса безопасной разработки. С помощью модуля People & Culture, Education от Conviso Platform можно выполнять технические упражнения по безопасному кодированию на JavaScript и многих других языках.

Оригинальное сообщение: https://bit.ly/3yMjtKO

С помощью программы People & Culture вы можете решать реальные проблемы безопасности и даже получать баллы, чтобы отслеживать свой прогресс.

Оцените статью
devanswers.ru
Добавить комментарий