web-dev-qa-db-fra.com

Quelles sont les meilleures pratiques de sécurité pour les plugins et les thèmes WordPress?

Comme suggéré dans cette question , j'ajoute ce sujet en tant que nouvelle question, destinée à la discussion/au vote de la communauté concernant les meilleures pratiques en matière de sécurité des plugins/thèmes.

Voici la liste de contrôle de départ, basée sur la liste de contrôle de sécurité des paramètres/données actuelle (en cours de préparation) utilisée pour examiner les thèmes (les principes ne doivent pas être différents pour les plug-ins, mais pour les thèmes).

Si vous souhaitez consulter un thème avec une page de paramètres de thème sécurisée et solidement codée, consultez ce thème:
http://wordpress.org/extend/themes/coraline

21
Chip Bennett

Utiliser des nonces (lorsque vous n'utilisez pas l'API Settings)

Les plugins et les thèmes doivent explicitement fournir la vérification nonce de la page Settings, si vous n'utilisez pas l'API Settings:

13
Chip Bennett

Assainir, valider et échapper des données

Désinfectez tout ce qui pourrait entrer et sortir de (!) La base de données à la fois en amont et en aval!

Les plugins et les thèmes doivent effectuer la validation des données appropriée:

  1. Valider et désinfecter toutes les données non fiables avant de saisir des données dans la base de données
  2. Escape toutes les données non fiables avant d'être affichées dans les champs du formulaire Paramètres
  3. Escape toutes les données non fiables avant d'être affichées dans les fichiers de modèle de thème

Les plugins et les thèmes doivent utiliser esc_attr() pour les saisies de texte et esc_html() ou esc_textarea() pour les zones de texte.

Également disponible à partir de l'API WordPress: esc_url(), esc_url_raw(), esc_js() et wp_filter_kses().

Mauvais exemple:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Bon exemple:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Voici une superbe vidéo de Mark Jaquith expliquant l'utilisation des fonctions d'échappement:

12
Chip Bennett

Utilisez $wpdb->prepare

Lors de la création de requêtes personnalisées via l'objet $wpdb, utilisez toujours $wpdb->prepare pour renseigner des espaces réservés avec des valeurs plutôt que d'écrire les requêtes avec des données mélangées avec du code SQL, car les fonctions de la famille mysql_* ont été mal enseignées à tout le monde.

9
Matteo Riva

Utilisez uniquement $ _GET/$ _POST/$ _REQUEST avec précaution et lorsque de meilleures API ne sont pas disponibles.

Les plugins et les thèmes doivent utiliser l’API de configuration pour obtenir et enregistrer des données d’entrée de formulaire plutôt que de s’appuyer directement sur les données $_POST et $_REQUEST.

9
Chip Bennett

Faites attention avec les fonctions PHP pouvant être utilisées pour exécuter du code malveillant

Une bonne lecture pour tous ceux qui écrivent PHP: Exploitable PHP fonctions sur StackOverflow.

Utiliser API de modification de thème

Les thèmes doivent utiliser set_theme_mod() et les fonctions associées not un schéma de noms inventé par eux-mêmes.
L'API theme_mod est une couche spécialisée pour l'API de paramètres. il garantit des noms uniques, insère toutes les options dans one array et est, d'après mon expérience, beaucoup plus facile à gérer. De plus, il propose des filtres standardisés pour les plugins, ce qui est bon pour l'interopérabilité.

Éviter activé register_globals

Ne comptez pas sur register_globals = on. Un Pro Theme que mon dernier client a acheté fait exactement cela. Je pourrais pirater n'importe quel site utilisant ce thème en 5 minutes…
ThimbThumb a fait cela aussi (et le fait toujours?).

Ne créez pas de fichiers avec des autorisations d'accès étendues inutiles

Ne créez pas de fichiers avec des autorisations d'accès trop libérées.

Utilisez SSL si disponible

Pointez vos Partager sur Twitter/Facebook/Anything liens vers l'URI HTTPS, le cas échéant. La sécurité de votre lecteur est également importante.

8
fuxia

Enregistrer les données dans un seul tableau

Les plugins et les thèmes doivent enregistrer les options dans un seul tableau, plutôt que de créer plusieurs options pour la page des paramètres. L'utilisation de l'API Settings permettrait de gérer cela.

7
Chip Bennett

Vérifier la capacité appropriée lors de l'ajout et de la sortie de pages de paramètres

Les plugins doivent utiliser une capacité appropriée (par exemple, manage_options) pour pouvoir ajouter la page des paramètres.

Les thèmes doivent utiliser edit_theme_options en tant que capacité pour ajouter la page de paramètres.

6
Chip Bennett

Utiliser des tutoriels et des informations à jour

Les plug-ins et les thèmes doivent à la fois implémenter les pages Options et Paramètres délibérément et not s'appuyer sur des tutoriels de site Web copiés et collés qui sont obsolètes et qui n'incluent pas une sécurité des données appropriée, telle que celles énumérées ci-dessous.

Exemples de ce que ne pas faire :

5
Chip Bennett

Utiliser les paramètres de l'API

Les plugins et les thèmes doivent utiliser l'API Settings, qui est plus facile à utiliser, plus sécurisée et prend en charge une grande partie du travail acharné des pages de paramètres:

Pour de bons tutoriels sur l’utilisation de l’API de paramètres, voir:

4
Chip Bennett

Utilisez wp_safe_redirect () au lieu d’appeler directement la fonction header () de php lors du passage à une page du même domaine.

1
mfields

Fonction de préfixe et noms de variable

Les plugins doivent préfixer plugin-slug dans toutes les options, fonctions personnalisées, variables personnalisées et constantes personnalisées.

Les thèmes doivent préfixer theme-slug dans toutes les options, les fonctions personnalisées, les variables personnalisées et les constantes personnalisées.

1
Chip Bennett

Pour les cases à cocher et les options sélectionnées, les plug-ins et les thèmes doivent utiliser les fonctions checked() et selected() pour générer checked="checked" et selected="selected", respectivement.

1
Chip Bennett

Ajouter des pages de paramètres aux sections appropriées du menu administrateur

Les plug-in doivent utiliser la fonction add_options_page() pour ajouter la page des paramètres du plug-in au menu Settings, plutôt que d'utiliser add_menu_page() pour ajouter un menu de niveau supérieur.

Les thèmes doivent utiliser la fonction add_theme_page() pour ajouter la page des paramètres de thème au menu Appearance, plutôt que d'utiliser add_menu_page() pour ajouter un menu de niveau supérieur.

0
Chip Bennett