domingo, 22 de dezembro de 2024

PHP - Evitar injeções de SQL

Para fazer operações de banco de dados em PHP de forma segura e evitar injeções de SQL, você deve usar declarações preparadas (prepared statements) fornecidas pela extensão PDO (PHP Data Objects) ou MySQLi. Ambas as extensões fornecem uma maneira segura de lidar com consultas SQL, evitando a injeção de SQL ao separar a lógica da consulta dos dados de entrada.

Usando PDO

Conexão ao Banco de Dados

php
<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=nome_do_banco', 'usuario', 'senha');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Erro: ' . $e->getMessage();
}
?>

INSERT

php
<?php
$stmt = $pdo->prepare("INSERT INTO tabela (coluna1, coluna2) VALUES (:valor1, :valor2)");
$stmt->execute(['valor1' => $valor1, 'valor2' => $valor2]);
?>

SELECT

php
<?php
$stmt = $pdo->prepare("SELECT * FROM tabela WHERE coluna = :valor");
$stmt->execute(['valor' => $valor]);
$resultado = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

UPDATE

php
<?php
$stmt = $pdo->prepare("UPDATE tabela SET coluna1 = :valor1 WHERE coluna2 = :valor2");
$stmt->execute(['valor1' => $novo_valor1, 'valor2' => $valor2]);
?>

DELETE

php
<?php
$stmt = $pdo->prepare("DELETE FROM tabela WHERE coluna = :valor");
$stmt->execute(['valor' => $valor]);
?>

Usando MySQLi

Conexão ao Banco de Dados

php
<?php
$mysqli = new mysqli("localhost", "usuario", "senha", "nome_do_banco");

if ($mysqli->connect_error) {
    die("Conexão falhou: " . $mysqli->connect_error);
}
?>

INSERT

php
<?php
$stmt = $mysqli->prepare("INSERT INTO tabela (coluna1, coluna2) VALUES (?, ?)");
$stmt->bind_param("ss", $valor1, $valor2);
$stmt->execute();
$stmt->close();
?>

SELECT

php
<?php
$stmt = $mysqli->prepare("SELECT * FROM tabela WHERE coluna = ?");
$stmt->bind_param("s", $valor);
$stmt->execute();
$resultado = $stmt->get_result();
$dados = $resultado->fetch_all(MYSQLI_ASSOC);
$stmt->close();
?>

UPDATE

php
<?php
$stmt = $mysqli->prepare("UPDATE tabela SET coluna1 = ? WHERE coluna2 = ?");
$stmt->bind_param("ss", $novo_valor1, $valor2);
$stmt->execute();
$stmt->close();
?>

DELETE

php
<?php
$stmt = $mysqli->prepare("DELETE FROM tabela WHERE coluna = ?");
$stmt->bind_param("s", $valor);
$stmt->execute();
$stmt->close();
?>

Importância das Declarações Preparadas

  • Segurança: Separar os dados da lógica da consulta impede a injeção de SQL, uma das vulnerabilidades mais comuns e perigosas.

  • Reutilização: Declarações preparadas podem ser reutilizadas com diferentes conjuntos de dados, aumentando a eficiência.

  • Leitura: Torna o código mais legível e mantém a estrutura SQL clara.


OBSERVAÇÕES IMPORTANTES:

Vale lembrar que os exemplos citados acima, são utilizadas apenas para uso didático. Cada desenvolvedor deve ser responsável em aplicar medidas de segurança para evitar ataques de injeção de SQL ou de outro tipo em seu sistema.

Nenhum comentário:

Postar um comentário