Skip to content

marceloaaps/project-eris-back

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Project Eris - Back-end

📋 Descrição

Project Eris (nomeado através da Deusa Grega da Discórdia e Conflito) é um projeto científico focado em Phishing e Engenharia Social, onde, a partir de artigos e estudos científicos, seguimos com a ideia de explorar a maior vulnerabilidade de todos os sistemas: o ser humano.

🔗 Links do Projeto

🎯 Objetivo do Projeto

Com panfletos e aplicação web estruturados com base em artigos científicos, de forma padronizada, distribuímos pelas duas Universidades da UNIUBE de Uberlândia um website de sorteio falso projetado para medir a suscetibilidade à engenharia social.

🔬 Metodologia Científica

O experimento foi conduzido com rigor metodológico:

  1. Distribuição Física: Panfletos impressos distribuídos nos campi universitários
  2. Website Isca: Plataforma web simulando um sorteio corporativo
  3. Design Estratégico: Interface brandless inspirada na estética minimalista da Apple
  4. Gatilhos Mentais: Frases e elementos visuais baseados em estudos de persuasão
  5. Coleta de Dados: Monitoramento de comportamento e engajamento dos participantes

📊 Questões de Pesquisa

O projeto busca responder:

  • ✅ Quantas pessoas cairiam neste experimento de phishing?
  • ✅ Quanto tempo os usuários ficaram na página?
  • ✅ Qual a distribuição por curso e campus?
  • ✅ Quantos efetivamente leram os termos de uso?
  • ✅ Os termos de uso (que avisam explicitamente tratar-se de sorteio FALSO) foram ignorados?

⚠️ Aspecto Ético

Transparência Total: Os termos de uso do sistema informam claramente aos participantes que:

  • O sorteio é fictício
  • Trata-se de um experimento científico
  • Os dados são coletados para fins acadêmicos e de pesquisa

🏗️ Arquitetura

O projeto foi desenvolvido seguindo os princípios de Clean Architecture, e Domain-Driven Design (DDD), garantindo:

Clean Architecture

  • Separação de responsabilidades em camadas bem definidas
  • Independência de frameworks - regras de negócio isoladas
  • Testabilidade - facilita a criação de testes unitários
  • Independência de UI - a lógica não depende da interface
  • Independência de banco de dados - o domínio não conhece detalhes de persistência

Domain-Driven Design (DDD)

  • Entities - objetos de domínio com identidade única (User, Course, TermsVisualization)
  • Repositories - abstração de acesso aos dados
  • Use Cases - encapsulamento das regras de negócio
  • Value Objects - validações customizadas (ValidUniversityEmail)

Estrutura de Camadas

┌─────────────────────────────────────┐
│      Presentation Layer             │  ← Controllers, DTOs
│   (Interface de apresentação)       │
├─────────────────────────────────────┤
│      Application Layer              │  ← Use Cases
│   (Casos de uso/Regras de negócio)  │
├─────────────────────────────────────┤
│      Domain Layer                   │  ← Entities, Repositories
│   (Núcleo da aplicação)             │
├─────────────────────────────────────┤
│      Infrastructure Layer           │  ← Configs, Validations, Mappers
│   (Detalhes técnicos)               │
└─────────────────────────────────────┘

🔧 Tecnologias e Dependências

Versão

  • Versão do Projeto: 0.0.1-SNAPSHOT
  • Java: 17
  • Spring Boot: 3.4.4
  • Maven: Build e gerenciamento de dependências
  • Encoding: UTF-8

Principais Dependências

Framework e Web

  • Spring Boot Starter Web (3.4.4)

    • Framework para desenvolvimento de aplicações web RESTful
    • Inclui Spring MVC, Tomcat embedded e Jackson para JSON
    • Suporta criação de APIs REST
  • Spring Boot Starter Data JPA (3.4.4)

    • Persistência de dados com JPA/Hibernate
    • Abstração de acesso ao banco de dados
    • Implementação de repositórios com Spring Data
  • Spring Boot Starter Data REST (3.4.4)

    • Exposição automática de repositórios via REST
    • HAL (Hypertext Application Language) para APIs
  • Spring Boot Starter Validation (3.4.4)

    • Validação de dados com Bean Validation (JSR 380)
    • Annotations como @Valid, @NotNull, @Email
    • Validações customizadas (@ValidUniversityEmail)

Banco de Dados

  • MySQL Connector J (versão gerenciada pelo Spring Boot)

    • Driver JDBC oficial para MySQL
    • Suporte a conexões otimizadas e pool de conexões
  • Flyway Core (versão gerenciada pelo Spring Boot)

    • Versionamento e migração de banco de dados
    • Controle de versão de schema
    • Migrations automáticas na inicialização
  • Flyway MySQL (versão gerenciada pelo Spring Boot)

    • Suporte específico para sintaxe e recursos do MySQL

Mapeamento e Conversão

  • MapStruct (v1.6.3)

    • Geração automática de código para mapeamento entre objetos
    • Conversão entre Entities e DTOs
    • Mappers type-safe em tempo de compilação
    • Processador de anotações: mapstruct-processor (v1.6.0.Beta1)
  • JAXB API (v2.3.0)

    • Java Architecture for XML Binding
    • Conversão entre objetos Java e XML

Monitoramento e Observabilidade

  • Spring Boot Actuator (3.4.4)
    • Endpoints de monitoramento (/actuator/health, /actuator/metrics)
    • Informações sobre a aplicação em runtime
    • Métricas de performance e saúde

Desenvolvimento

  • Spring Boot DevTools (3.4.4)
    • Hot reload durante desenvolvimento
    • Restart automático da aplicação
    • Configurações otimizadas para dev

Testes

  • Spring Boot Starter Test (3.4.4)
    • JUnit 5 - framework de testes
    • Mockito - criação de mocks
    • AssertJ - assertions fluentes
    • Hamcrest - matchers para testes
    • Spring Test - testes de integração

Plugins Maven

  • Spring Boot Maven Plugin - Empacotamento e execução da aplicação
  • Maven Compiler Plugin (v3.11.0) - Compilação com suporte a annotation processors
  • Maven Resources Plugin - Gerenciamento de recursos (configurado para PDFs e SWFs)

⚙️ Variáveis de Ambiente

O projeto requer as seguintes variáveis de ambiente para execução:

Configuração do Banco de Dados

DB_USERNAME=seu_usuario_mysql
DB_PASSWORD=sua_senha_mysql
DB_NAME=eris_db

Descrição das Variáveis

Variável Descrição Exemplo
DB_USERNAME Nome de usuário do banco de dados MySQL root ou eris_user
DB_PASSWORD Senha do usuário do banco de dados senha123
DB_NAME Nome do banco de dados a ser utilizado eris_db

Configurando as Variáveis

Windows (CMD)

set DB_USERNAME=root
set DB_PASSWORD=senha123
set DB_NAME=eris_db

Windows (PowerShell)

$env:DB_USERNAME="root"
$env:DB_PASSWORD="senha123"
$env:DB_NAME="eris_db"

Linux/Mac

export DB_USERNAME=root
export DB_PASSWORD=senha123
export DB_NAME=eris_db

Docker Compose

environment:
  - DB_USERNAME=root
  - DB_PASSWORD=senha123
  - DB_NAME=eris_db

String de Conexão

A aplicação utiliza a seguinte string de conexão:

jdbc:mysql://db:3306/${DB_NAME}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC

🚀 Como Executar

Pré-requisitos

  • Java 17 instalado
  • MySQL em execução
  • Maven configurado
  • Variáveis de ambiente configuradas

Executar com Maven

mvnw spring-boot:run

Executar com Docker

docker-compose up

📡 Endpoints da API

Base URL: /api

Todos os endpoints são prefixados com /api conforme configuração em spring.mvc.servlet.path.

1. Registro de Usuários

POST /api/register

Registra um novo usuário no sistema.

Request Body:

{
  "email": "usuario@kroton.com.br",
  "courseId": 1
}

Response:

  • Status 201 Created: Email cadastrado com sucesso!
  • Status 400 Bad Request: Email inválido ou já cadastrado

Validações:

  • Email deve ser do domínio universitário (@kroton.com.br)
  • Email não pode estar duplicado
  • Course ID deve existir no banco

2. Cursos

GET /api/courses/get-all

Retorna lista paginada de cursos disponíveis.

Query Parameters:

  • page (opcional): Número da página (padrão: 0)
  • size (opcional): Tamanho da página (padrão: 20)
  • sort (opcional): Campo para ordenação

Response:

{
  "content": [
    {
      "id": 1,
      "name": "Engenharia de Software",
      "description": "Descrição do curso"
    }
  ],
  "page": 0,
  "size": 20,
  "totalElements": 10,
  "totalPages": 1
}

Status: 200 OK


3. Termos de Uso

POST /api/terms/terms_counter

Incrementa o contador de leitura dos termos de uso.

Response:

  • Status 200 OK: Contador atualizado com sucesso

Descrição: Utilizado para métricas de quantos usuários leram os termos.


POST /api/terms/page_counter

Incrementa o contador de visualização da página de termos.

Response:

  • Status 200 OK: Contador atualizado com sucesso

Descrição: Utilizado para métricas de quantos usuários acessaram a página de termos.


🗃️ Estrutura do Banco de Dados

O projeto utiliza Flyway para gerenciar migrações de forma versionada.

Tabelas Principais

  • users - Armazena informações dos usuários cadastrados

    • id, email, course_id, created_at
  • courses - Lista de cursos disponíveis

    • id, name, description
  • terms_visualization - Métricas de visualização dos termos

    • id, terms_readed (contador de leitura)
    • opened_page (contador de visualização da página)

Migrations

Localizadas em: src/main/resources/db/migration/

Histórico de versões:

  • V0: Criação das tabelas iniciais
  • V1: Criação da tabela de visualização
  • V2: Adição do campo opened_page
  • V3-V9: Alterações e ajustes nas tabelas

📂 Estrutura do Projeto

src/main/java/com/uniube/project_eris/
├── core/                    # CAMADA DE DOMÍNIO E APLICAÇÃO
│   ├── api/                 # Contratos e interfaces da API
│   │   ├── EmailRequest.java
│   │   ├── EmailValidatorResponse.java
│   │   └── Result.java
│   ├── domain/              # Camada de Domínio (DDD)
│   │   ├── entity/          # Entidades do domínio
│   │   │   ├── Course.java
│   │   │   ├── TermsVisualization.java
│   │   │   └── User.java
│   │   ├── repository/      # Interfaces de repositório
│   │   │   ├── CourseRepository.java
│   │   │   ├── TermsVisualizationRepository.java
│   │   │   └── UserRepository.java
│   │   └── validators/      # Validações de domínio
│   │       └── ValidUniversityEmail.java
│   └── use_case/            # Casos de Uso (Clean Architecture)
│       ├── courses/
│       │   └── CourseUseCase.java
│       ├── register/
│       │   └── RegisterUseCase.java
│       └── terms/
│           └── TermsUseCase.java
├── infra/                   # CAMADA DE INFRAESTRUTURA
│   ├── configurations/      # Configurações técnicas
│   │   └── CorsConfig.java
│   ├── exceptions/          # Tratamento de exceções
│   │   ├── EmailAlreadyRegisteredException.java
│   │   └── GlobalExceptionHandler.java
│   ├── mappers/             # Mapeadores MapStruct
│   │   ├── CourseMapper.java
│   │   └── UserMapper.java
│   └── validations/         # Validações customizadas
│       └── UniversityEmailValidator.java
└── presentation/            # CAMADA DE APRESENTAÇÃO
    ├── controller/          # Controllers REST
    │   ├── CourseController.java
    │   ├── RegisterController.java
    │   └── TermsController.java
    └── dto/                 # Data Transfer Objects
        ├── CourseDto.java
        ├── PagedResponse.java
        ├── UserDto.java
        └── terms/
            ├── TermsReadedDto.java
            └── TermsViewedPageDto.java

⚙️ Configuração

Arquivo de Configuração Principal

src/main/resources/application.properties

Configurações JPA/Hibernate

  • DDL Auto: none (controlado pelo Flyway)
  • Show SQL: true (logs de queries SQL)
  • Format SQL: true (queries formatadas)
  • Open in View: false (evita lazy loading fora da transação)

Configurações Flyway

  • Enabled: true
  • Baseline on Migrate: true (permite migrar banco existente)
  • Validate on Migrate: true (valida migrations antes de aplicar)

Logs

  • Hibernate SQL: DEBUG (mostra queries executadas)

Configuração de Testes

Para testes, utilize: src/test/resources/application-test.properties

📝 Validações

  • Email Universitário: O sistema valida se o email pertence ao domínio @kroton.com.br através da annotation customizada @ValidUniversityEmail
  • Cadastro Único: Não permite emails duplicados no sistema (constraint de negócio)
  • Bean Validation: Utiliza JSR 380 para validações declarativas nos DTOs

🔒 Segurança

CORS

O projeto possui configuração de CORS em CorsConfig.java para permitir requisições cross-origin.

🐛 Tratamento de Erros

O projeto utiliza um GlobalExceptionHandler para tratamento centralizado de exceções:

  • EmailAlreadyRegisteredException: Email já cadastrado no sistema (HTTP 400)
  • MethodArgumentNotValidException: Erros de validação de campos (HTTP 400)
  • Exception Genéricas: Tratamento padronizado de erros (HTTP 500)

🐳 Docker & Cloud

O projeto inclui arquivos de configuração Docker, onde foi hospedado em servidores VPS Hostinger KVM2 durante o experimento:

  • Dockerfile - Imagem da aplicação Java
  • docker-compose.yml - Orquestração de serviços (aplicação + MySQL)
  • Nginx - Utilizando Nginx com Proxy Reverso para comunicação interna e Deploy.

🧪 Testes

O projeto utiliza Mockito para criação de mocks. Configuração em: src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker

👥 Autores do Projeto


Project Eris - Desenvolvido com ❤️ para estudos de Cibersegurança e Engenharia Social

About

Project Eris é um projeto científico focado em Phishing e Engenharia Social, onde, a partir de artigos e estudos científicos, seguimos com a ideia de explorar a maior vulnerabilidade de todos os sistemas: o ser humano.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors