La seguretat en bases de dades és un aspecte crític en el desenvolupament d'aplicacions web. Una base de dades insegura pot ser vulnerable a atacs que poden comprometre la integritat, confidencialitat i disponibilitat de les dades. En aquest tema, explorarem diverses tècniques i millors pràctiques per assegurar les bases de dades en aplicacions PHP.

Conceptes Clau

  1. Injecció SQL: Un dels atacs més comuns contra bases de dades. Consisteix en inserir codi SQL maliciós a través de les entrades de l'usuari.
  2. Autenticació i Autorització: Assegurar que només els usuaris autoritzats puguin accedir a la base de dades i realitzar operacions específiques.
  3. Xifrat de Dades: Protegir les dades sensibles mitjançant tècniques de xifrat.
  4. Còpies de Seguretat: Realitzar còpies de seguretat regulars per prevenir la pèrdua de dades.
  5. Auditoria i Monitoratge: Supervisar l'activitat de la base de dades per detectar i respondre a activitats sospitoses.

Injecció SQL

Què és la Injecció SQL?

La injecció SQL és una tècnica d'atac en la qual un atacant pot executar codi SQL arbitrari en la base de dades de l'aplicació. Això es fa manipulant les entrades de l'usuari per alterar les consultes SQL.

Exemple d'Injecció SQL

<?php
// Exemple vulnerable a injecció SQL
$username = $_POST['username'];
$password = $_POST['password'];

$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
?>

En aquest exemple, un atacant podria introduir admin' -- com a nom d'usuari i qualsevol cosa com a contrasenya per accedir com a administrador.

Prevenció de la Injecció SQL

Ús de Sentències Preparades

Les sentències preparades són una manera segura de gestionar les consultes SQL, ja que separen el codi SQL de les dades de l'usuari.

<?php
// Exemple segur amb sentències preparades
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
?>

Ús de PDO

PDO (PHP Data Objects) és una extensió que proporciona una interfície consistent per accedir a bases de dades en PHP.

<?php
// Exemple segur amb PDO
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(['username' => $username, 'password' => $password]);
$result = $stmt->fetch();
?>

Autenticació i Autorització

Autenticació

L'autenticació és el procés de verificar la identitat d'un usuari. Això es fa normalment mitjançant noms d'usuari i contrasenyes.

Autorització

L'autorització determina quines accions pot realitzar un usuari autenticat. Això es pot gestionar mitjançant rols i permisos.

<?php
// Exemple de verificació de rol
if ($user_role == 'admin') {
    // Permetre accés a funcionalitats d'administrador
} else {
    // Denegar accés
}
?>

Xifrat de Dades

Xifrat de Contrasenyes

Les contrasenyes han de ser xifrades abans de ser emmagatzemades a la base de dades. PHP proporciona la funció password_hash per a aquest propòsit.

<?php
// Xifrar una contrasenya
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// Verificar una contrasenya
if (password_verify($password, $hashed_password)) {
    // Contrasenya correcta
} else {
    // Contrasenya incorrecta
}
?>

Xifrat de Dades Sensibles

Les dades sensibles, com ara números de targetes de crèdit, també han de ser xifrades.

<?php
// Xifrar dades
$encrypted_data = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, 0, $iv);

// Desxifrar dades
$decrypted_data = openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv);
?>

Còpies de Seguretat

Realitzar còpies de seguretat regulars és essencial per prevenir la pèrdua de dades. Les còpies de seguretat han de ser emmagatzemades en ubicacions segures i han de ser provades regularment per assegurar la seva integritat.

Auditoria i Monitoratge

Auditoria

L'auditoria implica registrar les accions realitzades a la base de dades per poder revisar-les posteriorment.

Monitoratge

El monitoratge implica supervisar l'activitat de la base de dades en temps real per detectar i respondre a activitats sospitoses.

Exercicis Pràctics

Exercici 1: Prevenir Injecció SQL

Modifica el següent codi per prevenir la injecció SQL utilitzant sentències preparades.

<?php
$username = $_POST['username'];
$password = $_POST['password'];

$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
?>

Solució

<?php
$username = $_POST['username'];
$password = $_POST['password'];

$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
?>

Exercici 2: Xifrar Contrasenyes

Escriu un codi que xifri una contrasenya abans d'emmagatzemar-la a la base de dades i que la verifiqui durant l'inici de sessió.

Solució

<?php
// Xifrar una contrasenya
$password = $_POST['password'];
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// Emmagatzemar $hashed_password a la base de dades

// Verificar una contrasenya durant l'inici de sessió
$input_password = $_POST['password'];
if (password_verify($input_password, $hashed_password)) {
    // Contrasenya correcta
} else {
    // Contrasenya incorrecta
}
?>

Conclusió

La seguretat en bases de dades és fonamental per protegir les dades sensibles i mantenir la integritat de les aplicacions web. Mitjançant la implementació de tècniques com l'ús de sentències preparades, l'autenticació i autorització adequades, el xifrat de dades i la realització de còpies de seguretat regulars, podem reduir significativament els riscos de seguretat. A més, l'auditoria i el monitoratge continuat ens ajuden a detectar i respondre a activitats sospitoses de manera oportuna.

Curs de Programació PHP

Mòdul 1: Introducció a PHP

Mòdul 2: Estructures de Control

Mòdul 3: Funcions

Mòdul 4: Arrays

Mòdul 5: Treballant amb Formularis

Mòdul 6: Treballant amb Fitxers

Mòdul 7: Programació Orientada a Objectes (OOP)

Mòdul 8: Treballant amb Bases de Dades

Mòdul 9: Tècniques Avançades de PHP

Mòdul 10: Frameworks PHP i Millors Pràctiques

Mòdul 11: Projecte: Construint una Aplicació Web

© Copyright 2024. Tots els drets reservats