J'ai reçu un rapport de vulnérabilité (1) qui semble impliquer qu'il peut y avoir un problème de sécurité dans la façon dont Wordpress gère les URL avec les tildes suivants. Il semble que le scanner pense que le site Web propose des listes de répertoires, etc.
J'ai été surpris que mon site Web diffuse toujours du contenu sur ces différentes URL, j'ai donc fait un test en installant une instance WP totalement vide, je suis passé aux permaliens "Post name" et j'ai confirmé que oui, toute URL avec un tilde ajouté est toujours interprétée comme l'URL sans le tilde.
En effet, une URL comme celle-ci:
https://mywordpresssite.com/my-permalink
Est également accessible avec les URL suivantes:
https://mywordpresssite.com/my-permalink~
https://mywordpresssite.com/my-permalink~/
https://mywordpresssite.com/my-permalink~~~~~~
J'ai fouillé un peu pour voir où WP analyse les permaliens, et je l'ai retrouvé class-wp.php
dans la parse_request
méthode, mais je n'ai pas pu aller beaucoup plus loin.
Ma question est de savoir si c'est un comportement prévu pour WP, et si oui, y a-t-il un moyen de désactiver cela pour que les tildes ne correspondent pas? Pourquoi WP interpréterait-il les URL avec des tildes comme une URL sans eux?
(1) Oui, maintenant nous avons tous vu quelques hacks et fuites de données majeurs au Royaume-Uni, c'est à ce moment-là que les gars de la "sécurité" prétendent tous faire leur part en nous remettant aux développeurs des rapports d'analyse de 200 pages. plein de faux positifs et de problèmes génériques dont ils ne savent rien dans l'attente si nous lisons et agissons sur ledit rapport, rien de mauvais ne se produira jamais.
la source
sanitize_title
, mais comme il est filtrable, il n'est pas possible d'écrire une solution toujours valide. Je suis donc devenu spécifique.Oui, comme déjà expliqué,
WP_Query::get_posts()
utilisesanitize_title_for_query()
( qui utilisesanitize_title()
) pour assainir le nom de poste d'un poste singulier.En bref, après le passage du nom de poste
sanitize_title_for_query()
,my-permalink === my-permalink~~~
commesanitize_title_for_query()
supprime la fin~~~
. Vous pouvez tester cela en procédant comme suit:Ce n'est pas quelque chose que vous pouvez désactiver. Il existe un filtre
sanitize_title()
appelésanitize_title
que vous pouvez utiliser pour modifier le comportement desanitize_title()
, mais ce n'est presque toujours pas une très bonne idée. L'injection SQL est très grave, donc laisser quelque chose glisser entre les mailles du filet en raison d'un mauvais assainissement peut avoir une très mauvaise influence sur l'intégrité de votre site. "Un assainissement excessif" peut parfois être une douleur dans le cul.Je ne suis pas sûr de ce que vous recherchez, mais je pense que vous voudrez peut-être 404 messages uniques avec ces tilde de fin, selon vos mots, "éteignez-le". La seule façon à laquelle je peux penser à ce stade est d'arrêter la requête principale lorsque nous avons ces tildes de fin. Pour cela, nous pouvons filtrer la
posts_where
clause de la requête principale.LE FILTRE
Remarque: Je n'ai considéré que les messages singuliers normaux, et non les premières pages ou les pièces jointes statiques, vous pouvez étendre le filtre pour l'incorporer
QUELQUES NOTES
Le filtre ci-dessus renverra une page 404 lorsque nous aurons une URL comme
https://mywordpresssite.com/my-permalink~~~~~~
. Vous pouvez cependant, en supprimantremove_action( 'template_redirect', 'redirect_canonical' );
du filtre, faire rediriger automatiquement la requête vershttps://mywordpresssite.com/my-permalink
et afficher la publication unique en raison deredirect_canonical()
laquelle est accrochée àtemplate_redirect
qui gère la redirection des 404 générés par WordPressla source
Oui, il semble étrange que nous ayons le même match pour:
et par exemple
Pourquoi cela est possible, semble être cette partie de la
WP_Query::get_posts()
méthode:où
sanitize_title_for_query()
est défini comme:Il devrait être possible de rendre cela plus strict avec le
sanitize_title
filtre, mais ce ne serait peut-être pas une bonne idée de remplacer la sortie par défaut, basée sursanitize_title_with_dashes
, qui est responsable de l'assainissement ici. Vous devriez envisager de créer un ticket au lieu de le modifier, s'il n'y a pas de courant déjà sur ce comportement.Mise à jour
Je me demande si nous pourrions nettoyer le bruit du courant avec le chemin
sanitize_title_for_query()
et rediriger vers l'URL nettoyée si nécessaire?Voici une démo avec laquelle vous pouvez jouer sur votre site de test et l'adapter à vos besoins:
Il pourrait même être préférable d'utiliser
sanitize_title_with_dashes()
directement pour éviter les filtres et remplacer:avec:
ps: Je pense que j'ai appris cette astuce, pour obtenir le chemin actuel avec un vide
add_query_arg( [] )
, de @gmazzap ;-) Ceci est également noté dans le Codex. Merci encore à @gmazzap pour le rappel de l'utilisationesc_url()
lors de l'affichage de la sortieadd_query_arg( [] )
ouesc_url_raw()
lors de la redirection par exemple. Vérifiez également la référence précédente du Codex.la source
add_query_arg
doit donc être échappé avecesc_url
ouesc_url_raw
pour éviter des problèmes de sécurité ...Permettez-moi d'expliquer le traitement d'une demande par WordPress et une méthode pour changer le comportement de WordPress pour atteindre vos objectifs en conséquence.
Analyse de la demande
Lorsque WordPress reçoit une demande, il démarre un processus de dissection de la demande et de la transformer en page. Le cœur de ce processus commence lorsque la méthode de requête principale WordPress
WP::main()
est appelée. Cette fonction analyse la requête, comme vous l'avez correctement identifié, dansparse_request()
(inincludes/class-wp.php
). Là, WordPress essaie de faire correspondre l'URL avec l'une des règles de réécriture . Lorsque l'URL correspond, il crée une chaîne de requête des parties d'URL et code ces parties (tout entre deux barres obliques) à l'aide deurlencode()
, pour empêcher les caractères spéciaux tels que&
de gâcher la chaîne de requête. Ces caractères codés peuvent vous avoir fait penser que le problème résidait là, mais ils sont en fait transformés en leurs "vrais" caractères correspondants lors de l'analyse de la chaîne de requête.Exécution de la requête associée à la demande
Après que WordPress a analysé l'URL, il configure la classe de requête principale
WP_Query
, ce qui se fait selon la mêmemain()
méthode que laWP
classe. Le boeuf deWP_Query
peut être trouvé dans saget_posts()
méthode où tous les arguments de requête sont analysés et nettoyés et la requête SQL réelle est construite (et, éventuellement, exécutée).Dans cette méthode, sur la ligne 2730, le code suivant est exécuté:
Cela désinfecte le message pour le récupérer dans la table des messages. La sortie des informations de débogage à l'intérieur de la boucle montre que c'est là que réside le problème: votre nom de publication,,
my-permalink~
est transformé enmy-permalink
, qui est ensuite utilisé pour récupérer la publication dans la base de données.La fonction de nettoyage du titre du message
La fonction
sanitize_title_for_query
appellesanitize_title
avec les paramètres appropriés, ce qui procède à la désinfection du titre. Maintenant, le cœur de cette fonction applique lesanitize_title
filtre:Ce filtre a, dans WordPress natif, une seule fonction attachée à elle:
sanitize_title_with_dashes
. J'ai écrit un aperçu complet de ce que fait cette fonction, qui peut être trouvé ici . Dans cette fonction, la ligne à l'origine de votre problème estCette ligne supprime tous les caractères à l'exception des caractères alphanumériques, des espaces, des tirets et des traits de soulignement.
Résoudre votre problème
Il existe donc essentiellement une seule façon de résoudre votre problème: supprimer la
sanitize_title_with_dashes
fonction du filtre et la remplacer par votre propre fonction. Ce n'est en fait pas si difficile à faire, mais :Plus important encore : WordPress utilise le résultat de la
sanitize_title
fonction directement dans la requête SQL par cette ligne:Si jamais vous envisagez de changer le filtre, assurez-vous d'avoir correctement échappé le titre avant qu'il ne soit utilisé dans la requête!
Conclusion: la résolution de votre problème n'est pas nécessaire en ce qui concerne la sécurité, mais si vous voulez le faire, remplacez le
sanitize_title_with_dashes
par votre propre fonctionnalité et faites attention à l'échappement SQL.NB tous les noms de fichiers et numéros de ligne correspondent aux fichiers WordPress 4.4.2.
la source
Certaines personnes ont déjà expliqué le problème, je vais donc simplement publier une solution alternative. Devrait être assez explicite.
Vous aurez à faire quelque chose d' un autre bit pour les types de postes hiérarchiques bien, puisque
WP_Query
se déroulera àpagename
traverswp_basename
, puis désinfectez, doncquery_vars['pagename']
etget_query_var('pagename')
ne correspondra pas à des enfants becuase ce dernier ne contiendra pas la partie parent.Je souhaite
redirect_canonical
juste pris soin de cette merde.la source
C'EST LE CORRECTIF ... POUR LE BUG DE WORDPRESS AJOUTEZ JUSTEMENT le bloc de mod de sécurité BEGIN au-dessus du BLOC généré par Wordpress.
la source
Vous pouvez toujours essayer d'ajouter en ajoutant les éléments suivants à votre
.htaccess
fichier:La deuxième ligne ci-dessus doit passer juste sous la première ligne indiquée. Cela devrait empêcher l'
index.php~
affichage dans les URL.la source