INTRODUÇÃO

Sistema kernel do SCDU

No SCDU, o cabeçalho muda conforme o tipo de arquivo. MODELO 1 é para API/endpoint: ele bloqueia acesso direto quando o arquivo não foi chamado pelo fluxo correto.


MODELO 1
<?php
declare(strict_types=1);

if (!defined('MODO_AUTORIZADO')) {
  http_response_code(403);
  die('403');
}
?>

MODELO 2 é para páginas internas: ele define a entrada autorizada, carrega o init.php e então aplica a Camada de Autenticação do SCDU.

MODELO 2
<?php
declare(strict_types=1);

if (!defined('MODO_AUTORIZADO')) {
  define('MODO_AUTORIZADO', true);
}
?>

A espinha dorsal do SCDU é o init.php, que fica fora da pasta pública. Ele carrega as configurações e as classes do sistema. Considerando que a página welcome.php está em /public_html/scdu/, qual caminho do require_once está correto?

CABEÇALHO 1
<?php
if (!defined('MODO_AUTORIZADO')) { define('MODO_AUTORIZADO', true); }
require_once __DIR__ . '/../../app/env/init.php';
\app\env\Auth_System::guard();
?>

CABEÇALHO 2
<?php
if (!defined('MODO_AUTORIZADO')) { define('MODO_AUTORIZADO', true); }
require_once __DIR__ . '/../app/env/init.php';
\app\env\Auth_System::guard();
?>

INTRODUÇÃO AO AUTH_SYSTEM

No exemplo anterior, é possível ver a Camada de Autenticação do SCDU na linha 4: \app\env\Auth_System::guard(); Para entender como ela funciona, é preciso entender como o SCDU libera ou restringe o acesso a um arquivo ou diretório.

No SCDU, todo cadastro começa com scdu=0. Esse valor significa “pendente”: enquanto o cadastro não for confirmado (por e-mail), o usuário não é considerado membro. Quando o cadastro é confirmado, o sistema altera o nível para scdu=1, que é o nível básico de membro.

No login, o SCDU valida o usuário, busca o nível scdu no banco e grava esse nível na sessão. Antes disso, a sessão antiga (visitante) é destruída. Em logout ou por inatividade, a sessão também é destruída e o navegador volta ao estado de visitante (sessão sem SCDU). Por isso, quando alguém está logado no SCDU, a sessão já contém scdu=1 (membro básico) ou um valor maior (quando o administrador promove).

Com isso, ao entrar em uma área protegida, a Camada de Autenticação \app\env\Auth_System::guard(); verifica se existe uma sessão autenticada. Se não existir sessão válida, o acesso é bloqueado. Se existir sessão válida, o acesso passa a depender do nível mínimo exigido pela área.

Atenção (segurança): scdu=1 não é nível de administração. Níveis administrativos (por exemplo, scdu=7) devem ser reservados e atribuídos somente pelo administrador. Se alguém configurar uma área administrativa como “nível 1”, qualquer membro confirmado poderá acessar essa área.

Barreira extra de login

Mesmo após a Camada de Autenticação \app\env\Auth_System::guard();, o SCDU ainda pode aplicar uma barreira extra: conferir explicitamente se a sessão marca o usuário como logado. Se essa marca não existir, o sistema interrompe a execução e redireciona para o login com a mensagem de sessão expirada.

<?php
// Garante que o usuário esteja logado (barreira extra)
if (!Tools_Session::get('usuario_logado')) {
    header('Location: /tools/lib/login.php?status=error&msg=sessao_expirada');
    exit;
}
?>

Validação defensiva do scdu

Em seguida, o SCDU lê o nível scdu da sessão e valida se ele está dentro da faixa esperada. Essa checagem é “defensiva” porque trata qualquer valor fora do padrão como sinal de sessão inválida ou corrompida. Se o nível estiver fora da faixa (< 0 ou > 8), o SCDU destrói a sessão e força o retorno ao login, evitando que um estado anormal continue navegando pelo sistema.

<?php
$scdu = (int) Tools_Session::get('scdu');

// Segurança defensiva: faixa válida do SCDU
if ($scdu < 0 || $scdu > 8) {
    Tools_Session::destroy();
    header('Location: /tools/lib/login.php?status=error&msg=scdu_invalido');
    exit;
}
?>

Encerramos por aqui: com a autenticação, a barreira extra e a validação defensiva do scdu, a base de segurança fica pronta para o próximo passo (nível mínimo por área, sis_memoria e regras).