Les protocoles SSL/SSH protègent les données qui circulent entre le serveur et le client : SSL/SSH ne protège pas les données une fois dans la base. SSL est un protocole en ligne.
Une fois que le pirate a obtenu l'accès direct à la base de données (en contournant le serveur web), les données sensibles, stockées dans la base sont accessibles directement, à moins que les données de la base ne soient protégées par la base. Chiffrer les données est une bonne solution pour réduire cette menace, mais très peu de bases de données offrent ce type de chiffrement.
Le moyen le plus simple pour contourner ce problème est de créer un logiciel de chiffrement propre, et de l'utiliser dans les scripts PHP. PHP peut aider dans cette tâche grâce aux nombreuses extensions dont il dispose, comme OpenSSL et Sodium, qui connaissent un large éventail de méthodes de chiffrement. Le script PHP va chiffrer les données qui seront stockées, et les déchiffrer lorsqu'elles seront relues. Voir la suite pour des exemples d'utilisation de ce chiffrement.
Dans le cas de données vraiment sensibles, si la représentation originale n'est pas nécessaire (pour affichage, ou comparaison), utiliser un hachage est une bonne solution. L'exemple classique est le stockage de mots de passe dans les bases de données, après les avoir passés par un hachage cryptographique.
Les fonctions password fournissent une bonne façon de hacher les données sensibles et de travailler avec ces empreintes.
La fonction password_hash() est utilisée pour hacher une chaîne donnée en utilisant l'algorithme le plus fort actuellement disponible et la fonction password_verify() vérifie si le mot de passe fourni correspond au hachage stocké en base de données.
Exemple #1 Hacher un champ mot de passe
<?php
// stockage du hash du mot de passe
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username),
password_hash($password, PASSWORD_DEFAULT));
$result = pg_query($connection, $query);
// on vérifie si l'utilisateur a soumis le bon mot de passe
$query = sprintf("SELECT pwd FROM users WHERE name='%s';",
pg_escape_string($username));
$row = pg_fetch_assoc(pg_query($connection, $query));
if ($row && password_verify($password, $row['pwd'])) {
echo 'Bonjour, ' . htmlspecialchars($username) . '!';
} else {
echo 'L\'authentification a échoué pour ' . htmlspecialchars($username) . '.';
}
?>