Deprecated: Function get_magic_quotes_gpc() is deprecated in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 99

Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 619

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1169

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176

Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 1176
8000 GitHub - kootik/f152z: Система прокторинга и анализа тестов
Nothing Special   »   [go: up one dir, main page]

Skip to content

kootik/f152z

Repository files navigation

Система прокторинга и анализа тестов

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


🚀 Новая версия 2.0 доступна для тестирования!

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

Новая версия находится в отдельной ветке v2.0 и пока не слита с основной веткой main.

Как скачать и установить новую версию:

  1. Клонирование репозитория (если вы еще этого не сделали):

    git clone https://github.com/kootik/f152z.git
    cd f152z
  2. Переключение на ветку v2.0: Это самая важная команда. Она переключит вас на новую версию кода.

    git checkout v2.0
  3. Установка и запуск: Следуйте стандартным инструкциям по установке, описанным ниже в разделе "Установка и запуск".

🚀 Функциональные возможности системы

Данное приложение представляет собой комплексную платформу для проведения онлайн-обучения и аттестации персонала с расширенными функциями контроля и аналитики.

📚 Модуль обучения и тестирования

Система предоставляет гибкую среду для организации учебных курсов и проведения тестов.

  • Разделение курсов: Платформа поддерживает несколько независимых курсов и тестов, например, по ФЗ-152 "О персональных данных" и основам информационной безопасности (Приказ ФСТЭК № 117).
  • Сохранение результатов: Все результаты тестов автоматически сохраняются в виде JSON-файлов и могут быть просмотрены через специальный веб-интерфейс (/results).
  • Автоматическая выдача сертификатов: При успешном прохождении теста (набор балла выше порогового значения) система автоматически генерирует уникальный номер документа (сертификата) в формате ГГ/ММ-XXXX и сохраняет его в базе данных.
  • Пароль на повторную пересдачу Запрет на повторную пересдачу теста с этого компьютера, если он уже успешно пройден. Запрет на повторную сдачу теста, если ФИО ученика уже есть в базе данных.

🕵️‍♂️ Продвинутый прокторинг и сбор данных

  • Отслеживание нарушений в реальном времени: Система фиксирует потерю фокуса окна, попытки печати (Ctrl+P) и создания скриншотов (PrintScreen) и немедленно отправляет события на сервер.
  • Поведенческая биометрия: Собираются данные о клавиатурном почерке (ритм набора ФИО) и динамике движений мыши по каждому вопросу.
  • Анализ вовлеченности в обучение: Отслеживается глубина прокрутки учебных материалов, время активного просмотра каждого модуля и взаимодействие с вопросами для самоконтроля.
  • Цифровой отпечаток устройства: Система собирает Fingerprint браузера для идентификации устройств и выявления аномалий.
  • Запись IP-адреса: Все события и итоговые отчеты привязываются к IP-адресу пользователя.

📊 Модуль аналитики и отчетности

Платформа включает в себя мощные инструменты для анализа поведения пользователей и выявления аномалий.

  • Выявление прерванных сессий: Система позволяет получить список сессий, которые были начаты, но не были успешно завершены. В отчете указывается пользователь, IP-адрес и количество зафиксированных нарушений (потеря фокуса, скриншоты и т.д.).
  • Поведенческий анализ: Это ключевая функция, которая автоматически выявляет подозрительные сессии по совокупности факторов. Сессия помечается как подозрительная, если одновременно выполняются условия:
    1. Высокий балл (например, >90%).
    2. Очень быстрое прохождение теста (например, <180 секунд).
    3. Низкая вовлеченность в предварительное обучение.
  • Расчет индекса вовлеченности: Для поведенческого анализа система рассчитывает "индекс вовлеченности" пользователя в обучающие материалы. Баллы начисляются за:
    • Время, проведенное за просмотром учебных модулей.
    • Глубину прокрутки (просмотр всего материала).
    • Ответы на вопросы для самоконтроля в учебном курсе.

👁️ Визуальные средства сдерживания

  • Динамический водяной знак: На страницах обучения и тестирования отображается движущийся полупрозрачный водяной знак с ID пользователя, что делает утечку материалов легко отслеживаемой.
  • "Умный следящий глаз": Анимированный "глаз" в углу экрана следит за курсором и меняет цвет в зависимости от действий пользователя (потеря фокуса, попытка скриншота), постоянно напоминая о мониторинге.
  • Вспышка-предупреждение: Попытка сделать скриншот вызывает мгновенную вспышку на весь экран, которая портит снимок и сообщает о фиксации нарушения.

📊 Комплексная панель анализа

  • Обзор и аномалии: Единый дашборд со всеми результатами и возможностью запуска автоматического поиска аномалий.
  • Прерванные сессии: Уникальный отчет, показывающий сессии, которые были начаты, но не завершены (например, при попытке кражи вопросов).
  • Интеллектуальный поведенческий анализ: Автоматическое выявление подозрительных тестов, пройденных с аномально высокой скоростью и результатом при отсутствии предварительного изучения соответствующего материала.
  • Реестр аттестатов: Отдельная вкладка с таблицей всех выданных аттестатов, содержащая ФИО, должность, дату, результат и номер документа.
  • Сводная статистика: Общие графики и метрики по всем тестам: средний балл, распределение оценок, активность по дням и топ нарушителей.

📜 Реестр сертификатов

  • Централизованное хранилище: Вся информация о выданных сертификатах (номер, ФИО и должность сотрудника, дата выдачи, результат теста) хранится в отдельной таблице базы данных.
  • API для доступа: Существует API-эндпоинт (/api/get_certificates), который позволяет получить полный реестр всех выданных документов.

🛂 Модуль контроля и ограничения доступа

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

  • Блокировка повторной пересдачи с одного устройства:

    • После того как тест был успешно сдан на определенном компьютере, система запоминает это устройство.
    • При попытке начать тест заново с этого же устройства, появится окно с требованием ввести специальный код-пароль, известный только администратору. Это предотвращает "тренировочные" прохождения теста разными сотрудниками с одного рабочего места.
  • Проверка по ФИО:

    • Перед началом теста система проверяет, есть ли в базе данных сотрудник с таким же ФИО, который уже успешно прошел аттестацию.
    • Если такой сотрудник найден, доступ к тесту также будет ограничен и потребует ввода пароля. Это исключает возможность повторного получения сертификата на одно и то же имя.
  • Код-пароль для администратора:

    • В обоих случаях блокировки администратор может предоставить сотруднику временный код-пароль, который позволит обойти ограничение в исключительных ситуациях (например, при необходимости официальной пересдачи).
    • Для базовой безопасности пароль не хранится в коде в открытом виде, а закодирован с помощью Base64, чтобы предотвратить его случайное обнаружение при просмотре кода страницы. Пароль по умолчанию 3580. Необходимо обновить скачанный репозиторий. Старый пароль bypass789

🛠️ Технологический стек

  • Backend: Python 3, Flask, Gunicorn
  • База данных: SQLite
  • Frontend: HTML5, CSS3 (CSS Variables), Vanilla JavaScript (ES6+)
  • Библиотеки: Chart.js (для графиков), jsPDF & html2canvas (для генерации PDF)

Автоматически формируемое заключение от прохождении теста

Image Image

Панель а 8000 дминистратора

https://fz152.domain.name:8443/results

Image

Процесс тестирования

Image

⚙️ Установка и запуск

1. Подготовка

Перед запуском убедитесь, что у вас установлен Python 3 и pip.

2. Создание файла requirements.txt

Создайте в корневой папке проекта файл requirements.txt со следующим содержимым:

click
Flask
Flask-Cors
gunicorn
unidecode
Werkzeug

3. Установка зависимостей

# 1. (Опционально, но рекомендуется) Создайте и активируйте виртуальное окружение
python3 -m venv venv
source venv/bin/activate  # Для Linux/macOS
# venv\Scripts\activate  # Для Windows

# 2. Установите все необходимые библиотеки
pip install -r requirements.txt

4. Инициализация базы данных

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

# 1. Укажите Flask, какой файл является вашим приложением
export FLASK_APP=app

# 2. Запустите команду для создания таблиц в БД
flask init-db

Вы должны увидеть сообщение: База данных успешно инициализирована.

5. Запуск сервера

  • Для разработки (с автоматической перезагрузкой):
    python app.py
  • Для промышленного использования (через Gunicorn):
    gunicorn --workers 3 --bind 0.0.0.0:5000 app:app

Сервер будет доступен по адресу http://localhost:5000 или по IP-адресу вашего сервера в локальной сети.


📂 Структура проекта

.
├── app.py                  # Основной файл Flask-сервера (backend)
├── app_data.db             # База данных SQLite
├── results_data/           # Директория для хранения итоговых JSON-отчетов
├── static/                 # Статические файлы (JS-библиотеки, шрифты, картинки)
│   ├── questions_data.js
│   └── ...
├── templates/              # HTML-шаблоны, обслуживаемые Flask
│   ├── 117-test.html
│   ├── index2.html
│   ├── study-117.html
│   ├── studytest.html
│   ├── display_results.html
│   └── ...
└── README.md               # Этот файл


Полная инструкция по развертыванию.

### Шаг 1: Добавление файла сервиса в репозиторий




🚀 Развертывание (Deployment)

Этот раздел описывает, как развернуть приложение на сервере под управлением Ubuntu/Debian с использованием Nginx, Gunicorn и Systemd.

Предварительные требования

Перед началом убедитесь, что на вашем сервере установлены:

  • Python 3.9+ и pip
  • Nginx (sudo apt install nginx)
  • Git (sudo apt install git)

1. Клонирование репозитория и настройка окружения

Сначала клонируйте репозиторий и установите зависимости. Рекомендуется размещать проект в директории /var/www/.

# Переходим в директорию и создаем папку для проекта
cd /var/www/
sudo git clone https://github.com/kootik/f152z.git f152z
cd f152z

# Создаем виртуальное окружение
sudo python3 -m venv venv

# Активируем его
source venv/bin/activate

# Устанавливаем зависимости
pip install -r requirements.txt

# Инициализируем базу данных
flask init-db

2. Настройка Nginx

Nginx будет выступать в роли обратного прокси-сервера (reverse proxy), принимая HTTPS-запросы и перенаправляя их на Gunicorn.

# Копируем конфигурационный файл из репозитория
sudo cp deploy/nginx.conf /etc/nginx/sites-available/f152z

# Создаем символическую ссылку для активации конфигурации
sudo ln -s /etc/nginx/sites-available/f152z /etc/nginx/sites-enabled/

# Проверяем синтаксис конфигурации
sudo nginx -t

# Если все в порядке, перезапускаем Nginx
sudo systemctl restart nginx

Важно: Не забудьте разместить ваши SSL-сертификаты (fz152.crt и fz152.key) в директории /var/www/f152z/.

3. Настройка сервиса Systemd

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

# Копируем файл сервиса из репозитория в системную директорию
sudo cp deploy/f152z.service /etc/systemd/system/f152z.service

Обязательно отредактируйте файл /etc/systemd/system/f152z.service и укажите корректного пользователя и группу (User и Group), от имени которых будет работать Gunicorn.

# Обновляем конфигурацию systemd
sudo systemctl daemon-reload

# Запускаем наш сервис
sudo systemctl start f152z

# Включаем автозапуск сервиса при старте системы
sudo systemctl enable f152z

4. Проверка статуса

Чтобы убедиться, что все работает, проверьте статус Nginx и вашего приложения:

# Статус Nginx (должен быть active (running))
sudo systemctl status nginx

# Статус вашего приложения (должен быть active (running))
sudo systemctl status f152z

Если оба сервиса активны, ваше приложение успешно развернуто!

⚙️ Кастомная настройка порта Nginx

По умолчанию, предоставленная конфигурация Nginx (deploy/nginx.conf) настроена на работу по следующим портам:

  • Порт 80 для HTTP-запросов с автоматическим перенаправлением на HTTPS.
  • Порт 8443 для основного трафика по HTTPS.

Если эти порты уже заняты на вашем сервере или вы хотите использовать стандартный порт 443 для HTTPS, вам потребуется внести изменения в конфигурационный файл.

Как изменить порт для HTTPS (например, с 8443 на 443):

  1. Откройте файл конфигурации Nginx: На вашем сервере это будет /etc/nginx/sites-availabl 8000 e/f152z.

  2. Найдите и измените три строки: Вам нужно заменить порт 8443 на новый (например, 443) в двух местах в файле.

    • В блоке перенаправления (HTTP): Измените порт в строке return. Это гарантирует, что пользователи, заходящие по HTTP, будут перенаправлены на правильный HTTPS-порт.

      # Было:
      return 301 https://$host:8443$request_uri;
      
      # Стало (для порта 443):
      return 301 https://$host$request_uri; 
      # Примечание: для стандартного порта 443 его можно не указывать
    • В основном блоке сервера (HTTPS): Измените порт в директиве listen.

      # Было:
      listen 8443 ssl;
      
      # Стало:
      listen 443 ssl;

    Вы также можете изменить порт 80, если это необходимо, изменив listen 80; на другой.

  3. Проверьте и перезапустите Nginx: После сохранения изменений обязательно проверьте синтаксис конфигурации и перезапустите Nginx, чтобы применить их.

    # Проверка синтаксиса
    sudo nginx -t
    
    # Перезапуск, если проверка прошла успешно
    sudo systemctl restart nginx

Теперь ваше приложение будет доступно по новому порту.

🔒 Настройка SSL-сертификатов

Для работы приложения по HTTPS требуется SSL-сертификат. Конфигурация Nginx ссылается на файлы fz152.crt и fz152.key. Ниже описаны два способа их получения.

Способ 1: Создание самоподписанного сертификата (для разработки)

Этот метод идеально подходит для быстрой настройки на локальной машине или для внутреннего тестирования. Браузеры будут выводить предупреждение о безопасности, поскольку сертификат не подписан доверенным центром, но соединение всё равно будет зашифровано.

  1. Сгенерируйте ключ и сертификат одной командой, используя OpenSSL:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout fz152.key -out fz152.crt
    • req -x509: Создаёт самоподписанный сертификат.
    • -nodes: Создаёт ключ без парольной фразы.
    • -days 365: Устанавливает срок действия сертификата в 1 год.
    • -newkey rsa:2048: Генерирует новый 2048-битный RSA-ключ.
    • -keyout / -out: Указывают имена выходных файлов для ключа и сертификата.
  2. Заполните данные сертификата: В процессе выполнения команды вам будет предложено ввести информацию. Самое важное поле:

    • Common Name (e.g. server FQDN or YOUR name): Обязательно укажите здесь доменное имя вашего сервера, как оно прописано в Nginx (например, fz152.domain.name). Остальные поля можно оставить пустыми, нажав Enter.
  3. Разместите файлы: Скопируйте сгенерированные файлы fz152.key и fz152.crt в рабочую директорию проекта на сервере (например, /var/www/f152z/).

🔑 Как изменить пароль администратора

Пароль для обхода блокировки хранится в клиентском коде в закодированном виде (Base64), чтобы не быть очевидным при простом просмотре исходного кода. Если вы хотите его изменить, следуйте этой инструкции.

1. Кодирование нового пароля в Linux

Самый простой способ получить Base64-строку из вашего нового пароля — использовать стандартные утилиты командной строки echo и base64.

  • Откройте терминал Linux и выполните следующую команду, заменив ВАШ_НОВЫЙ_ПАРОЛЬ на значение, которое вы хотите использовать:

    echo -n "ВАШ_НОВЫЙ_ПАРОЛЬ" | base64
    • Пример:
      echo -n "SuperAdmin2025" | base64
    • Результат:
      U3VwZXJBZG1pbjIwMjU=
      

    Важно: Ключ -n в команде echo убирает символ новой строки, что обеспечивает правильное кодирование.

2. Замена пароля в коде

Теперь, когда у вас есть новая закодированная строка, ее нужно вставить в код.

  1. Откройте файл: templates/117-test.html или templates/index2.html

  2. Найдите строку с переменной this.overridePassword.

  3. Замените старое закодированное значение на новое, которое вы получили на предыдущем шаге.

    • Было (пример):

      // --- NEW: Security and Mock DB ---
      this.overridePassword = 'QmFzZTY0=='; // Master password (Base64 encoded)
    • Стало (с новым паролем из примера):

      // --- NEW: Security and Mock DB ---
      this.overridePassword = 'U3VwZXJBZG1pbjIwMjU='; // Master password (Base64 encoded)
  4. Сохраните файл. Изменения вступят в силу немедленно после перезапуска сервера.

  5. sudo systemctl stop f152z sudo systemctl start f152z

About

Система прокторинга и анализа тестов

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Packages

 
 
 
0