Le WordPress d'aujourd'hui, décodé pour les développeurs

Sécurité

Des constantes de classe typées PHP 8.3 pour figer une configuration de sécurité sensible

PHP 8.3 permet de typer les constantes de classe. Une fonctionnalité discrète, utile pour éviter qu'une valeur de configuration sensible ne dérive silencieusement.

Par WordPress Développement • 22 juillet 2024 • 4 min de lecture • Aucun commentaire
Des constantes de classe typées PHP 8.3 pour figer une configuration de sécurité sensible
class ConfigSecurite {
    public const int DUREE_VIE_JETON_SECONDES = 3600;
}

Cette ligne, syntaxiquement invalide avant PHP 8.3, devient possible depuis la sortie de cette version en novembre 2023 : les constantes de classe peuvent désormais porter une déclaration de type, exactement comme une propriété typée. La fonctionnalité reste discrète dans les notes de version, loin derrière des ajouts plus visibles comme les classes en lecture seule imbriquées, mais elle rend un service précis à tout code qui expose des constantes de configuration sensibles.

Sur un projet WordPress, ces constantes de classe apparaissent fréquemment pour figer des paramètres liés à la sécurité : durée de vie d’un jeton d’API maison, seuil de tentatives de connexion avant blocage, taille maximale d’un fichier accepté en upload. Une valeur incohérente injectée par erreur dans l’une de ces constantes peut avoir des conséquences directes — un seuil de tentatives qui devient une chaîne au lieu d’un entier peut, selon la logique de comparaison utilisée, ne plus jamais déclencher de blocage.

Le problème sans typage

Avant PHP 8.3, rien n’empêchait une classe fille de redéfinir une constante héritée avec un type différent :

class ConfigSecuriteBase {
    public const DUREE_VIE_JETON_SECONDES = 3600;
}

class ConfigSecuriteEtendue extends ConfigSecuriteBase {
    public const DUREE_VIE_JETON_SECONDES = '3600 secondes'; // Aucune erreur ici
}

Ce type d’erreur ne se manifeste souvent que loin de sa source : une comparaison arithmétique qui échoue silencieusement, une fonction qui attend un entier et reçoit une chaîne convertie de façon inattendue par la coercition de type faible de PHP.

Ce que le typage change concrètement

L'essentiel à retenir : Une constante non typée peut être redéfinie avec un type incohérent dans une classe fille ; Le typage échoue au chargement, pas en cours d'exécution ; Utile pour des durées de vie de jeton ou des seuils de tentative

Avec une constante typée, toute tentative de redéfinition incohérente échoue immédiatement au chargement de la classe, avec une erreur explicite plutôt qu’un comportement silencieusement incorrect à l’exécution :

class ConfigSecuriteBase {
    public const int DUREE_VIE_JETON_SECONDES = 3600;
}

class ConfigSecuriteEtendue extends ConfigSecuriteBase {
    public const string DUREE_VIE_JETON_SECONDES = '3600'; // Erreur fatale au chargement
}

PHP refuse ici de charger la classe fille, avec un message signalant l’incompatibilité de type entre la constante parente et sa redéfinition. L’erreur remonte immédiatement, au moment le plus proche possible de sa cause réelle, plutôt que de se manifester bien plus tard sous une forme difficile à relier à son origine.

Application à un cas concret : seuils de tentatives de connexion

final class PolitiqueConnexion {
    public const int MAX_TENTATIVES = 5;
    public const int FENETRE_SECONDES = 900;
    public const bool NOTIFIER_ADMINISTRATEUR = true;
}

add_action( 'wp_login_failed', function ( string $login ) {
    $tentatives = (int) get_transient( 'tentatives_' . $login );
    $tentatives++;
    set_transient( 'tentatives_' . $login, $tentatives, PolitiqueConnexion::FENETRE_SECONDES );

    if ( $tentatives >= PolitiqueConnexion::MAX_TENTATIVES && PolitiqueConnexion::NOTIFIER_ADMINISTRATEUR ) {
        mon_plugin_notifier_administrateur( $login );
    }
} );

Déclarer ces trois constantes avec un type explicite garantit qu’aucune extension du projet, aucun thème enfant qui manipulerait ces valeurs par héritage, ne puisse introduire une incohérence de type qui passerait inaperçue jusqu’à l’exécution.

Ce que le typage ne protège pas

  • Une valeur du bon type mais incohérente sur le fond (un seuil de zéro tentative, par exemple) reste possible
  • Le typage ne remplace pas une validation métier des valeurs autorisées
  • La fonctionnalité nécessite PHP 8.3 minimum, ce qui exclut encore une partie du parc d’hébergement WordPress à la date de cet article

Un contrôle complémentaire, pour les seuils critiques, reste donc pertinent même avec des constantes typées :

if ( PolitiqueConnexion::MAX_TENTATIVES < 1 ) {
    throw new LogicException( 'Le seuil de tentatives doit être positif.' );
}

En résumé

Les constantes de classe typées de PHP 8.3 ne changent rien à la logique métier d’une politique de sécurité, mais elles ferment une catégorie d’erreurs silencieuses liées à une redéfinition incohérente par héritage. Pour tout projet qui expose des constantes de configuration sensibles — durées, seuils, indicateurs booléens — et qui tourne déjà sur PHP 8.3, ce typage coûte une ligne de code et referme une source d’incidents difficile à diagnostiquer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi