web-dev-qa-db-fra.com

Dans quels contextes les plugins sont-ils responsables de la validation/désinfection des données?

Je veux m'assurer que toutes les données de mes plugins/thèmes sont traitées de manière sécurisée avant d'entrer dans la base de données et avant d'être envoyées au navigateur. Mon problème est qu’il existe des situations dans lesquelles l’API gère la désinfection pour vous - comme lors de la sauvegarde de méta-champs de publication - et dans laquelle l’auteur du plugin/thème est entièrement responsable de cette opération - comme lors de la sauvegarde de paramètres personnalisés.

En ce qui concerne la portée de cette question, la validation des données au niveau du domaine ne m’inquiète pas: par exemple, vérifier que le champ Age d’un formulaire est compris entre 0 et 120, ou qu’une adresse électronique est valide. La sécurité me préoccupe uniquement - par exemple, éviter les 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 générées dans des modèles HTML pour éviter XSS.

Pour la désinfection de sortie, je sais que vous devez toujours utiliser des fonctions telles que esc_html() et esc_attr() lors de l’ajout de variables dans des modèles HTML. Mais qu'en est-il de l'utilisation de templates tags ? Est-ce qu'ils ont tous déjà désinfecté la sortie? Si oui, pour quel contexte (HTML général, attributs de balises, etc.)? Certaines fonctions ont des variantes pour différents contextes (comme the_title_attribute(), mais la plupart n’en ont pas.

Pour la désinfection des entrées, je sais que je dois utiliser $wpdb->prepare() lorsque je pose des requêtes manuellement, mais qu’en est-il de l’utilisation de l’API de configuration pour créer une page de paramètres de plug-in ou de l’enregistrement des métadonnées de publication pour un type de publication personnalisé?

Pour le moment, je viens de fouiller dans le Core et de lire des tutoriels chaque fois que j'utilise une fonction pour savoir si elle désinfecte ou non, mais cela prend du temps et génère des erreurs. J'espère trouver une sorte de liste complète de toutes les situations possibles et savoir si l'API le gère ou non. par exemple.,

API valide/assainit

  • Enregistrement de méta de poste avec update_postmeta()
  • Enregistrement de méta utilisateur avec update_user_meta()
  • Sortie du titre d'un article - utilisez la variante de the_title() appropriée au contexte
  • etc

Vous devez valider/assainir manuellement

  • Enregistrement des options de plug-in avec l'API Settings. Passez un rappel en tant que 3ème paramètre de register_setting().
  • Requêtes directes dans la base de données: encapsulez la requête dans $wpdb->prepare().
  • Sortie de variables en HTML. Utilisez 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 détaillée.

16
Ian Dunn

Pas sûr que ce soit si complet, mais avec n'importe quel plugin ou thème, l'entrée de l'utilisateur devrait être désinfecté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 bonne 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 entrées.

Si j'étais trop vague, posez une question plus précise.

0
Ciprian