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. Je suis tombé sur quelques ressources, notamment la page du codex intitulée Validation des données, bien qu'aucune ne m'ait été utile. La page du 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 title ou post thumnails src ou des codes plus élaborés qui gèrent 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
En outre, la désinfection doit-elle être effectuée différemment lors de l'écho de HTML dans PHP par rapport à PHP inline 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 permettent d'atteindre la même chose. Mais ont-ils besoin d'être santized différemment?
Cette page de codex explique cela assez bien, je pense.
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é et si ce caractère est suivi de onclick="do_something();"
, la situation pourrait s'aggraver :)
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 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'];
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 plugins du référentiel WP.org est de lui transmettre (et mal préparée) une requête déjà 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 dans PHP par rapport à PHP inline de HTML?
Les deux déclarations ci-dessus permettent d'atteindre la même chose. Mais ont-ils besoin d'être santized différemment?
Non.
Cette vidéo de Mark Jaquith m'a tout clarifié. http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/