Обеспечение безопасности и работоспособности является неотъемлемой частью проектирования программного обеспечения. Важно отметить, что внедрение решений по обеспечению информационной безопасности после разработки является дорогостоящей задачей. В связи с этим особенно актуализируются вопросы, связанные с повышением уровня безопасности на этапе проектирования программ [1].
В результате этого особенную актуальность получает такое направление развития, как безопасный код (безопасное программирование). Написание безопасного кода представляет собой такой принцип разработки программного обеспечения, при котором разработчики пытаются учесть всевозможные ошибки и минимизировать вероятность их возникновения. Это значительно повышает стабильность и снижает уязвимость программного обеспечения. Безопасное программирование способно защитить данные пользователя и снизить вероятность их кражи или фальсификации [2].
Таким образом, рассматриваемое направление имеет значительный уровень актуальности на сегодняшний день. В связи с этим складывается необходимость более детального рассмотрения и анализа основных вопросов относительно принципов и правил написания безопасного кода. Представленные результаты исследования отражают комплексный подход к анализу по теме и могут стать полезным материалом для специалистов, ведущих свою деятельность в данной области [3].
Результаты исследования и их обсуждение
Ключевыми аспектами по рассматриваемой теме являются: защита от атак на XML-парсеры (защита от XXE); кодирование и экранирование при работе с браузерами; работа с Cookie и HTTP-заголовками; обработка входных данных и работа с SQL. Анализ и учет при разработке данных аспектов являются принципами безопасного программирования. В последующих материалах представлены основные результаты анализа по отдельности данных аспектов [4, 5].
Защита от атак на XML-парсеры является важной частью обеспечения безопасности веб-приложений и систем, которые обрабатывают XML-данные. XML (Extensible Markup Language) – это формат данных, который широко используется для обмена данными между различными приложениями. Однако неправильная обработка XML может привести к различным уязвимостям и атакам, таким как атаки на внедрение кода (XML Injection) или атаки на отказ в обслуживании (Denial of Service, DoS) [6, 7] (рис. 1).
Вследствие этого для защиты от атак на XML-парсеры можно рекомендовать выполнение следующих требований при написании кода [8, 9]:
− обеспечение валидации и фильтрации входных данных. Предотвращение внедрения вредоносного XML-кода начинается с валидации и фильтрации входных данных, поступающих от пользователей или внешних источников. Решение данных задач может включать в себя проверку на наличие недопустимых символов и структуру XML-документов;
− использование безопасных парсеров. Необходимо использовать безопасные XML-парсеры, которые обеспечивают защиту от атак. Примерами являются парсеры с поддержкой OWASP XML Security Gateway или другие инструменты, спроектированные с учетом безопасности;
− защита от DDoS атак. Для предотвращения атак данного типа необходимо ограничивать глубину и сложность парсинга XML-документов. Это позволяет избежать ресурсоемких атак на вычислительную систему;
− обеспечение возможности аутентификации и авторизации. Важно гарантировать возможность того, что только авторизованные пользователи имеют доступ к XML-документам и могут выполнять действия на основе XML-данных;
− регулярные обновления и обучение персонала. Это является дополнительным требованием помимо представленных ранее принципов безопасного программирования. В дополнение для обеспечения должного уровня информационной безопасности важно постоянно обновлять XML-парсеры и библиотеки для обеспечения безопасности. Также важно проводить обучение персонала с учетом современных угроз и методов защиты.
Следующим аспектом безопасного программирования является экранирование (Escaping) – это важный аспект обеспечения безопасности при работе с браузерами и обработке пользовательских данных [10, 11]. Экранирование используется для предотвращения внедрения вредоносного кода (как HTML, JavaScript, CSS или SQL-инъекции) через пользовательские данные, примером чего является ввод, который пользователи отправляют на сервер или отображается в браузере (рис. 2).
Важно отметить следующие принципы написания безопасного кода в рамках данной области:
− HTML экранирование (HTML Escaping). Когда пользовательские данные выводятся на веб-страницу, они должны быть экранированы. Это нужно для того, чтобы все HTML-теги и специальные символы (например, <, >, &) были представлены как текст, а не интерпретированы как код. Это предотвращает XSS (Cross-Site Scripting) атаки, при которых злоумышленники внедряют вредоносный JavaScript на страницу;
Рис. 1. Принцип DDoS-атаки
Рис. 2. Схема SQL-инъекции
− JavaScript экранирование (JavaScript Escaping). Если пользовательские данные используются в JavaScript-коде, они также должны быть экранированы, чтобы избежать выполнения вредоносных скриптов. Это особенно важно, когда данные вставляются в строки JavaScript, например, для работы с DOM;
− CSS экранирование (CSS Escaping). Если пользовательские данные влияют на стили CSS, то экранирование должно применяться для избегания инъекций CSS. Это позволяет избежать изменения стилей страницы нежелательным образом;
− SQL экранирование (SQL Escaping). При построении SQL-запросов из пользовательских данных, экранирование используется для предотвращения SQL-инъекций. Это гарантирует, что пользовательские данные не могут быть использованы для выполнения зловредных SQL-запросов к базе данных.
При этом можно отметить следующие примеры функций экранирования:
− в PHP: htmlspecialchars() и mysqli_real_escape_string() для для HTML-экранирования и SQL-экранирования соответственно;
− в JavaScript: encodeURIComponent() для URL-экранирования и методы, такие как createElement(), для безопасного создания DOM-элементов.
Важно понимать, что правильное экранирование должно соответствовать контексту использования данных (HTML, JavaScript, CSS, SQL) и выполняться на серверной стороне перед выводом данных на клиентскую сторону. Это помогает предотвратить множество видов атак и обеспечивает безопасность веб-приложений и пользовательских данных [12].
Продолжая анализ по представленной теме, важно отметить, что работа с Cookie и HTTP-заголовками в контексте безопасного кода имеет также большое значение для защиты веб-приложений от различных угроз. Далее представлены некоторые ключевые моменты относительно данного вопроса:
1. Cookie безопасность:
− HttpOnly – необходимо устанавливать флаг HttpOnly для Cookie. Это предотвращает доступ к Cookie из JavaScript и снижает риск кражи сеансов (session hijacking).
− Secure – необходимо устанавливать флаг Secure для Cookie, если они должны использоваться только через HTTPS. Это предотвращает перехват Cookie в открытых сетях.
− SameSite – необходимо использовать атрибут SameSite для ограничения того, какие сайты могут получать доступ к вашим Cookie. Рекомендуется установить его как «Strict» или «Lax» [13].
2. HTTP-заголовки безопасности:
– HTTP Strict Transport Security (HSTS). Необходимо включить заголовок HSTS, чтобы заставить клиентов использовать только HTTPS. Это предотвращает атаки перехвата. Примеры:
markdownCopy code Strict-Transport-Security: max-age=31536000; includeSubDomains; preload |
– Content Security Policy (CSP). Необходимо установить заголовок CSP, чтобы ограничить источники, с которых загружается контент на сайте. Это помогает предотвратить атаки XSS. Примеры:
markdownCopy code Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' |
– X-Content-Type-Options. Необходимо установить заголовок X-Content-Type-Options для предотвращения атак с подменой типа контента. Примеры:
markdownCopy code X-Content-Type-Options: nosniff |
– X-Frame-Options: Необходимо установить заголовок X-Frame-Options для предотвращения атак clickjacking. Примеры:
markdownCopy code X-Frame-Options: DENY |
– X-XSS-Protection. Необходимо установить заголовок X-XSS-Protection для защиты от атак типа XSS. Примеры:
markdownCopy code X-XSS-Protection: 1; mode=block |
– Referrer-Policy. Необходимо установить заголовок Referrer-Policy, чтобы контролировать, какие данные о referer отправляются при переходах между страницами. Примеры:
markdownCopy code Referrer-Policy: same-origin |
Данные меры при написании кода помогут улучшить безопасность веб-приложения, защищая Cookie и управляя HTTP-заголовками. Заключительным из основных аспектов написания безопасного кода является работа с SQL. Обработка входных данных и работа с SQL в рамках безопасного кода крайне важны для предотвращения атак на базу данных, таких как, например, SQL инъекции. Далее представлены основные меры безопасности относительно данного вопроса [14]:
1. Обработка входных данных:
− параметризованные запросы. Важно всегда использовать параметризованные запросы или подготавливаемые выражения для выполнения SQL-запросов. Это предотвращает возможность выполнения SQL-инъекции;
− валидация входных данных. Необходимо обеспечить возможность при написании кода по проверке входных данных на корректность и соответствие ожидаемому формату;
− использование ORM. Использование Object-Relational Mapping (ORM) фреймворков, таких как SQLAlchemy в Python или Entity Framework в .NET, может упростить работу с базой данных и предотвратить многие типы инъекций.
2. Защита от SQL-инъекций:
− экранирование строк. Если отсутствует возможность использовать параметризованные запросы, то необходимо обязательно экранировать строки перед вставкой их в SQL запросы. При этом можно воспользоваться функциями экранирования, предоставляемыми конкретной СУБД;
− ограничение прав доступа. Важно назначить минимальные права доступа к базе данных пользователям и приложениям. «Принцип наименьших привилегий» помогает ограничить возможности злоумышленников;
− мониторинг и журналирование. Важно вести журнал запросов к базе данных и выполнять его мониторинг на предмет подозрительной активности. Это поможет быстро выявить попытки атак;
− обновление библиотеки и СУБД. Необходимо регулярно обновлять библиотеки и саму СУБД для устранения известных уязвимостей;
− защита от времени выполнения. Защита от атак может обеспечиваться на основе таймингов, устанавливая максимальное время выполнения запросов и отключая выполнение нескольких запросов в одном [15].
Заключение
Таким образом, основной целью представленного исследования являлось выполнение анализа относительно ключевых вопросов, связанных с написанием безопасного кода. В результате работы произведен анализ по таким направлениям, как защита от атак на XML-парсеры (защита от XXE), кодирование и экранирование при работе с браузерами, работа с Cookie и HTTP-заголовками, а также обработка входных данных и работа с SQL.
Материалы статьи отражают комплексный подход к анализу по представленному направлению, связанному с безопасным программированием.
В заключение необходимо отметить, что интенсивно расширяющееся использование информационных технологий и программного обеспечения значительно увеличивает риски информационной безопасности. Электронная информация и данные, хранящиеся на веб-серверах, в информационных системах и иных ресурсах непрерывно подвергаются потенциальным угрозам со стороны злоумышленников. В связи с этим на сегодняшний день занимают особенное значение вопросы, связанные с безопасным программированием для возможности предотвращения негативных последствий уже на этапе проектирования программного обеспечения. Также, как уже было отмечено ранее, такой подход является наиболее экономически эффективным, так как интеграция мер по защите информации уже к готовым решениям является более дорогой задачей.
Библиографическая ссылка
Тарасова Ю.А. БЕЗОПАСНАЯ РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ // Научное обозрение. Технические науки. – 2023. – № 5. – С. 31-35;URL: https://science-engineering.ru/ru/article/view?id=1450 (дата обращения: 03.12.2024).