# PROVA COM MONITORAMENTO E ANTI-FRAUDE

# Sistema de Monitoramento e Reconhecimento Facial

## O que é?

O sistema de **Monitoramento e Reconhecimento Facial** é um módulo de fiscalização de provas online (também conhecido no mercado como *proctoring*). Ele foi construído do zero e integrado diretamente à plataforma, com o objetivo de garantir a **integridade das provas realizadas remotamente**, assegurando que o aluno que está fazendo a prova é realmente quem diz ser, e que não está cometendo irregularidades durante a realização.

O sistema opera em duas frentes complementares:

1. **Verificação de identidade** — antes da prova começar, o aluno precisa tirar uma selfie que é comparada automaticamente com a foto do documento cadastrado no sistema (RG, CNH, selfie cadastrada, passaporte). Essa comparação usa reconhecimento facial rodando diretamente no navegador do aluno via **face-api.js**, sem precisar enviar a imagem para um serviço externo de IA.
2. Para contextos mais rápidos e menos burocráticos, temos a validação rápida, onde não há a necessidade de ter documentos do usuario na base. Nesta modalidade, é tirada uma foto do usuário no início da prova e os snapshots ao decorrer da avaliaçao.

**Monitoramento durante a prova** — ao longo de toda a realização, o sistema fica em segundo plano capturando fotos periódicas (snapshots) em momentos aleatórios e registrando comportamentos suspeitos como troca de aba, janela minimizada, cópia e cola, múltiplos rostos na câmera, ausência de rosto e iluminação baixa.

## Por que foi criado?

Em contextos de ensino a distância, a maior vulnerabilidade de uma avaliação é a impossibilidade de verificar fisicamente quem está do outro lado. Sem algum mecanismo de fiscalização, qualquer pessoa poderia fazer a prova no lugar do aluno, usar materiais não permitidos livremente ou ter ajuda de terceiros.

O sistema resolve esse problema de forma **automatizada e não intrusiva** — o aluno não precisa instalar nada, tudo funciona no próprio navegador, e a experiência de prova não é interrompida mesmo quando há alertas ou quando a verificação de identidade vai para revisão manual.

## Como funciona — passo a passo

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/image.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/image.png)

### Etapa 1 — Configuração pelo administrador

Antes de qualquer coisa, o monitoramento precisa ser **habilitado no simulado** pelo administrador ou professor. As configurações disponíveis são:

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/p6limage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/p6limage.png)

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/XfDimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/XfDimage.png)

- **Ativar/desativar** o monitoramento para aquele simulado específico
- **Modo de operação:** simplificado (só captura a selfie, sem comparação) ou completo (com reconhecimento facial e comparação com documento)
- **Quantidade de snapshots** durante a prova (de 1 a 10, padrão 5)
- **Rigor de confiança** — o nível mínimo de similaridade facial para aprovar automaticamente (valor entre 0 e 1, onde menor = mais rígido)
- **Exigir revisão manual** — se ativo, mesmo que a comparação passe no rigor, a sessão ainda vai para fila de revisão humana

##### Observacoes importantes:

- Para a verificação completa funcione, precisa ter grupo de documentos vinculados ao curso onde será realizado a prova e o usuário precisa ao menos ter feito um upload desses documentos : Foto Selfie (mais recomendada, nível de verificação mais acertivo e margem de erro menor), CNH, RG ou Passaporte.
- Na criação dos Simulados, precisa haver a configuracão de Tempo em minutos, pois o sistema de fotos se baseia nele para organizar de forma aleatória as fotos durante a execução da prova.
- O arquivo do documento enviado pelo usuário tem que ser formato foto(JPEG ou PNG), pois o FaceApi (biblioteca que usamos para reconhecimento facial), não consegue acessar arquivos pdf.

### Etapa 2 — Consentimento LGPD

Antes de qualquer captura de dado biométrico, o aluno precisa aceitar explicitamente o **Termo de Consentimento LGPD**. Esse aceite é registrado no banco com:

- IP do aluno no momento do aceite
- User-Agent do navegador (dispositivo e versão)
- Timestamp exato

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/nuximage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/nuximage.png)

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/e9Uimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/e9Uimage.png)

Esse registro existe para garantir conformidade legal — o sistema coleta dados biométricos (imagem do rosto), que são considerados **dados sensíveis** pela LGPD, e exige que haja evidência documental do consentimento informado do titular.

### Etapa 3 — Verificação de identidade (selfie inicial)

Com o consentimento registrado, o sistema ativa a câmera do aluno e solicita que ele tire uma selfie. O que acontece nesse momento:

1. O **face-api.js** (rodando no navegador, via WebGL/GPU) detecta se há exatamente um rosto enquadrado
2. Quando o rosto é detectado com qualidade suficiente, a foto pode ser registrada.
3. A selfie é enviada ao sistema junto com os dados da comparação facial: `face_match_distance` (distância euclidiana entre dois rostos) e `face_match_confidence` (percentual de confiança)
4. O sistema cria a seção de procuradoria e determina o status inicial: 
    - `auto_approved` — passou no rigor, sem revisão manual exigida
    - `pending_review` — não passou no rigor ou o simulado exige revisão manual

Importante: **independente do resultado**, o aluno pode prosseguir com a prova. O sistema nunca bloqueia o acesso — ele apenas registra e sinaliza para revisão posterior.

O documento usado para comparação é selecionado de forma inteligente com base em uma hierarquia de prioridade:

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-prioridade-tipo-rigo"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal" style="width: 100%; height: 296.36px;"><thead class="text-left"><tr style="height: 46.5938px;"><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" style="width: 9.46057%; height: 46.5938px;">Prioridade</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" style="width: 14.414%; height: 46.5938px;">Tipo</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" style="width: 76.0063%; height: 46.5938px;">Rigor</th></tr></thead><tbody><tr style="height: 46.5938px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 9.46057%; height: 46.5938px;">1º</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 14.414%; height: 46.5938px;">Selfie cadastrada</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 76.0063%; height: 46.5938px;">Menos permissivo e mais confiável para o algoritimo, pois compara face x face diretamente (Recomendado)</td></tr><tr style="height: 46.5938px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 9.46057%; height: 46.5938px;">2º</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 14.414%; height: 46.5938px;">RG</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 76.0063%; height: 46.5938px;">Mais permissivo, pois considera que a foto pode ter caracteristicas que hoje a pessoa nao tem mais</td></tr><tr style="height: 46.5938px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 9.46057%; height: 46.5938px;">3º</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 14.414%; height: 46.5938px;">CNH</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 76.0063%; height: 46.5938px;">Mais permissivo, pois considera que a foto pode ter caracteristicas que hoje a pessoa nao tem mais</td></tr><tr style="height: 46.5938px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 9.46057%; height: 46.5938px;">4º</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 14.414%; height: 46.5938px;">Passaporte</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 76.0063%; height: 46.5938px;">Mais permissivo, pois considera que a foto pode ter caracteristicas que hoje a pessoa nao tem mais</td></tr><tr style="height: 63.3906px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 9.46057%; height: 63.3906px;">5º</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 14.414%; height: 63.3906px;">Outro documento com foto</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 76.0063%; height: 63.3906px;">Mais permissivo, pois considera que a foto pode ter caracteristicas que hoje a pessoa nao tem mais</td></tr></tbody></table>

</div>---

### Etapa 4 — Monitoramento durante a prova

Assim que o aluno começa a prova, dois mecanismos entram em operação simultaneamente e silenciosamente:

**Snapshots periódicos:** O sistema gera uma lista de momentos aleatórios dentro da duração total da prova (ex: em uma prova de 60 minutos com 5 snapshots configurados, os momentos podem ser 8min, 19min, 31min, 44min e 56min — nunca no início nem no fim do bloco para não ser previsível). Em cada momento programado, o sistema captura uma foto via câmera e analisa:

- Quantos rostos estão visíveis
- Nível de iluminação
- Se o browser está ativo

**Eventos comportamentais:** O sistema monitora em tempo real e registra imediatamente quando:

- O aluno troca de aba ou minimiza o navegador (`tab_switch`)
- A janela perde foco (`window_blur`)
- O aluno sai do modo tela cheia (`fullscreen_exit`)
- Há tentativa de copiar ou colar conteúdo (`copy_paste`)

Cada evento e snapshot incrementa contadores na sessão (`alerts_tab_switch`, `alerts_no_face`, `alerts_multiple_faces`, `alerts_low_light`, `alerts_window_blur`, `total_snapshots`).

### Etapa 5 — Encerramento da sessão

Quando o aluno finaliza a prova, a sessão de monitoramento é encerrada. Nesse momento o sistema executa a **auto-validação inteligente**: se o total de alertas for **menor ou igual** 5 (margem de erro segura do algoritimo), a prova é validada automaticamente pelo sistema (`auto_validated`) sem precisar de intervenção humana. Se ultrapassar essa margem, fica com status `pending` aguardando revisão.

### Etapa 6 — Painel de auditoria (visão do professor/admin)

##### Como acessar?   
  


[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/qe9image.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/qe9image.png)

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/xGHimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/xGHimage.png)

  
O professor ou procurador tem acesso a um painel completo com:

- **Dashboard geral** com totais de sessões, pendências, alertas e alertas críticos, além da taxa de aprovação automática
- [![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/Nedimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/Nedimage.png)
- **Lista de simulados** com monitoramento ativo, mostrando quantas sessões cada um tem e o volume de alertas
- [![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/6DJimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/6DJimage.png)
- **Sessões pendentes de revisão** com foto do aluno, percentual de confiança e tempo desde a realização
- [![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/KnVimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/KnVimage.png)

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/8w7image.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/8w7image.png)

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/RuSimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/RuSimage.png)

Ao abrir uma sessão específica, o revisor vê:

- A selfie da prova lado a lado com a foto do documento cadastrado
- O percentual de confiança e a distância facial calculados
- O resumo completo de todos os alertas em cards visuais
- A linha do tempo dos snapshots capturados com as fotos
- A linha do tempo dos eventos comportamentais

As ações de **Validar** ou **Invalidar** a prova, com histórico completo de todas as decisões tomadas

### Etapa 7 — Validação e invalidação

O revisor pode tomar duas decisões sobre a prova:

**Validar** — confirma que a sessão é legítima. A performance do aluno é mantida normalmente. Pode ser feito manualmente pelo revisor ou automaticamente pelo sistema no encerramento.

**Invalidar** — registra que houve irregularidade. O revisor é obrigado a informar um motivo detalhado (mínimo 10 caracteres, max 1000 caracteres). O aluno **recebe uma notificação** com o motivo e é informado de que pode entrar com recurso.

Ambas as ações geram entradas no histórico de decisões da sessão, que funciona como um log auditável de todas as decisões (incluindo reversões — um revisor pode validar uma prova que foi invalidada anteriormente, aceitando assim o recurso do aluno).

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/NKqimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/NKqimage.png)

[![image.png](https://wiki.edustore.online/uploads/images/gallery/2026-02/scaled-1680-/eWQimage.png)](https://wiki.edustore.online/uploads/images/gallery/2026-02/eWQimage.png)

## O que o sistema detecta

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-tipo-como-detecta-id"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal" style="width: 63.2143%; height: 268.172px;"><thead class="text-left"><tr style="height: 29.7969px;"><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" style="width: 29.7435%; height: 29.7969px;">Tipo</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" style="width: 70.0653%; height: 29.7969px;">Como detecta</th></tr></thead><tbody><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Identidade divergente</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">Comparação facial via face-api.js (distância euclidiana)</td></tr><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Troca de aba</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">Evento `visibilitychange` do browser</td></tr><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Janela inativa</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">Evento `blur` na window</td></tr><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Saída do fullscreen</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">Evento `fullscreenchange`</td></tr><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Cópia e cola</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">Eventos `copia` e `cola`</td></tr><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Ausência de rosto</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">`faces_detected === 0` no snapshot</td></tr><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Múltiplas pessoas</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">`faces_detected > 1` no snapshot</td></tr><tr style="height: 29.7969px;"><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 29.7435%; height: 29.7969px;">Iluminação baixa</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top" style="width: 70.0653%; height: 29.7969px;">Análise de luminância média dos pixels do canvas</td></tr></tbody></table>

</div>---

## O que o sistema **não** detecta

É importante documentar também as limitações conhecidas:

- **Em dispositivos mobile:** troca de app não é detectável com a mesma confiabilidade, pois o sistema de eventos do browser em mobile tem comportamento diferente
- **PDFs como documento:** o reconhecimento facial exige uma imagem (jpg/png) — documentos enviados como PDF não podem ser usados para comparação
- **VPN ou IP falso:** o IP registrado no consentimento LGPD pode ser de um proxy
- **Câmera bloqueada:** se o aluno negar permissão de câmera, o sistema não consegue operar — isso deve ser tratado com orientação prévia ao aluno