184 lines
7.9 KiB
TeX
184 lines
7.9 KiB
TeX
\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{\<script\>...} и не исполняется на клиенте.
|
||
|
||
\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}
|