Files
2026-10-07 19:59:34 +03:00

184 lines
7.9 KiB
TeX
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\documentclass[14pt,a4paper]{extarticle}
% Переносимо: компилируется и pdflatex (T2A), и xelatex/lualatex (fontspec).
\usepackage{iftex}
\ifPDFTeX
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\else
\usepackage{fontspec}
\setmainfont{Liberation Serif}
\fi
\usepackage[russian]{babel}
\usepackage[left=30mm,right=15mm,top=20mm,bottom=20mm]{geometry}
\usepackage{graphicx}
\usepackage[hidelinks]{hyperref}
\usepackage{listings}
\usepackage{xcolor}
\newcommand{\group}{Р3413}
\newcommand{\worknum}{1}
\newcommand{\workname}{Разработка защищённого REST API с интеграцией в CI/CD}
\lstset{
basicstyle=\ttfamily\small,
breaklines=true,
frame=single,
columns=fullflexible,
keepspaces=true,
showstringspaces=false
}
\newcommand{\shot}[1]{%
\begin{center}%
\includegraphics[width=0.98\linewidth,height=0.42\textheight,keepaspectratio]{#1}%
\end{center}%
}
\begin{document}
\begin{titlepage}
\begin{center}
Федеральное государственное автономное образовательное учреждение\\
высшего образования\\
«Национальный исследовательский университет ИТМО»
\vfill
Лабораторная работа №\worknum
\vspace{0.5cm}
по дисциплине «Информационная безопасность»
\vspace{0.5cm}
\textbf{\workname}
\end{center}
\vfill
\begin{flushright}
Выполнил:\\
Карпов Александр Дмитриевич\\
\group
\end{flushright}
\vfill
\begin{center}
Санкт-Петербург, 2026
\end{center}
\end{titlepage}
\tableofcontents
\newpage
\section{Цель работы}
Получить практический опыт разработки безопасного backend-приложения с
автоматизированной проверкой кода на уязвимости. Освоить базовые меры защиты из
OWASP Top 10 (инъекции, XSS, недостатки аутентификации) и интеграцию
инструментов анализа безопасности в CI/CD.
\section{Постановка задачи}
Разработать REST API со следующими эндпоинтами:
\begin{itemize}
\item \texttt{POST /auth/login} — аутентификация пользователя;
\item \texttt{GET /api/data} — получение данных, доступно только
аутентифицированным пользователям;
\item \texttt{POST /api/buy} — собственный метод: покупка кристаллов
(дополнительно реализован \texttt{POST /auth/register}).
\end{itemize}
Реализовать защиту от SQL-инъекций, XSS и небезопасной аутентификации; настроить
CI/CD pipeline с запуском SAST- и SCA-сканеров.
\section{Используемые инструменты}
\begin{itemize}
\item Python 3.12, Flask, Flask-SQLAlchemy, SQLite;
\item PyJWT — выпуск и проверка JWT;
\item bcrypt — хэширование паролей;
\item Bandit — статический анализ (SAST);
\item pip-audit — анализ зависимостей (SCA);
\item GitHub Actions — CI/CD;
\item pytest — автотесты; curl — ручное тестирование.
\end{itemize}
\section{Ход выполнения}
\subsection{Архитектура приложения}
Приложение собрано по схеме application factory. Логика вынесена в пакет
\texttt{app}: модели (\texttt{models.py}), выпуск и проверка токена
(\texttt{auth.py}), маршруты (\texttt{routes.py}), начальное наполнение БД
(\texttt{seed.py}). Точка входа \texttt{run.py} лишь создаёт приложение.
\subsection{Защита от SQL-инъекций}
Все обращения к БД выполняются через ORM SQLAlchemy
(\texttt{filter\_by}, \texttt{db.session.get}). Пользовательский ввод всегда
передаётся как параметр запроса и экранируется драйвером, а не склеивается в
строку SQL. Попытка входа с пейлоадом \texttt{admin' OR '1'='1} приводит к ответу
401 — инъекция не срабатывает.
\subsection{Защита от XSS}
Все строковые поля, пришедшие от пользователя (\texttt{username}, \texttt{color}),
экранируются функцией \texttt{markupsafe.escape} перед возвратом в JSON. Имя
вида \texttt{<script>alert(1)</script>} возвращается как
\texttt{\&lt;script\&gt;...} и не исполняется на клиенте.
\subsection{Аутентификация}
Пароли хранятся только в виде bcrypt-хэша со случайной солью
(\texttt{bcrypt.hashpw}). При успешном входе выдаётся подписанный JWT (алгоритм
HS256) с временем жизни. Защищённые эндпоинты закрыты декоратором
\texttt{token\_required}, который проверяет наличие заголовка
\texttt{Authorization: Bearer}, подпись токена и срок действия (\texttt{exp}).
\subsection{CI/CD}
Файл \texttt{.github/workflows/ci.yml} запускается на каждый \texttt{push} и
\texttt{pull\_request} и последовательно выполняет: установку зависимостей,
Bandit (SAST), pip-audit (SCA) и pytest.
\section{Результаты}
\subsection{Работа API}
\paragraph{Логин и получение токена.}
\shot{images/01_login.png}
\paragraph{Доступ к \texttt{/api/data} без токена (401) и с токеном (200).}
\shot{images/02_data_auth.png}
\paragraph{SQL-инъекция в логине отклонена.}
\shot{images/03_sqli.png}
\paragraph{XSS: имя пользователя экранировано в ответе.}
\shot{images/04_xss.png}
\paragraph{Покупка кристаллов.}
\shot{images/05_buy.png}
\subsection{Отчёты SAST/SCA}
\paragraph{Bandit (SAST) — критических проблем не найдено.}
\shot{images/06_bandit.png}
\paragraph{pip-audit (SCA) — уязвимых зависимостей не найдено.}
\shot{images/07_pipaudit.png}
\paragraph{Автотесты (pytest) в составе pipeline.}
\shot{images/09_tests.png}
\paragraph{Успешный запуск pipeline (все шаги зелёные).}
\shot{images/08_actions.png}
\section{Ссылки}
\begin{itemize}
\item Репозиторий: \url{https://github.com/Alexander-D-Karpov/ib-lab1}
\item Последний успешный pipeline:\\
\href{https://github.com/Alexander-D-Karpov/ib-lab1/actions/runs/37653150323}{actions/runs/37653150323}
\end{itemize}
\section{Вывод}
Разработан защищённый REST API с аутентификацией по JWT и хэшированием паролей
bcrypt. Реализована защита от SQL-инъекций (ORM с параметризацией) и XSS
(экранирование вывода). Настроен CI/CD pipeline с автоматическим запуском SAST
(Bandit) и SCA (pip-audit) на каждый push и pull request. Все проверки
безопасности и автотесты проходят успешно.
\end{document}