Purification des données: meilleures pratiques avec des exemples de code


15

J'essaie de comprendre le nettoyage des données (pas la validation des données) pour m'aider à écrire des thèmes sécurisés pour WordPress. J'ai cherché sur Internet en essayant de trouver un guide complet pour les développeurs de thèmes détaillant les meilleures pratiques. J'ai rencontré quelques ressources, notamment la page du codex intitulée Data Validation, bien qu'aucune ne m'ait été utile. La page du codex répertorie les fonctions de désinfection disponibles, leur utilisation et ce qu'elles font, mais ne parvient pas à expliquer pourquoi vous utiliseriez l'une sur l'autre ou dans quelle situation utiliseriez-vous une fonction de désinfection particulière. Le but de cet article est de demander à tout le monde de fournir des exemples de code incorrect / non désinfecté et comment il doit être réécrit pour une désinfection appropriée. Il peut s'agir d'un code général pour assainir le titre de l'article ou des articles src ou de codes plus élaborés qui gèrent l'assainissement de$_POST données pour les requêtes Ajax.

De plus, je voudrais savoir si les fonctions WordPress pour ajouter / mettre à jour la base de données (par exemple celles mentionnées dans le bloc de code ci-dessous) prennent automatiquement en charge le travail de désinfection pour vous? Si oui, y a-t-il des exceptions lorsque vous prendriez des mesures supplémentaires pour désinfecter les données envoyées à ces fonctions WordPress?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

En outre, la désinfection doit-elle être effectuée différemment lors de l'écho de HTML en PHP par rapport à PHP en ligne de HTML? Pour être plus clair sur ce que je demande, voici le code:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

Les deux déclarations ci-dessus réalisent la même chose. Mais doivent-ils être santisés différemment?


1
Cela pourrait aider si nous savions ce que vous essayez de désinfecter. Les thèmes sont destinés à la présentation des données ... il vous suffit de nettoyer les données que l'utilisateur vous soumet, et les soumissions sont généralement traitées par des plugins.
EAMann

@EAMann Les fonctions d'échappement comme esc_attr, esc_html, etc. sont conçues pour échapper à la sortie. Corrigez-moi si je me trompe. La présentation de données signifie que vous générez des données, donc l'échappement est également nécessaire dans les thèmes. Sinon, les fonctions esc n'auraient pas été nécessaires. Je veux comprendre l'assainissement dans les thèmes WordPress dans son ensemble et non limité à l'assainissement d'un ou deux fragments de code.
John

"La présentation de données signifie que vous produisez des données, donc l'échappement est également nécessaire dans les thèmes" - non. Encore une fois, vous n'avez qu'à échapper des données
auxquelles

@OneTrickPony Ça devient plus clair pour moi. Juste pour être absolument sûr que je comprends cela - j'échapperais au contenu des commentaires mais je n'échapperais pas à l'ID de commentaire ou à l'ID de publication, si je les exportais en HTML. Désolé, pour vous déranger avec des questions l'une après l'autre.
John

2
"Il suffit d'échapper aux données auxquelles vous ne faites pas confiance" - je suis tout à fait d'accord. La seule chose que j'ajouterais, c'est que vous ne devriez jamais faire confiance aux données;)
Ian Dunn

Réponses:


12

Cette page du codex l' explique assez bien je pense.

La fonction la plus importante et la plus utilisée est probablement esc_attr. Prenez cet exemple:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

Si $author_namecontient un "caractère, vous fermez votre attribut, et si ce caractère est suivi, onclick="do_something();"il pourrait empirer :)

Faire print esc_attr($author_name)garantit que ces caractères sont encodés et le navigateur ne fait pas ce qu'il n'est pas censé faire.

Il y a un cas où vous n'en avez pas besoin: lorsque vous attendez un nombre, auquel cas vous pouvez simplement convertir les données d'entrée en entier, par exemple:

print (int)$_POST['some_number'];


Les fonctions méta * que vous avez répertoriées ici prennent déjà soin de nettoyer l'entrée pour le stockage de la base de données, vous n'avez donc pas à vous en soucier.

La wpdb->prepare()méthode doit être utilisée lorsque vous effectuez vous-même les requêtes DB. Voici un exemple:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

Les mots clés %set %dseront remplacés par vos valeurs $ _POST nettoyées.

Une erreur très courante que je vois dans de nombreux plugins dans le référentiel WP.org est de lui passer une requête déjà préparée (et mal préparée), comme:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

Ne fais pas ça :)

En outre, la désinfection doit-elle être effectuée différemment lors de l'écho de HTML en PHP par rapport à PHP en ligne de HTML?

Les deux déclarations ci-dessus réalisent la même chose. Mais doivent-ils être santisés différemment?

Non.


Thx pour vos entrées. Votre explication rend les choses plus claires pour moi.
John

Une petite clarification est en outre nécessaire. Si je passe une chaîne dans un var (par exemple $ var = 'string';) dans PHP et l'écho en tant qu'attribut HTML, dois-je désinfecter $ var lors de l'écho. Ou la désinfection n'est requise que si j'avais extrait la valeur de $ var de la base de données.
John

En faisant écho à l'écran, d'une manière ou d'une autre
onetrickpony

Donc, si je vous ai bien compris, que je passe la chaîne dans $ var dans le code PHP ou que j'extraye des données de la base de données et que je passe dans $ var, les deux nécessitent que j'échappe la sortie. Correct?
John

Oui, si ces données sont entrées par l'utilisateur, comme par exemple le nom de l'auteur d'un commentaire. Si par "passé la chaîne dans $ var dans le code PHP" vous voulez dire que vous avez assigné une valeur que vous connaissez à une variable, alors évidemment - non, vous n'avez pas besoin de
nettoyer

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.