Introdução
No desenvolvimento de aplicações web, a segurança dos dados é uma preocupação primordial. Campos livres, onde os usuários podem inserir dados, são pontos vulneráveis para ataques como XSS e SQL Injection. Este artigo abordará como lidar com esses campos de forma segura usando htmlspecialchars()
, htmlentities()
, e prepared statements em PDO.
1. Entendendo os Riscos
- Cross-Site Scripting (XSS): Ataque que permite a execução de scripts maliciosos no navegador do usuário. Gosso modo: usando um campo de texto o atacante bota um Javascript que modifica o comportamento do site no navegador do usuário. Um exemplo prático: Matéria jornalística que conta com campos de comentário –> o atacante insere códigos HTML/Javascript de modos que, ao acessar a página, os novos leitores veem nomes trocados na matéria, são direcionados para outras páginas, veem anúncios que não estão na página oficial etc.
- SQL Injection: Ataque que manipula consultas SQL para executar operações não autorizadas no banco de dados. Grosso modo: caso o campo não seja validado no servidor, é possível inserir comandos SQL que param o comando original, executando outro, possibilitando desde roubo de dados a até a destruição completa do banco. Assim, os usuários de banco de dados criados para a aplicação devem ter as permissões corretas assim como os dados de formulários devem ser tratados antes da execução do comando SQL.
// Dados do formulário
$username = $_POST['username'];
$password = $_POST['password'];
// Consulta SQL para verificar o usuário
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($connection, $sql);
//Atacante insere no campo username:
//' OR '1'='1
//A SQL ficará:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''
//A parte '1'='1' é sempre verdadeira, o que torna toda a condição após o OR verdadeira, ignorando completamente a verificação de senha. Isso faria com que a consulta retornasse todos os registros da tabela users, permitindo que o atacante efetuasse o login sem precisar de uma senha válida.
2. Prevenção de XSS
- Uso de
htmlspecialchars()
- Descrição: Converte caracteres especiais em entidades HTML.
- Quando usar: Ideal para a maioria dos campos de texto onde tags HTML não são necessárias.
- Exemplo de código:phpCopy code
$input = "<script>maliciousCode();</script>"; echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
- Resultado esperado: A tag script será exibida como texto plano, não executável.
- Uso de
htmlentities()
- Descrição: Converte todos os caracteres aplicáveis em entidades HTML.
- Quando usar: Recomendado para textos que podem incluir uma variedade de caracteres especiais, especialmente em aplicações multilíngues.
- Exemplo de código:phpCopy code
$input = "O preço é €25.00 <script>maliciousCode();</script>"; echo htmlentities($input, ENT_QUOTES, 'UTF-8');
- Resultado esperado: Todos os caracteres, incluindo caracteres especiais monetários e tags script, são convertidos para suas respectivas entidades HTML.
3. Prevenção de SQL Injection com PDO
- Prepared Statements
- Descrição: Separa dados de código SQL, permitindo que a aplicação defina os dados a serem usados na consulta de forma segura.
- Vantagens: Prevenção eficaz contra SQL Injection, melhor prática para lidar com dados de entrada em consultas SQL.
- Exemplo de código:phpCopy code
$pdo = new PDO('mysql:host=example.com;dbname=test', 'user', 'password'); $stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)"); $stmt->bindParam(':username', $username); $stmt->bindParam(':email', $email); $stmt->execute();
- Explicação: O exemplo mostra como inserir dados de forma segura em um banco de dados, usando placeholders e vinculação de parâmetros.
Conclusão
Lidar com campos livres requer cuidados para garantir a segurança dos dados e a integridade da aplicação. As técnicas descritas, como htmlspecialchars()
, htmlentities()
, e prepared statements, são essenciais para desenvolvedores PHP que buscam implementar melhores práticas de segurança em suas aplicações web.
Referências
- Documentação oficial do PHP
- OWASP Guidelines
Deixe um comentário