Par défaut, WordPress applique des tests sécuritaires aux URL téléchargées pour les flux RSS par exemple. Cela est une très bonne chose d’un point de vue de la sécurité. Une des conséquences de ces tests, c’est que les adresses URL pointant vers des IP locales sont bloquées au téléchargement. Pour les flux RSS cela peut être pénalisant.

Description de la situation

Tout d’abord, assurez-vous que le module XML de PHP (exemple php7.0-xml) est installé et chargé, car il est nécessaire au traitement des flux RSS. Notamment le message d’erreur « Une erreur est survenue, le flux est probablement indisponible. Veuillez réessayer plus tard. » signifie un échec total de téléchargement qui peut être du au manque de XML pour PHP.

Le problème se produit par exemple avec ce fichier /etc/hosts suivant qui permet de forcer l’accès par l’interface interne à un un site hébergé localement. Cela ne pose pas le moindre problème à Apache du moment que le VirtualHost est compatible avec de multiple IP comme ceci : <VirtualHost *:80> .

En essayant d’ajouter l’adresse http://www.site-heberge-localement.fr/feed/ dans le widget WordPress, on rencontrera le message d’erreur suivant : « A valid URL was not provided. » ou en Français « L’URL fournie n’est pas valide.« . On pourrait croire que WordPress ne respecte pas le fichiers hosts alors que si, il bloque juste les IP locales.

Lever l’interdiction de télécharger du contenu local

Le code responsable de ce blocage est dans wp-includes/class-http.php, ligne 253 à 255 et plus précisément la ligne $url = wp_http_validate_url( $url ); . Le fait de commenter cette ligne bypassera les contrôles de sécurité et permettra de récupérer le flux RSS. Mais ce n’est pas une bonne solution.

Plus précisément dans wp-includes/http.php ligne 743 (ou 606 selon votre version) on remarque que les hôtes locaux sont refusés « sauf si expressément autorisés ».

Une bonne solution serait d’injecter une whitelist dans WordPress afin de ne pas contrôler sévèrement les hôtes connus.

Bingo, c’est à priori ici, qu’on va pouvoir agir, ligne 584. Dans l’idéal il faudrait surcharger la  méthode allowed_http_request_hosts()  dans le fichier functions.php du thème.

On peut ajouter par exemple dans cette fonction les lignes suivants avant l’instruction return.

La bonne manière : modification des filters WordPress

Plutôt que de modifier le code de /wp-includes/http.conf je vous propose de regarder simplement /wp-includes/default-filters.php. On y trouve la ligne :

Cela ouvre la voie à une customisation via le fichier functions.php du thème. Dans /wp-content/themes/custom-theme/functions.php :

Voilà enfin une modification qui survivra aux mises à jour de WordPress !

Liens en rapport

 

Une fonctionnalité connexe de WordPress et qui a trait à la sécurité, c’est le blocage des téléchargements externes dans wp-config.php  avec le paramètre  WP_HTTP_BLOCK_EXTERNAL  et de spécifier une whitelist avec le paramètre WP_ACCESSIBLE_HOSTS . Exemple dans wp-config.php

Mais nous avons vu dans le code plus haut que cela ne corrigera pas le blocage des IP internes.