Je veux m'assurer que toutes les données de mes plugins / thèmes sont traitées en toute sécurité avant d'entrer dans la base de données et avant d'être sorties vers le navigateur. Mon problème est qu'il y a des situations où l'API gère la désinfection pour vous - comme lors de l'enregistrement de post-méta-champs - et d'autres où l'auteur du plugin / thème est entièrement responsable de le faire - comme lors de l'enregistrement des paramètres personnalisés.
Pour la portée de cette question, je ne suis pas préoccupé par la validation des données au niveau du domaine - par exemple, vérifier qu'un champ Age sur un formulaire est compris entre 0 et 120, ou qu'une adresse e-mail est valide. Je ne suis préoccupé que par la sécurité - par exemple, échapper aux requêtes SQL pour éviter l'injection SQL lors de l'enregistrement dans la base de données, ou nettoyer les données qui sont sorties vers des modèles HTML pour éviter XSS.
Pour le filtrage de sortie, je sais que vous devez toujours utiliser des fonctions comme esc_html()
et esc_attr()
lors de l'écho des variables dans les modèles HTML. Mais qu'en est-il lorsque vous utilisez des balises de modèle ? Désinfectent-ils tous déjà la sortie? Si oui, pour quel contexte (HTML général, attributs de balise, etc.)? Certaines fonctions ont des variantes pour différents contextes (comme the_title_attribute()
, mais la plupart n'en ont pas.
Pour le filtrage des entrées, je sais que je dois utiliser $wpdb->prepare()
pour effectuer des requêtes manuelles, mais qu'en est-il lorsque vous utilisez l'API Settings pour créer une page de paramètres de plug-in ou que vous enregistrez des champs de métadonnées pour un type de publication personnalisé?
En ce moment, je viens de creuser dans Core et de lire des tutoriels chaque fois que j'utilise une fonction pour savoir si elle est désinfectée ou non, mais c'est source d'erreurs et de temps. J'espère trouver une sorte de liste complète de toutes les situations possibles et si oui ou non l'API la gère. par exemple,
L'API valide / désinfecte
- Enregistrement de la méta-publication avec
update_postmeta()
- Enregistrement de la méta utilisateur avec
update_user_meta()
- Sortie d'un titre de poste - utilisez la variante contextuellement appropriée de
the_title()
- etc
Vous devez valider / désinfecter manuellement
- Enregistrement des options de plug-in avec l'API Paramètres. Passez un rappel comme 3e paramètre de
register_setting()
. - Requêtes de base de données directes: encapsulez la requête
$wpdb->prepare()
. - Sortie de variables en HTML. Utilisation
esc_attr()
,esc_html()
etc. - etc
Je serais également intéressé de comprendre pourquoi l'API le fournit dans certaines situations, mais pas dans d'autres. Je suppose que cela a quelque chose à voir avec la nature inconnue des données, mais j'aimerais entendre une explication approfondie.
the_title()
,the_permalink()
etc.), tout va bien, mais pas avec des données personnalisées (par exempleget_post_meta()
). En cas de doute, désinfectez-vous - cela ne peut pas faire de mal.Réponses:
Il y a deux concepts ici:
La validation est, presque universellement, uniquement à vous . Vous savez quelles données vous demandez à un utilisateur, et vous savez quelles données vous attendez - WordPress ne le fait pas. La validation serait effectuée, par exemple, sur le
save_post
hook avant de l'enregistrer dans la base de données avecupdate_post_meta
, ou elle pourrait être effectuée en spécifiant une fonction de rappel dans l'API Settings, appelée juste avant que WordPress enregistre les données.La désinfection est un peu plus mitigée. Lorsque vous traitez des données que WordPress connaît nativement (par exemple, la vignette d'une publication), vous pouvez être sûr que WordPress a déjà sécurisé les données. Cependant, «sûr» dépend du contexte; ce qui est sûr pour une utilisation sur une page, n'est pas nécessairement sûr comme attribut d'élément. Par conséquent WordPress aura différentes fonctions pour contexte différent (par exemple
the_title()
,the_title_rss()
,the_title_attribute()
) - donc vous devez utiliser le bon .Dans la plupart des cas, votre plug-in peut traiter des post-méta - ou peut-être des données d'événement d'une table personnalisée. WordPress ne sait pas ce que sont ces données ni à quoi elles servent, donc il ne sait certainement pas comment les sécuriser. Cela dépend de vous . Ceci est particulièrement important dans l' utilisation
esc_url()
,esc_attr()
,esc_textarea()
etc pour empêcher l' entrée malveillante d'être en mesure de le code d' intégration. Étant donné que WordPress saitnext_posts()
est supposé imprimer une URL sur la page, cela s'appliqueesc_url()
- mais avec la méta-publication, disons, il ne sait pas qu'il stocke une URL - ou ce que vous voulez en faire (en cas d'impression,esc_url()
en cas de redirection)esc_url_raw()
. Si vous êtes dans le dobut - faites preuve de prudence et échappez-vous vous - même - et faites-le le plus tard possible.Enfin - qu'en est-il de l'enregistrement des données? Devez-vous alors le sécuriser? Comme il est mentionné que vous avez besoin de rendre les données sûr est valide. Mais si vous utilisez l'API WordPress (
wp_insert_post()
,update_post_meta()
etc.), vous n'avez pas besoin de nettoyer les données - car lors de l'enregistrement des données, le seul nettoyage que vous devez faire est d'échapper aux instructions SQL - et WordPress le fait. Si vous exécutez des instructions SQL directes (par exemple, pour lire / écrire des données à partir d'une table personnalisée), vous devez utiliser la$wpdb
classe pour vous aider à nettoyer vos requêtes.J'ai écrit ce billet de blog sur le nettoyage et la validation des données qui pourrait vous être utile - j'y parle de ce que l'on attend de vous à cet égard.
la source
Je ne suis pas sûr que ce soit aussi complet, mais avec n'importe quel plugin ou thème, l'entrée utilisateur doit être nettoyée. Les opérations de base de données doivent être effectuées à l'aide des méthodes $ wpdb->. Toutes les données $ _GET et $ _POST doivent être nettoyées.
C'est plus une meilleure pratique pour la programmation PHP que WordPress.
Donc, en conclusion, s'il existe une fonction WordPress, utilisez-la, sinon, désinfectez vous-même vos variables et vos entrées.
Si j'étais trop vague, veuillez poser une question plus précise.
la source
update_user_meta()
se passer à traversstripslashes_deep()
etsanitize_meta()
dansupdate_metadata()
, puis$wpdb->prepare()
en$wpdb->update()
. Donc, je ne pense pas que vous ayez besoin de le désinfecter. Suis-je en train de manquer quelque chose?