DEV Community

Rui Trigo
Rui Trigo

Posted on

Validação e Sanitização em Aplicações Web


O Que São e Por Que São Cruciais?

A validação e sanitização são, sem sombra de dúvida, um dos pilares da segurança em aplicações web. Enquanto a validação verifica se os dados recebidos estão no formato esperado, a sanitização limpa e transforma esses dados para garantir que são seguros para processamento.

Validação

Por um lado, a validação é como um porteiro rigoroso que verifica se tens bilhete antes de entrar no espetáculo. Verifica o tipo, o formato e o conteúdo dos dados recebidos. Vejamos um exemplo de código vulnerável sem validação:

$idade = $_POST['idade'];
$query = "SELECT * FROM utilizadores WHERE idade = $idade";
Enter fullscreen mode Exit fullscreen mode

Este código é um convite aberto a ataques de injeção SQL, pois o input pode facilmente manipular o comportamento da query. Em vez disso, deverias fazer algo como:

$idade = filter_var($_POST['idade'], FILTER_VALIDATE_INT);
if ($idade === false || $idade === null) {
    echo("Idade inválida");
}

// Cria uma conexão
$conn = new mysqli($servername, $username, $password, $dbname);

// Executa um Prepared Statement
$stmt = $conn->prepare("INSERT INTO utilizadores (idade) VALUES (?)");
$stmt->bind_param("i", $idade);
Enter fullscreen mode Exit fullscreen mode

PHP Wiki | filter_var() — Filters a variable with a specified filter

Sanitização

Por outro lado, a sanitização é como um filtro de água que remove impurezas. Transforma dados potencialmente perigosos em formatos seguros. Vejamos outro exemplo vulnerável:

$nome = $_GET['nome'];
echo "Olá, $nome!";
Enter fullscreen mode Exit fullscreen mode

Este código pode levar a um ataque XSS. Uma versão sanitizada seria:

$nome = htmlspecialchars($_GET['nome']);
echo "Olá, $nome!";
Enter fullscreen mode Exit fullscreen mode

O efeito esperado é a conversão dos caracteres "&, ', ", <, >" para o seu equivalente em HTML ENTITIES, ou seja, eles tornam-se meramente símbolos visuais sem efeito algum em termos de código interpretado pelo browser.

PHP Wiki | htmlspecialchars() — Convert special characters to HTML entities

Validação do Lado do Cliente

É importante notar que, embora a validação do lado do cliente seja útil para melhorar a experiência do utilizador, nunca é suficiente para garantir a segurança. Afinal de contas, um atacante pode facilmente contornar essas verificações. Por isso, a validação do lado do servidor é imprescindível.

Desta maneira, nem toda a sanitização é igual. Dependendo do contexto onde os dados serão utilizados, diferentes técnicas devem ser aplicadas. Por exemplo, dados que serão inseridos numa base de dados SQL requerem uma sanitização diferente daqueles que serão exibidos numa página HTML.

Não Reinventes a Roda

Felizmente, não precisas de criar todas estas proteções do zero. Existem inúmeras bibliotecas e frameworks que oferecem funções robustas de validação e sanitização. Contudo, é crucial compreender como funcionam para as utilizar corretamente.

Por fim, mas não menos importante, realizar "pentests" regularmente é fundamental. Estes testes simulam ataques reais e podem revelar falhas que passaram despercebidas. Lembra-te: é melhor descobrires as vulnerabilidades antes dos atacantes. Se tens iniciativa de o fazer, podes começar por listar a tua empresa numa plataforma Bug Bounty, onde hackers éticos reportam falhas na tua aplicação em troca de remuneração.

Top comments (0)