Alimentant plus de 40% du web, WordPress ouvre des possibilités quasi infinies. Cependant, comme toute plateforme populaire, elle attire les pirates informatiques avec des intentions douteuses. L’une de leurs armes favorites ? L’injection SQL.
SQL et WordPress
Chaque fois qu’un utilisateur interagit avec votre site WordPress, que ce soit lors de son inscription en tant qu’abonné ou lors de la soumission d’un commentaire, une requête SQL est envoyée pour ajouter / modifier des informations dans votre base de données.
Que ce soit pour récupérer des articles de blog, des commentaires, des informations de profil, etc., SQL fait le travail en coulisses. Sans une protection adéquate, ces requêtes pourraient être un point d’entrée pour les attaquants.
Alors, comment se protéger ? La réponse est aussi vieille que le web lui-même : le bon vieux PHP.
Préparer vos Requêtes SQL
Un bon moyen de prévenir l’injection SQL consiste à préparer vos requêtes SQL. En utilisant la méthode prepare()
de l’objet $wpdb
, vous pouvez créer des requêtes SQL sécurisées. Voici comment vous pouvez le faire :
global $wpdb; $id = 10; // Supposons que c'est une variable dynamique $query = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}posts WHERE ID = %d", $id ); $results = $wpdb->get_results( $query );
Dans l’exemple ci-dessus, %d
est un format, qui représente un nombre entier. La méthode prepare()
remplacera ce format par la valeur de $id
après l’avoir nettoyée. Cette technique prévient l’injection SQL en garantissant que tous les paramètres de la requête sont nettoyés avant leur exécution.
Utilisation des Méthodes Sécurisées de $wpdb
L’objet $wpdb
fournit également d’autres méthodes pour effectuer des requêtes SQL de manière sécurisée. Par exemple, pour insérer des données dans la base de données, vous pouvez utiliser la méthode insert()
, qui nettoie automatiquement les données.
global $wpdb; $data = array( 'post_author' => 1, 'post_date' => current_time( 'mysql' ), 'post_content' => 'Hello, world!' ); $wpdb->insert( "{$wpdb->prefix}posts", $data );
Dans l’exemple ci-dessus, la méthode insert()
prend deux paramètres : le nom de la table et un tableau associatif de données à insérer. Les clés du tableau correspondent aux noms des colonnes dans la base de données, et les valeurs correspondent aux données à insérer dans ces colonnes. La méthode insert()
s’occupera du nettoyage des données pour vous.
Éviter les Fuites de données SQL
En respectant les bonnes pratiques suivantes, vous pouvez éviter les vulnérabilités :
- Utilisez toujours des requêtes préparées.
- Vérifiez les données reçues avec les fonctions de validation PHP.
- Mettez régulièrement à jour PHP et WordPress.
Vérification de données avec PHP :
// Définir le filtre $filters = array( "username" => array( "filter"=>FILTER_CALLBACK, "options"=>"ucwords" ), "password" => FILTER_SANITIZE_STRING ); // Utiliser le filtre $input = filter_input_array(INPUT_POST, $filters);
Dans cet exemple, nous avons appliqué le filtre ucwords
sur le username
pour normaliser l’entrée, et FILTER_SANITIZE_STRING
sur le password
pour supprimer les balises HTML.
Ajout de Nonce dans les formulaires pour améliorer la sécurité
Un nonce est un nombre généré de manière aléatoire, qui ne peut être utilisé qu’une seule fois. WordPress propose une fonction pour générer ces nonce, qui peut être utilisée pour améliorer la sécurité des formulaires et des URL.
Lorsque vous créez un formulaire dans WordPress, vous pouvez inclure un champ nonce caché qui sera envoyé avec les autres données du formulaire. Cela vous permet de vérifier le nonce lorsque vous traitez les données du formulaire, pour vous assurer qu’elles proviennent d’une source fiable.
Voici comment vous pouvez utiliser le nonce dans WordPress :
// Création d'un nonce $nonce = wp_create_nonce( 'my_form' ); // Utilisation du nonce dans un formulaire echo '<input name="my_nonce" type="hidden" value="' . $nonce . '" />'; // Vérification du nonce if ( isset( $_POST['my_nonce'] ) && wp_verify_nonce( $_POST['my_nonce'], 'my_form' ) ) { // Traitez les données du formulaire en toute sécurité }
Nettoyage des Entrées Utilisateur
Toute donnée provenant d’un utilisateur doit être considérée comme potentiellement dangereuse. C’est là qu’intervient l’échappement des données.
L’échappement des données consiste à nettoyer les données entrantes pour empêcher l’exécution de code malveillant. WordPress fournit des fonctions pour échapper les données, comme esc_html()
, esc_url()
, et esc_js()
.
Voici un exemple d’utilisation de esc_html()
pour échapper une chaîne de caractères avant de l’afficher :
$unsafe_url = 'javascript:alert("dangerous_code_here");'; // Une URL potentiellement dangereuse $safe_url = esc_url( $unsafe_url ); echo '<a href="' . $safe_url . '">Link</a>'; // Produit : <a>Link</a>
La Vérification des Autorisations
N’oubliez pas que tous les utilisateurs ne sont pas égaux. Certains ont plus de privilèges que d’autres. Avant de permettre à un utilisateur d’exécuter une action, assurez-vous qu’il a le droit de le faire.
WordPress facilite la vérification des autorisations avec la fonction current_user_can()
. Par exemple, pour vous assurer que l’utilisateur actuel peut publier un article, vous pourriez faire ceci :
if ( current_user_can( 'publish_posts' ) ) { // L'utilisateur peut publier des articles, continuez } else { // L'utilisateur ne peut pas publier des articles, arrêtez }
Ces trois astuces supplémentaires, associées à celles mentionnées précédemment, vous permettront de sécuriser efficacement vos requêtes SQL dans WordPress avec PHP.
Limiter les Requêtes SQL Directes
Quand c’est possible, évitez d’écrire des requêtes SQL directes et utilisez à la place les fonctions d’abstraction de base de données de WordPress. Ces fonctions ont été écrites et testées par les développeurs de WordPress, et elles incluent des mesures de sécurité pour prévenir l’injection SQL.
Par exemple, plutôt que d’écrire une requête SQL pour récupérer un article par son ID, vous pouvez utiliser la fonction get_post()
:
$post = get_post( $post_id );
C’est plus sûr et plus facile à lire que la requête SQL équivalente. En utilisant les fonctions d’abstraction de base de données de WordPress, vous pouvez écrire un code plus sûr et plus propre.