Демонстрация уязвимости
Для проверки уязвимости была изменена строка в коде, отвечающая за выбор данных из базы.
Уязвимая строка:
cur.execute(f"SELECT password_hash FROM users WHERE username = '{username}'")
SQL-инъекция (см. Рис. 8), использованная для тестирования:
Логин: ' OR '1'='1' --
Пароль: (пустое поле)
Рис. 8. SQL-инъекция
Инъекция сработала (см. Рис. 9), пользователь был авторизован, несмотря на отсутствие реального логина и пароля.
Рис. 9. Результат инъекции
Уязвимость была устранена путём внедрения параметризации:
cur.execute("SELECT password_hash FROM users WHERE username = %s", (username,))
Параметризация — это метод безопасного выполнения SQL-запросов, при котором данные передаются в запрос не напрямую, а в виде параметров. Это предотвращает выполнение вредоносного кода, введённого пользователем. В этом случае пользовательский ввод передаётся отдельно и обрабатывается базой данных как данные, а не как часть SQL-кода. Это значительно повышает безопасность приложения.
Тестирование той же SQL-инъекции показало, что приложение корректно возвращает сообщение об ошибке авторизации.
Вывод
В ходе выполнения работы была продемонстрирована важность безопасного проектирования веб-приложений, в частности защиты от одной из наиболее распространённых уязвимостей — SQL-инъекций. На первом этапе был создан и настроен фундамент проекта: база данных PostgreSQL, в которой хранятся данные пользователей, такие как логины и хэшированные пароли. Это позволило организовать надёжное хранилище для работы приложения. Особое внимание было уделено настройке прав доступа к базе, что уже на этом этапе закладывало основы безопасного взаимодействия.
Далее был реализован основной функционал приложения с использованием языка Python и фреймворка Flask. Логика работы включала маршруты для регистрации новых пользователей, авторизации уже существующих и отображения персонализированных страниц. При этом для повышения безопасности использовалась библиотека bcrypt для хэширования паролей, что исключает возможность их утечки в случае компрометации базы данных. Создание простого, но функционального веб-интерфейса позволило пользователям взаимодействовать с приложением через интуитивно понятные формы.
Особое внимание в ходе работы уделялось демонстрации уязвимости приложения при неправильной обработке данных, вводимых пользователем. Был намеренно внедрён уязвимый код, позволяющий выполнить SQL-инъекцию, что продемонстрировало, как незащищённые запросы могут поставить под угрозу данные приложения. Однако затем эта уязвимость была устранена путём реализации параметризации запросов, что на практике показало, как простые изменения в коде могут значительно повысить уровень безопасности.
Результаты работы продемонстрировали ключевую разницу между уязвимым и защищённым приложением. Использование параметризованных запросов не только исключило возможность выполнения SQL-инъекций, но и показало важность соблюдения стандартов безопасности на этапе разработки. Таким образом, были достигнуты как образовательные, так и практические цели: проект продемонстрировал как уязвимости, так и методы их устранения, подчеркнув значение внедрения безопасных подходов при разработке веб-приложений.
Итогом работы стало не только понимание основных принципов защиты от SQL-инъекций, но и получение навыков построения надёжной серверной архитектуры и взаимодействия с базой данных через веб-интерфейс. Это подчёркивает важность продуманного и безопасного подхода к разработке на всех этапах, начиная с архитектуры базы данных и заканчивая реализацией пользовательского интерфейса.
