Désinfection des données: meilleures pratiques avec des exemples de code

13

J'essaie de comprendre la désinfection des données (pas la validation des données) pour m'aider à écrire des thèmes sécurisés pour WordPress. J'ai fait des recherches sur Internet en essayant de trouver un guide complet pour les développeurs de thèmes détaillant les meilleures pratiques. J'ai découvert quelques ressources, dont la page du codex intitulée Validation des données, bien qu'aucune ne m'ait été utile. La page de codex répertorie les fonctions de désinfection disponibles, leur utilisation et leurs tâches, sans toutefois 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 donner des exemples de code incorrect / non normalisé et de la manière dont il devrait être réécrit pour une désinfection appropriée. Il peut s’agir d’un code général permettant de supprimer post-titre ou post-libellé src ou des codes plus élaborés traitant de la suppression des données $_POST pour les requêtes Ajax.

De plus, j'aimerais savoir si les fonctions WordPress permettant d'ajouter / de 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, existe-t-il des exceptions lorsque vous souhaitez prendre des mesures supplémentaires pour nettoyer 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

De plus, la désinfection doit-elle être effectuée différemment lors de l'écho de HTML en PHP par rapport à PHP inline de HTML? Pour être plus clair sur ce que je vous 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 permettent d'obtenir la même chose. Mais doivent-ils être désinfectés différemment?

    
posée John 11.04.2012 - 18:06

2 réponses

12

Cette page du codex l'explique assez bien à mon avis.

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

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

Si $author_name contient un caractère " , votre attribut est fermé. Si ce caractère est suivi de onclick="do_something();" , cela pourrait empirer:)

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

Il existe 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 méta * fonctions que vous avez énumérées s'occupent déjà de la désinfection de l'entrée pour le stockage de la base de données, vous n'avez donc pas à vous en préoccuper.

La méthode wpdb->prepare() doit être utilisée lorsque vous effectuez vous-même les requêtes de base de données. 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 %s et %d seront remplacés par vos valeurs désinfectées $ _POST.

Une erreur très courante que je constate dans de nombreux plug-ins du référentiel WP.org est de lui transmettre (et mal préparée) une requête déjà préparée, telle que:

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

Ne faites pas ceci:)

  

De plus, la désinfection doit-elle être effectuée différemment lors de l'écho en HTML   en PHP contre PHP en ligne de HTML?

     

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

Non.

    
réponse donnée onetrickpony 11.04.2012 - 18:51
4

Cette vidéo de Mark Jaquith m'a tout clarifié. enlace

    
réponse donnée byronyasgur 18.06.2012 - 22:16

Lire d'autres questions sur les étiquettes