• Bonjour,

    Comme je vous l’ai écrit sur votre Slack il y a 4 jours sans réponse, je vous écris au sujet d’un bug critique dans votre plugin Stancer for WooCommerce, reproduit sur mon site suite à des tentatives de commandes avortées (paiements non finalisés, commandes restées en statut “Draft”).

    Environnement

    • Plugin Stancer for WooCommerce version 1.4.3
    • WooCommerce version 10.8.1 |
    • WordPress version 7.0
    • PHP version 8.3.30

    Description du problème

    Lorsqu’une commande WooCommerce est créée mais que le paiement Stancer n’est pas finalisé (commande en statut Draft, sans payment_id associé), l’ouverture de cette commande depuis l’interface d’administration WordPress génère une erreur PHP fatale qui rend la page inaccessible.

    Erreur exacte dans le log de debug

    PHP Fatal error: Uncaught Error: Typed property WC_Stancer_Payment::$payment_id must not be accessed before initialization in .../plugins/stancer/includes/class-stancer-abstract-table.php:108
    Stack trace:
    #0 .../plugins/stancer/includes/class-stancer-capture.php(84): WC_Stancer_Abstract_Table->__get()
    #1 .../plugins/stancer/includes/class-stancer.php(70): WC_Stancer_Capture->__construct()
    #2 .../wp-includes/class-wp-hook.php(341): WC_Stancer->call_capture()
    ...

    Cause identifiée

    La propriété typée $payment_id dans WC_Stancer_Payment est accédée via __get() dans class-stancer-abstract-table.php (ligne 108) avant d’avoir été initialisée. Cela se produit lorsque WC_Stancer_Capture->__construct() est appelé depuis WC_Stancer->call_capture() sur une commande ne disposant d’aucun paiement Stancer enregistré.

    En PHP 8+, accéder à une propriété typée non initialisée lève une Error fatale, contrairement à PHP 7 qui retournait simplement null.

    Correction suggérée

    Ajouter une vérification d’initialisation avant l’accès à $payment_id, par exemple dans class-stancer-abstract-table.php :

    // Avant
    return $this->payment_id;
    
    // Après
    return isset($this->payment_id) ? $this->payment_id : null;

    Ou, de manière équivalente, initialiser la propriété à null dans sa déclaration :

    protected ?string $payment_id = null;

    J’ai remarqué ce bug suite à de potentielles attaques et tentatives de carding.

    En effet, j’ai vu ça en voyant qu’il y avait plusieurs commandes WooCommerce apparues dans la catégorie “Draft”.

    Et en cliquant pour voir le détail des commandes ça me génère des erreurs critiques et affiche un message comme celui que j’envoie en capture et qui donne par exemple :
    “Order #82984 details
    Payment via Stancer. Customer IP: 216.244.66.239
    There has been a critical error on this website. Please check your site admin email inbox for instructions. If you continue to have problems, please try the support forums.
    Learn more about troubleshooting WordPress.”

    Ces commandes ont toutes étés faites à quelques heures d’intervalle avec des adresses IP différentes :
    216.244.66.239(Tukwila Washington United States)
    104.194.192.137 (Ashburn Virginia United States)
    52.70.123.241 (Ashburn Virginia United States)
    85.208.96.210 (Ashburn Virginia United States)
    85.208.96.198 (Ashburn Virginia United States)
    216.73.216.174 (Columbus Ohio United States)
    82.38.231.40 (St Helens United Kingdom)

    Ce bug impacte directement l’administration du site : toute commande dans un état incomplet “Draft” (paiement abandonné, timeout, tentative échouée) rend la page de détail de commande inaccessible dans WordPress.

    Merci de prendre en compte ce rapport et de publier un correctif dans une prochaine version du plugin.

    Cordialement,

    Jabe.

    • This topic was modified 1 day, 3 hours ago by Jabe.

You must be logged in to reply to this topic.