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.
- 🌐 Website: project-eris.com
- 💻 Backend Repository: github.com/project-eris-back
- ⚛️ Frontend Repository: github.com/project-eris-front
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.
O experimento foi conduzido com rigor metodológico:
- Distribuição Física: Panfletos impressos distribuídos nos campi universitários
- Website Isca: Plataforma web simulando um sorteio corporativo
- Design Estratégico: Interface brandless inspirada na estética minimalista da Apple
- Gatilhos Mentais: Frases e elementos visuais baseados em estudos de persuasão
- Coleta de Dados: Monitoramento de comportamento e engajamento dos participantes
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?
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
O projeto foi desenvolvido seguindo os princípios de Clean Architecture, e Domain-Driven Design (DDD), garantindo:
- 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
- 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)
┌─────────────────────────────────────┐
│ 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) │
└─────────────────────────────────────┘
- 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
-
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)
-
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
-
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
- 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
- Spring Boot DevTools (3.4.4)
- Hot reload durante desenvolvimento
- Restart automático da aplicação
- Configurações otimizadas para dev
- 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
- 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)
O projeto requer as seguintes variáveis de ambiente para execução:
DB_USERNAME=seu_usuario_mysql
DB_PASSWORD=sua_senha_mysql
DB_NAME=eris_db| 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 |
set DB_USERNAME=root
set DB_PASSWORD=senha123
set DB_NAME=eris_db$env:DB_USERNAME="root"
$env:DB_PASSWORD="senha123"
$env:DB_NAME="eris_db"export DB_USERNAME=root
export DB_PASSWORD=senha123
export DB_NAME=eris_dbenvironment:
- DB_USERNAME=root
- DB_PASSWORD=senha123
- DB_NAME=eris_dbA aplicação utiliza a seguinte string de conexão:
jdbc:mysql://db:3306/${DB_NAME}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
- Java 17 instalado
- MySQL em execução
- Maven configurado
- Variáveis de ambiente configuradas
mvnw spring-boot:rundocker-compose upBase URL: /api
Todos os endpoints são prefixados com /api conforme configuração em spring.mvc.servlet.path.
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
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
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.
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.
O projeto utiliza Flyway para gerenciar migrações de forma versionada.
-
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)
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
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
src/main/resources/application.properties
- 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)
- Enabled: true
- Baseline on Migrate: true (permite migrar banco existente)
- Validate on Migrate: true (valida migrations antes de aplicar)
- Hibernate SQL: DEBUG (mostra queries executadas)
Para testes, utilize: src/test/resources/application-test.properties
- Email Universitário: O sistema valida se o email pertence ao domínio
@kroton.com.bratravé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
O projeto possui configuração de CORS em CorsConfig.java para permitir requisições cross-origin.
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)
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.
O projeto utiliza Mockito para criação de mocks. Configuração em:
src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
- Augusto Machado - LinkedIn
- Lucas Matias - LinkedIn
- Lucas Mendonça - LinkedIn
- Marcelo Alexandre Alves - LinkedIn
Project Eris - Desenvolvido com ❤️ para estudos de Cibersegurança e Engenharia Social