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 exemple get_post_meta()
). En cas de doute, désinfectez-vous - cela ne peut pas faire de mal.