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


17

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.


J'aime cette question. J'ai la même pensée que toi. Je pense que s'il y a une telle liste de quand nous devons valider / désinfecter manuellement, ce serait formidable. +1.
Anh Tran

1
@Rilwis, veuillez voir ma réponse. Vous devez toujours valider. L'assainissement est plus délicat, car «sûr» dépend du contexte. Généralement, si vous utilisez l'API WordPress avec des données connues de WordPress ( 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.
Stephen Harris

@StephenHarris: J'ai lu votre commentaire. Je le sais aussi. Mais j'ai la même opinion que Ian Dunn. Je pense que la principale raison pour laquelle il demande est "en faire assez, ni plus ni moins".
Anh Tran

1
En fait, cela ne me dérange pas de pécher par excès de prudence et de faire trop de validation / hygiène, mais je pense qu'il y a des cas où s'échapper deux fois peut être un problème.
Ian Dunn

Réponses:


15

Il y a deux concepts ici:

  • validation - s'assurer que les données sont valides , c'est-à-dire qu'un entier est un entier, une date est une date (dans le bon format, etc.). Cela doit être fait juste avant d'enregistrer les données.
  • aseptisation - sécurisation de la date pour son utilisation dans le contexte actuel (par exemple, échapper aux requêtes SQL ou échapper le HTML en sortie).

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_posthook avant de l'enregistrer dans la base de données avec update_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 sait next_posts()est supposé imprimer une URL sur la page, cela s'applique esc_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 $wpdbclasse 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.


Salut Stephan, merci pour l'explication. Cela m'a aidé à mieux le comprendre, mais ce que je recherche vraiment, c'est une sorte de liste complète, comme l'exemple que j'ai donné. Il semble que votre approche consiste à faire une supposition éclairée si WP le gère ou non, ou à pécher par excès de prudence et à toujours désinfecter. Je me sentirais plus en confiance si j'avais une liste complète et faisant autorité, plutôt que de compter sur ma compréhension de celle-ci. Je crains également que la double évasion puisse entraîner des problèmes.
Ian Dunn

J'ai également mis à jour la question pour clarifier certaines choses.
Ian Dunn

0

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.


3
Je comprends qu'il doit toujours être nettoyé, mais la question est de savoir qui fait la désinfection dans chaque situation particulière. Parfois, WordPress le fait automatiquement, et parfois vous devez le faire manuellement. J'ai mis à jour la question pour essayer de la rendre plus claire.
Ian Dunn

Même lorsque vous utilisez update_user_meta (), vous devez toujours le valider, car les valeurs mises à jour peuvent provenir d'un formulaire exposé ou de l'entrée d'un utilisateur. S'il s'agit d'une valeur provenant d'un script, telle qu'une décision interne, d'une boucle if / else, vous ne devez pas la désinfecter.
Ciprian

1
La valeur que vous passez à update_user_meta()se passer à travers stripslashes_deep()et sanitize_meta()dans update_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?
Ian Dunn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.